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.