What is JdbcDaoSupport used for? What is JdbcDaoSupport used for? spring spring

What is JdbcDaoSupport used for?


According to these answers:

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.