spring - JdbcDaoSupport 是做什么用的?

标签 spring spring-jdbc

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

最佳答案

根据这些答案:

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

我的建议 - 在每个数据源的 XML/类配置中创建模板并重用/注入(inject)它们,因为根据文档,模板是线程安全的:

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.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

关于spring - JdbcDaoSupport 是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21519940/

相关文章:

postgresql - 如何使用 rowtype 数组作为 Java 参数调用 PostgreSQL 函数

java - 不在事务中时回滚 Spring JDBC 操作

java - 如何使用 Spring 的 JdbcTemplate 连接一个简单的 MySql 数据库?

带有嵌入式或独立tomcat的Java docker容器?

spring - @enabler2dbcrepositories 无法找到我的存储库

spring - 当从 SimpleMappingExceptionResolver 映射异常时,拦截器中的 ModelAndView 为 null

spring - spring jdbc 入站适配器的动态选择查询

mysql - 如何将对象列表(DTO)作为单个 IN 参数传递给存储过程

java - 使用 knockout.js 和 Spring MVC/JSP 的初始状态

spring - Primefaces 文件上传仅适用于要上传的第一个文件