JdbcTemplate详解 - 2

简介:
1、由于之前JdbcTemplate的程序需要编写一堆的RowMapper的映射文件,显得有些臃肿,最好是根据pojo类和字段的名称进行自动的对应, 所以 SimpleJdbcTemplate支持使用Pojo中的属性进行自动赋值, 语法为':'开头。
public  class UserDaoSpringImpl  implements UserDao {
   private SimpleJdbcTemplate simpleJdbcTemplate =  new SimpleJdbcTemplate(
      JdbcUtils.getDataSource());

   public  void addUser(User user) {
    String sql =  "insert into user (name, money, birthday) values (:name, :money, :birthday)";
    SqlParameterSource param =  new BeanPropertySqlParameterSource(user);
    KeyHolder keyHolder =  new GeneratedKeyHolder();
     this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
        param, keyHolder);
    user.setId(keyHolder.getKey().intValue());
  }

   public  void delete(User user) {
    String sql =  "delete from user where id=?";
     this.simpleJdbcTemplate.update(sql, user.getId());
  }

   public User findUser(String loginName, String password) {
    String sql =  "select id, name, money, birthday    from user where name=?";
     return  this.simpleJdbcTemplate.queryForObject(sql,
        ParameterizedBeanPropertyRowMapper.newInstance(User. class),
        loginName);
  }

   public User getUser( int userId) {
    String sql =  "select id, name, money, birthday    from user where id=?";
     return  this.simpleJdbcTemplate.queryForObject(sql,
        ParameterizedBeanPropertyRowMapper.newInstance(User. class),
        userId);
  }

   public  void update(User user) {
    String sql =  "update user set name=?, birthday=?, money=? where id=? ";
     this.simpleJdbcTemplate.update(sql, user.getName(), user.getBirthday(),
        user.getMoney(), user.getId());

    sql =  "update user set name=:name, birthday=:birthday, money=:money where id=:id ";
     this.simpleJdbcTemplate.update(sql,  new BeanPropertySqlParameterSource(
        user));
  }

}
其中使用的 JdbcUtils获取数据源的代码如下:
public  final  class JdbcUtils {
   private  static String url =  "jdbc:mysql://localhost:3306/jdbc";
  private static String user = "root";
  private static String password = "";
  private static DataSource myDataSource = null;

  private JdbcUtils() {
  }

  static {
    try {
      Class.forName("com.mysql.jdbc.Driver");
      // myDataSource = new MyDataSource2();
      Properties prop = new Properties();
      // prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
      // prop.setProperty("user", "user");

      InputStream is = JdbcUtils.class.getClassLoader()
          .getResourceAsStream("dbcpconfig.properties");
      prop.load(is);
      myDataSource = BasicDataSourceFactory.createDataSource(prop);
    } catch (Exception e) {
      throw new ExceptionInInitializerError(e);
    }
  }

  public static DataSource getDataSource() {
    return myDataSource;
  }

  public static Connection getConnection() throws SQLException {
    // return DriverManager.getConnection(url, user, password);
    return myDataSource.getConnection();
  }

  public static void free(ResultSet rs, Statement st, Connection conn) {
    try {
      if (rs != null)
        rs.close();
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        if (st != null)
          st.close();
      } catch (SQLException e) {
        e.printStackTrace();
      } finally {
        if (conn != null)
          try {
            conn.close();
            // myDataSource.free(conn);
          } catch (Exception e) {
            e.printStackTrace();
          }
      }
    }
  }
}

2、 完成相同映射的类还包括:NamedParameterJdbcTemplate, 它将之前的占位符‘?’进行了取名,方便程序的阅读。 不过这样的SQL不能再数据库中直接执行,需要有Spring进行转换。

public  class NamedJdbcTemplate {
   static NamedParameterJdbcTemplate named =  new NamedParameterJdbcTemplate(
      JdbcUtils.getDataSource());

   /**
    * @param args
    */

   public  static  void main(String[] args) {
    User user =  new User();
    user.setMoney(10);
    user.setId(2);
    System.out.println(findUser1(user));
  }

   static  void addUser(User user) {
    String sql =  "insert into user(name,birthday, money) values (:name,:birthday,:money) ";
    SqlParameterSource ps =  new BeanPropertySqlParameterSource(user);
     KeyHolder keyHolder =  new  GeneratedKeyHolder();
    named.update(sql, ps, keyHolder);
     int id = keyHolder.getKey().intValue();
    user.setId(id);
    
    Map map = keyHolder.getKeys();
  }

   static User findUser(User user) {
    String sql =  "select id, name, money, birthday    from user "
        +  "where money > :m and id < :id";
    Map params =  new HashMap();
     // params.put("n", user.getName());
    params.put( "m", user.getMoney());
    params.put( "id", user.getId());
    Object u = named.queryForObject(sql, params,  new BeanPropertyRowMapper(
        User. class));
     return (User) u;
  }

   static User findUser1(User user) {
    String sql =  "select id, name, money, birthday    from user "
        +  "where money > :money and id < :id";
    SqlParameterSource ps =  new  BeanPropertySqlParameterSource(user);
    Object u = named.queryForObject(sql, ps,  new BeanPropertyRowMapper(User. class));
     return (User) u;
  }

}
【注意】
1、BeanPropertyRowMapper完成了对象到数据库字段的映射关系, 可以不再使用RowMapper来一一对应起来。如果RowMapper只使用1次,则可以直接使用内部类来完成,而不再需要专门的写一个类。
2、 KeyHolder, 其中保存了数据库中操作的主键,取得操作的主键后, 方便对进行操作的记录进行其他动作。
 
总之:利用反射技术,减少的了不必要的rowmapper,提高了效率
 

本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/375823,如需转载请自行联系原作者
相关文章
|
9月前
|
SQL 数据库
四、JdbcTemplate2
四、JdbcTemplate2
28 1
|
4天前
|
Java 数据库连接 数据库
Spring之JdbcTemplate(带你一篇文章搞定JdbcTemplate)
Spring之JdbcTemplate(带你一篇文章搞定JdbcTemplate)
|
9月前
|
SQL XML Java
四、JdbcTemplate1
四、JdbcTemplate1
48 1
|
9月前
|
Java Spring
Spring JdbcTemplate(下)
Spring JdbcTemplate(下)
58 0
|
Java 数据库连接 数据库
|
存储 SQL 缓存
JPA 之 Hibernate EntityManager 专题
JPA 之 Hibernate EntityManager 专题
580 0
JPA 之 Hibernate EntityManager 专题
|
druid Java 数据库连接
数据库连接池和JDBCTemplate介绍
数据库连接池和JDBCTemplate介绍
244 0
|
消息中间件 前端开发 NoSQL
SpringMVC(三、JDBCTemplate)
Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作。 Spring MVC 的拦截器(interceptor)类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
166 0
SpringMVC(三、JDBCTemplate)
|
SQL 数据格式 关系型数据库