What is JdbcDaoSupport used for?

According to these answers:

  • Proper way to inject parent class dependencies with Spring annotations
  • spring3-annotation-JdbcDaoSupport
  • NamedParameterJdbcDaoSupport datasource autowire?

JdbcDaoSupport, NamedParameterJdbcDaoSupport, SimpleJdbcDaoSupport are unnecessary and are mental dust. They doesn't save any line of code because you need to inject data-source or template into.

What I recommend - to create templates in XML/class config per data source and reuse/inject them as templates are thread safe according to docs:

Once configured, a JdbcTemplate instance is threadsafe. You may want multiple JdbcTemplate instances if your application accesses multiple databases, which requires multiple DataSources, and subsequently multiple differently configured JdbcTemplates.

Compare applicationContext.xml:

<bean id="dataSource"
      class="org.apache.commons.dbcp.BasicDataSource"
      destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" 
      class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

and YourDaoImpl.java:

public class YourDaoImpl implements YourDao {

    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;

    @Override
    public int tableExists(String table) {
        String sql = "select count(*) from all_tables"
                + "  where table_name = :tbl";
        return jdbcTemplate.queryForObject(
                    sql, new MapSqlParameterSource("tbl", table), Integer.class);
    }
}

with JdbcDaoSupport.java:

public class YourDaoImpl extends NamedParameterJdbcDaoSupport implements YourDao {

   @Autowired
    public void setDs(DataSource dataSource) {
        setDataSource(dataSource);
    }

    @Override
    public int tableExists(String table) {
        String sql = "select count(*) from all_tables"
                + "  where table_name = :tbl";
        return getNamedParameterJdbcTemplate()
               .queryForObject(
                       sql,
                       new MapSqlParameterSource("tbl", table), Integer.class);
    }

}

UPDATE Official statement about stateless (and so thread safety) of JdbcTemplate/NamedParameterJdbcTemplate here https://jira.springsource.org/browse/SPR-11478


First lets point out the API specifies this class as a convenience class ("support"). I believe JdbcDaoSupport supports, aka provides you with, a base implementation of the DAO design for jdbc whereas a template class (see template pattern) will give you a singleton that is used to inject into your DAO classes.

In my experience I haven't found a reason to couple my DAO to a *Support class. I instead create my specific jdbcTemplate beans and inject them into my DAO classes favoring composition over inheritence -- generally a good object-oriented practice.

From the Spring docs, "You can choose whether to inherit from this class. The JdbcDaoSupport class is provided as a convenience only.".

As Spring states, JdbcDaoSupport is a convenience only. They say nothing about its advantages over using one of the template implementations.