JdbcDaoSupport 是做啥用的?
Posted
技术标签:
【中文标题】JdbcDaoSupport 是做啥用的?【英文标题】:What is JdbcDaoSupport used for?JdbcDaoSupport 是做什么用的? 【发布时间】:2014-02-26 12:01:42 【问题描述】:在Spring中,当我们插入数据库时,我们可以使用JdbcDaoSupport
,也可以不使用。我的问题是,使用它有什么好处,我们应该在什么情况下使用它?
【问题讨论】:
【参考方案1】:根据这些答案:
Proper way to inject parent class dependencies with Spring annotations spring3-annotation-JdbcDaoSupport NamedParameterJdbcDaoSupport datasource autowire?JdbcDaoSupport、NamedParameterJdbcDaoSupport、SimpleJdbcDaoSupport是不必要的,是精神上的灰尘。它们不会保存任何代码行,因为您需要将数据源或模板注入其中。
我的建议 - 在每个数据源的 XML/类配置中创建模板并重用/注入它们,因为根据文档,模板是线程安全的:
配置后,JdbcTemplate 实例是线程安全的。如果您的应用程序访问多个数据库,这需要多个 DataSource,并且随后需要多个不同配置的 JdbcTemplate,您可能需要多个 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);
更新关于JdbcTemplate
/NamedParameterJdbcTemplate
这里https://jira.springsource.org/browse/SPR-11478的无状态(以及线程安全)的官方声明
【讨论】:
【参考方案2】:首先让我们指出API 将此类指定为便利类(“支持”)。我相信 JdbcDaoSupport 支持(也就是为您提供)用于 jdbc 的 DAO design 的基本实现,而模板类(参见 template pattern)将为您提供用于注入 DAO 类的 singleton。
根据我的经验,我还没有找到将我的 DAO 与 *Support 课程相结合的理由。相反,我创建了我的特定 jdbcTemplate bean 并将它们注入到我的 DAO 类中,这些类有利于组合而不是继承——通常是一种很好的面向对象的做法。
来自Spring docs,“您可以选择是否从该类继承。提供JdbcDaoSupport 类只是为了方便。”。
正如 Spring 所说,JdbcDaoSupport 只是一种便利。他们没有提到它比使用其中一种模板实现的优势。
【讨论】:
以上是关于JdbcDaoSupport 是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章
maven.multiModuleProjectDirectory 是做啥用的?
cursor.setNotificationUri() 是做啥用的?