【问题标题】:What is JdbcDaoSupport used for?JdbcDaoSupport 是做什么用的?
【发布时间】:2014-02-26 12:01:42
【问题描述】:

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

【问题讨论】:

    标签: spring spring-jdbc


    【解决方案1】:

    根据这些答案:

    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 只是一种便利。他们没有提到它比使用其中一种模板实现的优势。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-29
        • 2011-08-24
        • 2023-04-03
        • 2014-03-04
        • 2012-05-19
        • 2011-10-25
        • 2015-07-17
        • 2014-02-26
        相关资源
        最近更新 更多