What is JdbcDaoSupport used for?

spring, spring-jdbc

Solution

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

Problem

In Spring, when we are inserting into the database, we can use `JdbcDaoSupport` or not. My question is, what are the advantages in using it and in which circumstances we should use it?

Original source

Related problems