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?

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

我的建议 - 在每个数据源的 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 与 *Su​​pport 课程相结合的理由。相反,我创建了我的特定 jdbcTemplate bean 并将它们注入到我的 DAO 类中,这些类有利于组合而不是继承——通常是一种很好的面向对象的做法。

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

正如 Spring 所说,JdbcDaoSupport 只是一种便利。他们没有提到它比使用其中一种模板实现的优势。

【讨论】:

以上是关于JdbcDaoSupport 是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

maven.multiModuleProjectDirectory 是做啥用的?

cursor.setNotificationUri() 是做啥用的?

EQ是做啥用的,它和压缩一样吗.如果不一样那压缩是做啥用的~

渠道是做啥用的?

MAKEWORD 是做啥用的?

SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做啥用的?