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?