【问题标题】:Spring - jdbcTemplate春天 - jdbcTemplate
【发布时间】:2011-11-28 08:48:49
【问题描述】:

我刚刚开始使用 Spring 框架。我也在使用 DBCP 池,但我仍然不确定如何正确使用 jdbcTemplate。

最佳实践是在多个 DAO 之间重用创建/注入的 jdbcTemplate 实例,或者为每个 DAO 创建 jdbcTemplate 是正确的?

我目前使用的是注解方式:

public class FooDAO  {

  private JdbcTemplate jdbcTemplate;

  @Autowired
  public void setDatasource( DataSource dataSource ) {
     this.jdbcTemplate = new JdbcTemplate( dataSource );
  }
}

我知道 JdbcDaoSupport,但我不知道如何注入数据源,因为方法 setDatasource 被标记为 final。

但是,我仍然不确定重用创建的 jdbcTemplate 是否是最佳实践。

【问题讨论】:

    标签: spring jdbctemplate


    【解决方案1】:
    try {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        String sql = "select user.id as id,user.roll_no as createdId,user.name as name,user.type as company,role.role as year "
                + "from user_role join user on  user.id=user_role.user_id "
                + "join role on role.id=user_role.role_id "
                + "where (user.status='ACTIVE' or user.status='ADMIN') AND user.username='" + userName + "'";
        UserVo userDetails = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<UserVo>(UserVo.class));
        or
        Long company = jdbcTemplate.queryForObject(sql, Long.class);
        or
        List<UserVo> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<UserVo>(UserVo.class));
        logger.info("Retrieve user details by username");
        return userDetails;
    } catch (Exception e) {
        logger.error("error in  getting UserDetails using UserName", e);
    }
    

    【讨论】:

      【解决方案2】:

      我知道 JdbcDaoSupport,但我不知道如何注入数据源,因为方法 setDatasource 被标记为 final。

      public class JdbcDaoSupportTest extends JdbcDaoSupport {
      
          public void insert() { 
              this.getJdbcTemplate().execute("insert into  tb_test1 values(1,'ycl','123')");
               System.out.println("complete...");
          }
      }
      

      spring 调用 set 方法,不管这个方法是不是 final 的。

      <bean id="jdbcDaoSupportTest" class="com.xxxxx.JdbcDaoSupportTest">
              <property name="dataSource" ref="dataSource" />
      </bean>
      

      然后在你的 JdbcDaoSupportTest 中,你可以调用 this.getJdbcTemplate() 来获取 JdbcTemplate 任何运算符。

      【讨论】:

        【解决方案3】:

        注入并分享。不要叫“新”;这将控制权从 Spring bean 工厂手中夺走。

        【讨论】:

        • 首先,感谢您的回复,但我不确定我是否理解您的建议。我的 DAO 被标记为 @Service,所以它们在 spring 中被作为 bean 管理。我的 DAO 被注入到服务中。我理解,重用 jdbcTemplate 是一个好方法。但我不确定是否有优雅的方式来做到这一点。也许 JdbcDaoSupport 类应该是那个解决方案。
        • 当然。关键是您应该让 Spring 为您提供该数据源;不要称“新”并自己创建它。
        • 欢迎您的感谢,但本网站为您提供了投票和接受有帮助的答案的更改。如果您发现这可以解决您的问题,请通过投票和接受来表示。
        • 好吧,现在我不确定我是否理解你。 DataSource 由 Spring 提供,我没有创建新的。在每个 DAO 示例中,设置器“setDatasource(DataSource dataSource)”和“this.jdbcTemplate = new JdbcTemplate(dataSource)”。但是,如果 jdbcTemplate 共享好,如何在 DAO 之间共享这个实例。因为每个 DAO 都有 setDataSource 方法。
        猜你喜欢
        • 2011-09-23
        • 2020-10-13
        • 2016-05-25
        • 2014-08-22
        • 2013-11-02
        • 2014-03-13
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多