`

JdbcTemplate详解 - 2

    博客分类:
  • jdbc
阅读更多
JdbcTemplate详解 - 2

http://tianya23.blog.51cto.com/1081650/275292

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,提高了效率
分享到:
评论

相关推荐

    Spring--JdbcTemplate.pdf

    spring中使用JdbcTemplate操作数据库crud,一图详解(脑图)

    Spring JdbcTemplate方法详解

    JdbcTemplate主要提供以下五类方法;JdbcTemplate类支持的回调类;并附例子

    配置JdbcTemplate

    配置JdbcTemplate,源代码,配置详解

    Spring JdbcTemplate整合使用方法及原理详解

    主要介绍了Spring JdbcTemplate整合使用方法及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    springboot学习

    chapter3-2-1:使用JdbcTemplate chapter3-2-2:使用Spring-data-jpa简化数据访问层(推荐) chapter3-2-3:多数据源配置(一):JdbcTemplate chapter3-2-4:多数据源配置(二):Spring-data-jpa chapter3-2-5:...

    spring_JdbcTemplete使用详解

    Spring 对JDBC 的封装支持模板类操作,使JDBC的代码量精简,提高了开发效率。JdbcTemplate使用详解 JdbcTemplate使用详解

    Jdbctemplate多数据源配置方法详解

    主要介绍了Jdbctemplate多数据源配置方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JDBC Template基本使用方法详解

    主要介绍了JDBC Template基本使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    详解spring boot中使用JdbcTemplate

    JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans,下面给大家介绍spring boot中使用JdbcTemplate相关知识,一起...

    详解在spring中使用JdbcTemplate操作数据库的几种方式

    主要介绍了详解在spring中使用JdbcTemplate操作数据库的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)

    下面小编就为大家带来一篇基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    详解springboot采用多数据源对JdbcTemplate配置的方法

    在本篇文章中我们给大家详细分享了springboot采用多数据源对JdbcTemplate配置的方法,有需要的朋友们可以学习参考下。

    Android代码-spring-boot2-learning

    chapter2: 一起来学Spring Boot | 第二篇:Spring Boot配置详解 chapter3: 一起来学Spring Boot | 第四篇:整合Thymeleaf模板 chapter4: 一起来学Spring Boot | 第五篇:使用JdbcTemplate访问数据库 chapter5: ...

    spring boot 全面的样例代码

    - chapter3-2-1:[使用JdbcTemplate](http://blog.didispace.com/springbootdata1/) - chapter3-2-2:[使用Spring-data-jpa简化数据访问层(推荐)](http://blog.didispace.com/springbootdata2/) - chapter3-2-3:...

    Spring高级之注解驱动开发视频教程

    n 技术详解-切入点表达式详解 l Spring JDBC n 基础应用-JdbcTemplate的使用 n 源码分析-自定义JdbcTemplate n 设计模式-RowMapper的策略模式 n 高级应用-NamedParameterJdbcTemplate的使用 n 源码分析-...

    Spring中文帮助文档

    3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用...

    JAVA WEB学习课件及代码详解第二部分

    JAVA的J2EE WEB学习资料,其中包括了学习视频、讲义、笔记、以及练习代码等,适合刚接触JAVA同时需要搭建WEB平台的同学使用。...2、day06_JDBC连接池&JDBCTemplate 3、day07_HTML 4、day08_HTML&CSS

    SSM框架教程Spring+SpringMVC+MyBatis全覆盖_Java热门框架视频教程

    2、Spring配置文件及其相应API 3、Spring注解开发 4、Spring web环境及其Junit的集成 5、Spring JDBCTemplate的基本使用 6、Spring AOP的介绍及其配置使用 7、Spring的声明式事务控制 8、SpringMVC的介绍及其快速...

    springboot项目整合.zip

    第五篇:使用JdbcTemplate访问数据库] 第六篇:整合SpringDataJpa] 第七篇:整合Mybatis] 第八篇:通用Mapper与分页插件的集成] 第九篇:整合Lettuce Redis] 第十篇:使用Spring Cache集成Redis] 第十...

Global site tag (gtag.js) - Google Analytics