什么是JdbcDaoSupport用于?

时间:2014-02-03 04:55:19

标签: spring spring-jdbc

在Spring中,当我们插入数据库时​​,我们可以使用JdbcDaoSupport或不使用{{1}}。我的问题是,使用它有什么好处,在什么情况下我们应该使用它?

2 个答案:

答案 0 :(得分:25)

根据这些答案:

JdbcDaoSupport NamedParameterJdbcDaoSupport SimpleJdbcDaoSupport 是不必要的,并且是精神上的灰尘。它们不保存任何代码行,因为您需要将数据源或模板注入。

我建议 - 根据文档在每个数据源的XML /类配置中创建模板并将其重新/注入模板是线程安全的:

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.

比较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

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

的无状态(以及线程安全)的官方声明

答案 1 :(得分:8)

首先让我们指出API将此类指定为便捷类(“support”)。我相信JdbcDaoSupport支持(又称为jdbc提供DAO design的基本实现,而模板类(请参阅template pattern)将为您提供用于注入的singleton DAO课程。

根据我的经验,我没有找到将DAO连接到* Support类的理由。我改为创建我的特定jdbcTemplate bean并将它们注入到我的DAO类中,有利于组合而不是继承 - 通常是一种很好的面向对象的实践。

Spring docs,“您可以选择是否继承此类。仅提供JdbcDaoSupport类。”。

正如Spring所说, JdbcDaoSupport只是一种便利。他们对使用其中一个模板实现的优势一无所知。