在Spring中,当我们插入数据库时,可以使用JdbcDaoSupport
。我的问题是,使用它的好处是什么?在什么情况下应该使用它?
根据这些答案:
JdbcDaoSupport,NamedParameterJdbcDaoSupport,SimpleJdbcDaoSupport是不必要的,是精神上的尘埃。它们不保存任何代码行,因为您需要将数据源或模板注入其中。
我的建议-根据文档在XML / class config中为每个数据源创建模板并重新使用/注入它们,因为根据文档,模板是线程安全的。
一旦配置,JdbcTemplate实例是线程安全的。如果您的应用程序访问多个数据库(需要多个数据源,随后需要多个不同配置的JdbcTemplates),则可能需要多个JdbcTemplate实例。
比较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>
和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);
}
}
带有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关于JdbcTemplate
/ NamedParameterJdbcTemplate
的无状态(以及线程安全)的官方声明,此处为https://jira.springsource.org/browse/SPR-11478
[首先让我们指出API将此类指定为便利类(“支持”)。我相信JdbcDaoSupport支持,也为您提供了jdbc的DAO design的基本实现,而模板类(请参见template pattern)将为您提供一个singleton,用于注入您的DAO类。
[根据我的经验,我还没有找到将我的DAO与* Support类耦合的理由。相反,我创建了特定的jdbcTemplate bean,然后将它们注入我的DAO类中,从而更倾向于继承而不是继承-通常是一种好的面向对象的实践。
从Spring docs,“您可以选择是否从此类继承。仅提供JdbcDaoSupport类是为了方便。”
按照Spring的说法,[JdbcDaoSupport仅是为了方便]。他们没有说出它比使用模板实现之一的优势。