2

在 Spring 文档中,推荐使用 JdbcTemplate 的方法是为new您在其中使用它的每个类创建模板...

public class JdbcCorporateEventDao implements CorporateEventDao {

    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

}

我想知道,与在上下文中定义jdbctemplate为单例并直接将其注入Dao

 public class JdbcCorporateEventDao implements CorporateEventDao {
        @Autowired
        private JdbcTemplate jdbcTemplate;

        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }

    }
4

2 回答 2

4

来自 JdbcTemplate 的类级文档:

 * Can be used within a service implementation via direct instantiation
 * with a DataSource reference, or get prepared in an application context
 * and given to services as bean reference.

任何一个都可以。这里我有一个大型应用程序(50 个 DAO,100 个并发用户),整个应用程序有一个 jdbcTemplate 对象,在 spring 上下文中定义。这工作正常。

于 2013-07-02T02:49:49.860 回答
1

直接注入的一个缺点JdbcTemplate是,如果您需要/决定使用SQLExceptionTranslator.

如果您JdbcTemplate是单例,则SQLExceptionTranslator在任何类中设置 a 都会影响使用该模板的所有类。

例如...

public class JbdcUserDAO implements UserDAO{

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public JbdcUserDAO() {
        this.jdbcTemplate.setExceptionTranslator(new UserSQLExceptionTranslator());
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

}

public class JdbcCompanyDAO implements CompanyDAO{

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public JdbcCompanyDAO() {

    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}

SQLExceptions raised through JdbcCompanyDAO will also be run through UserSQLExceptionTranslator even though it looks like no translator is registered.

于 2014-03-19T16:08:43.997 回答