JdbcDaoSupport的作用是什么?

问题描述 投票:18回答:2

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

spring spring-jdbc
2个回答
26
投票

根据这些答案:

JdbcDaoSupportNamedParameterJdbcDaoSupportSimpleJdbcDaoSupport是不必要的,是精神上的尘埃。它们不保存任何代码行,因为您需要将数据源或模板注入其中。

我的建议-根据文档在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


8
投票

[首先让我们指出API将此类指定为便利类(“支持”)。我相信JdbcDaoSupport支持,也为您提供了jdbc的DAO design的基本实现,而模板类(请参见template pattern)将为您提供一个singleton,用于注入您的DAO类。

[根据我的经验,我还没有找到将我的DAO与* Support类耦合的理由。相反,我创建了特定的jdbcTemplate bean,然后将它们注入我的DAO类中,从而更倾向于继承而不是继承-通常是一种好的面向对象的实践。

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

按照Spring的说法,[JdbcDaoSupport仅是为了方便]。他们没有说出它比使用模板实现之一的优势。

© www.soinside.com 2019 - 2024. All rights reserved.