`
wusuoya
  • 浏览: 631004 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Spring--JdbcTemplate详解-2

    博客分类:
  • SSH
 
阅读更多

1、由于之前JdbcTemplate的程序需要编写一堆的RowMapper的映射文件,显得有些臃肿,最好是根据pojo类和字段的名称进行自动的对应, 所以SimpleJdbcTemplate支持使用Pojo中的属性进行自动赋值, 语法为':'开头。

Java代码  收藏代码
  1. public   class  UserDaoSpringImpl  implements  UserDao {  
  2.    private  SimpleJdbcTemplate simpleJdbcTemplate =  new  SimpleJdbcTemplate(  
  3.        JdbcUtils.getDataSource());  
  4.    
  5.   public   void  addUser(User user) {  
  6.      String sql = "insert into user (name, money, birthday) values (:name, :money, :birthday)" ;  
  7.      SqlParameterSource param = new  BeanPropertySqlParameterSource(user);  
  8.      KeyHolder keyHolder = new  GeneratedKeyHolder();  
  9.      this .simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,  
  10.          param, keyHolder);  
  11.      user.setId(keyHolder.getKey().intValue());  
  12.    }  
  13.    
  14.   public   void  delete(User user) {  
  15.      String sql = "delete from user where id=?" ;  
  16.      this .simpleJdbcTemplate.update(sql, user.getId());  
  17.    }  
  18.    
  19.   public  User findUser(String loginName, String password) {  
  20.      String sql = "select id, name, money, birthday    from user where name=?" ;  
  21.      return   this .simpleJdbcTemplate.queryForObject(sql,  
  22.          ParameterizedBeanPropertyRowMapper.newInstance(User.class ),  
  23.          loginName);  
  24.    }  
  25.    
  26.   public  User getUser( int  userId) {  
  27.      String sql = "select id, name, money, birthday    from user where id=?" ;  
  28.      return   this .simpleJdbcTemplate.queryForObject(sql,  
  29.          ParameterizedBeanPropertyRowMapper.newInstance(User.class ),  
  30.          userId);  
  31.    }  
  32.    
  33.   public   void  update(User user) {  
  34.      String sql = "update user set name=?, birthday=?, money=? where id=? " ;  
  35.      this .simpleJdbcTemplate.update(sql, user.getName(), user.getBirthday(),  
  36.          user.getMoney(), user.getId());  
  37.    
  38.     sql = "update user set name=:name, birthday=:birthday, money=:money where id=:id " ;  
  39.      this .simpleJdbcTemplate.update(sql,  new  BeanPropertySqlParameterSource(  
  40.          user));  
  41.    }  
  42.    
  43. }  


其中使用的JdbcUtils获取数据源的代码如下:

Java代码  收藏代码
  1. public   final   class  JdbcUtils {  
  2.    private   static  String url =  "jdbc:mysql://localhost:3306/jdbc" ;  
  3.    private   static  String user =  "root" ;  
  4.    private   static  String password =  "" ;  
  5.    private   static  DataSource myDataSource =  null ;  
  6.    
  7.   private  JdbcUtils() {  
  8.    }  
  9.    
  10.   static  {  
  11.      try  {  
  12.        Class.forName("com.mysql.jdbc.Driver" );  
  13.        // myDataSource = new MyDataSource2();   
  14.        Properties prop = new  Properties();  
  15.        // prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");   
  16.        // prop.setProperty("user", "user");   
  17.    
  18.       InputStream is = JdbcUtils.class .getClassLoader()  
  19.            .getResourceAsStream("dbcpconfig.properties" );  
  20.        prop.load(is);  
  21.        myDataSource = BasicDataSourceFactory.createDataSource(prop);  
  22.      } catch  (Exception e) {  
  23.        throw   new  ExceptionInInitializerError(e);  
  24.      }  
  25.    }  
  26.    
  27.   public   static  DataSource getDataSource() {  
  28.      return  myDataSource;  
  29.    }  
  30.    
  31.   public   static  Connection getConnection()  throws  SQLException {  
  32.      // return DriverManager.getConnection(url, user, password);   
  33.      return  myDataSource.getConnection();  
  34.    }  
  35.    
  36.   public   static   void  free(ResultSet rs, Statement st, Connection conn) {  
  37.      try  {  
  38.        if  (rs !=  null )  
  39.          rs.close();  
  40.      } catch  (SQLException e) {  
  41.        e.printStackTrace();  
  42.      } finally  {  
  43.        try  {  
  44.          if  (st !=  null )  
  45.            st.close();  
  46.        } catch  (SQLException e) {  
  47.          e.printStackTrace();  
  48.        } finally  {  
  49.          if  (conn !=  null )  
  50.            try  {  
  51.              conn.close();  
  52.              // myDataSource.free(conn);   
  53.            } catch  (Exception e) {  
  54.              e.printStackTrace();  
  55.            }  
  56.        }  
  57.      }  
  58.    }  
  59.  }  



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

Java代码  收藏代码
  1. public   class  NamedJdbcTemplate {  
  2.    static  NamedParameterJdbcTemplate named =  new  NamedParameterJdbcTemplate(  
  3.        JdbcUtils.getDataSource());  
  4.    
  5.   /**  
  6.      * @param args  
  7.      */   
  8.    public   static   void  main(String[] args) {  
  9.      User user = new  User();  
  10.      user.setMoney(10 );  
  11.      user.setId(2 );  
  12.      System.out.println(findUser1(user));  
  13.    }  
  14.    
  15.   static   void  addUser(User user) {  
  16.      String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) " ;  
  17.      SqlParameterSource ps = new  BeanPropertySqlParameterSource(user);  
  18.      KeyHolder keyHolder = new  GeneratedKeyHolder();  
  19.      named.update(sql, ps, keyHolder);  
  20.      int  id = keyHolder.getKey().intValue();  
  21.      user.setId(id);  
  22.        
  23.      Map map = keyHolder.getKeys();  
  24.    }  
  25.    
  26.   static  User findUser(User user) {  
  27.      String sql = "select id, name, money, birthday    from user "   
  28.          + "where money > :m and id < :id" ;  
  29.      Map params = new  HashMap();  
  30.      // params.put("n", user.getName());   
  31.      params.put("m" , user.getMoney());  
  32.      params.put("id" , user.getId());  
  33.      Object u = named.queryForObject(sql, params, new  BeanPropertyRowMapper(  
  34.          User.class ));  
  35.      return  (User) u;  
  36.    }  
  37.    
  38.   static  User findUser1(User user) {  
  39.      String sql = "select id, name, money, birthday    from user "   
  40.          + "where money > :money and id < :id" ;  
  41.      SqlParameterSource ps = new  BeanPropertySqlParameterSource(user);  
  42.      Object u = named.queryForObject(sql, ps, new  BeanPropertyRowMapper(User. class ));  
  43.      return  (User) u;  
  44.    }  
  45.    
  46. }  



【注意】

1、BeanPropertyRowMapper完成了对象到数据库字段的映射关系, 可以不再使用RowMapper来一一对应起来。如果RowMapper只使用1次,则可以直接使用内部类来完成,而不再需要专门的写一个类。

2、KeyHolder, 其中保存了数据库中操作的主键,取得操作的主键后, 方便对进行操作的记录进行其他动作。



总之:利用反射技术,减少的了不必要的rowmapper,提高了效率

分享到:
评论

相关推荐

    Spring--JdbcTemplate.pdf

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

    Android代码-spring-boot2-learning

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

    Spring JdbcTemplate方法详解

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

    Spring-Reference_zh_CN(Spring中文参考手册)

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的...

    spring boot 全面的样例代码

    - chapter9-2-2:[Spring Boot与Dubbo中管理服务依赖] ### Spring Cloud构建微服务架构 由于Spring Cloud偏宏观架构,Spring Boot偏微观细节,内容上越来越多,为了两部分内容不互相干扰,所以迁移Spring Cloud...

    springboot学习

    Spring Boot 基础教程(基于1.3.x-1.5.x) 快速入门 chapter1:基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API 使用Intellij中的Spring...chapter9-2-2:Spring Boot与Dubbo中管理服务依赖

    详解spring boot中使用JdbcTemplate

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

    spring_JdbcTemplete使用详解

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

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

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

    从零开始学Spring Boot

    1.37 Spring Boot的启动器Starter详解 1.38 Spring Boot集成Redis实现缓存机制 1.39 Spring Boot Cache理论篇 1.40 Spring Boot集成EHCache实现缓存机制 1.41 Spring Boot分布式Session状态保存Redis 1.42 Spring ...

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

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

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

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

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

    spring chm文档

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

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

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

    spring.doc

    3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化...

    Java Springboot学习资料.rar

    使用JdbcTemplate访问数据库 整合SpringDataJpa 整合Mybatis 通用Mapper与分页插件的集成 整合Lettuce Redis 使用Spring Cache集成Redis 集成Swagger在线调试 初探RabbitMQ消息队列 RabbitMQ延迟队列 actuator 服务...

    Spring 2.0 开发参考手册

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

Global site tag (gtag.js) - Google Analytics