在spring boot 集成使用jdbctemplate,首先在pom文件中引入相应的依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>mysql</groupId>
  7. <artifactId>mysql-connector-java</artifactId>
  8. <version>5.1.34</version>
  9. <scope>runtime</scope>
  10. </dependency>
  1. <!--整合druid数据源-->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.9</version>
    </dependency>

yml中配置数据源:

  1. #druid数据源
  2. druid:
  3. username: root
  4. password: 12345
  5. driver-class-name: com.mysql.jdbc.Driver
  6. url: jdbc:mysql://localhost:3306/corporationmanagement?useUnicode=true&characterEncoding=utf8
  7. initialSize: 1
  8. minIdle: 1
  9. maxActive: 5
  10. maxWait: 60000
  11. timeBetweenEvictionRunsMillis: 60000
  12. minEvictableIdleTimeMillis: 300000
  13. validationQuery: SELECT 1 FROM DUAL
  14. testWhileIdle: true
  15. testOnBorrow: false
  16. testOnReturn: false
  17. poolPreparedStatements: true
  18. maxPoolPreparedStatementPerConnectionSize: 20
  19. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

本文就来先解释下什么是Row Mapper,我们该如何正确地使用。

  1. @Override
  2. public Student getStudentByName(String name) {
  3. String sql = "select name, gender from test_student where name = ?";
  4. Student student = this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new RowMapper<Student>() {
  5. @Override
  6. public Student mapRow(ResultSet rs, int i) throws SQLException {
  7. Student s = new Student();
  8. s.setName(rs.getString("name"));
  9. s.setGender(rs.getString("gender"));
  10. return s;
  11. }
  12. });
  13. return student;
  14. }
  15.  
  16. @Override
  17. public List<Student> getStudentsByName(String name) {
  18. String sql = "select name, gender from test_student where name = ?";
  19. List<Student> students = this.jdbcTemplate.query(sql, new Object[]{name}, new RowMapper<Student>() {
  20. @Override
  21. public Student mapRow(ResultSet rs, int i) throws SQLException {
  22. Student s = new Student();
  23. s.setName(rs.getString("name"));
  24. s.setGender(rs.getString("gender"));
  25. return s;
  26. }
  27. });
  28. return students;
  29. }

一、RowMapper的基本使用

使用过原生JDBC的朋友应该知道,从数据库查询出来的记录全都被保存在ResultSet结果集中,我们需要将结果集中的数据一条条地获取并设置到具体的实体类上,如此,该实体类才能在接下来的程序中使用。然而问题是,每次都要这么操作实在是太麻烦了,Spring就不应该提供什么功能来替我们做这些事情吗?答案当然是有的,那就是本文的主角——RowMapper。

Spring JDBC中目前有两个主要的RowMapper实现,使用它们应该能解决大部分的场景了。

1.1 SingleColumnRowMapper

通过名字我们就能大概了解,在查询返回单列数据的时候,就该使用这个RowMapper,下面我们来看看具体的代码:

  1. @Override
  2. public String getStudentNameById(String id) {
  3. String sql = "select name from test_student where id = ?";
  4. return this.jdbcTemplate.queryForObject(sql, new Object[]{id},
  5. new SingleColumnRowMapper<>(String.class));
  6. }
  7.  
  8. @Override
  9. public List<String> getStudentNamesByGrade(Integer grade) {
  10. String sql = "select name from test_student where grade = ?";
  11. return this.jdbcTemplate.query(sql, new Object[]{grade},
  12. new SingleColumnRowMapper<>(String.class));
  13. }
  14.  
  15. @Test
  16. public void getStudentNameById(){
  17. String name = studentService.getStudentNameById("3");
  18. assertEquals("李清照", name);
  19. }
  20.  
  21. @Test
  22. public void getStudentNamesByGrade(){
  23. List<String> names = studentService.getStudentNamesByGrade(1);
  24. assertTrue(2 == names.size());
  25. }

1.2 BeanPropertyRowMapper

当查询数据库返回的是多列数据,且你需要将这些多列数据映射到某个具体的实体类上,那么就该使用这个Row Mapper,下面是具体的使用代码:

  1. @Override
  2. public Student getStudentByName2(String name) {
  3. String sql = "select name, gender from test_student where name = ?";
  4. return this.jdbcTemplate.queryForObject(sql, new Object[]{name},
  5. new BeanPropertyRowMapper<>(Student.class));
  6. }
  7.  
  8. @Override
  9. public List<Student> getStudentsByName2(String name) {
  10. String sql = "select name, gender from test_student where name = ?";
  11. return this.jdbcTemplate.query(sql, new Object[]{name},
  12. new BeanPropertyRowMapper<>(Student.class));
  13. }
  14.  
  15. @Test
  16. public void getStudentByName2(){
  17. Student student = studentService.getStudentByName2("杜甫");
  18. assertEquals("杜甫",student.getName());
  19. assertEquals("男",student.getGender());
  20. }
  21.  
  22. @Test
  23. public void getStudentsByName2(){
  24. List<Student> studentList = studentService.getStudentsByName("Jack");
  25. assertTrue(2 == studentList.size());
  26. }

这种使用方式有一个前提,那就是数据库SQL查出来的数据其列名与实体类中的属性名是一致的,当然个数和顺序可以不一致。比如数据库SQL查出来的姓名列叫name,那么对应的实体类中的姓名也必须叫name,而不能叫studentName或者其它。

二、定义自己的RowMapper

当然,如果你SQL查询出来的数据列名就是和实体类的属性名不一样,或者想按照自己的规则来装配实体类,那么就可以定义并使用自己的Row Mapper。

  1. public class StudentRowMapper implements RowMapper<Student> {
  2.  
  3. @Override
  4. public Student mapRow(ResultSet rs, int i) throws SQLException {
  5. Student student = new Student();
  6. student.setName(rs.getString("name"));
  7. student.setGender(rs.getString("gender"));
  8. student.setEmail(rs.getString("email"));
  9. return student;
  10. }
  11. }
  12.  
  13. @Override
  14. public Student getStudentByName3(String name) {
  15. String sql = "select name, gender, email from test_student where name = ?";
  16. return this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new StudentRowMapper());
  17. }
  18.  
  19. @Override
  20. public List<Student> getStudentsByName3(String name) {
  21. String sql = "select name, gender, email from test_student where name = ?";
  22. return this.jdbcTemplate.query(sql, new Object[]{name}, new StudentRowMapper());
  23. }
  24.  
  25. @Test
  26. public void getStudentByName3(){
  27. Student student = studentService.getStudentByName3("杜甫");
  28. assertEquals("杜甫",student.getName());
  29. assertEquals("男",student.getGender());
  30. assertEquals("dufu@tang", student.getEmail());
  31. }
  32.  
  33. @Test
  34. public void getStudentsByName3(){
  35. List<Student> studentList = studentService.getStudentsByName3("李白");
  36. assertTrue(2 == studentList.size());
  37. }

作者:力羊
链接:https://www.jianshu.com/p/be60a81e2fe7
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Spring JdbcTemplate中关于RowMapper的使用实例的更多相关文章

  1. Spring中JdbcTemplate中使用RowMapper

    转自:https://blog.csdn.net/u012661010/article/details/70049633 1 sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类 ...

  2. 设计模式学习笔记(十五)命令模式及在Spring JdbcTemplate 中的实现

    命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储.传递.调用.增加与管理. 也就是将发送者.接收者和调用命令封装成独立的对象,来供客户端调 ...

  3. Spring JdbcTemplate中的回调

    回调 JdbcTemplate类支持的回调类: 1.预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句: 1.1 PreparedStatementCreator ...

  4. spring框架中由FactoryBean获取JedisCluster实例

    spring配置文件: <bean id="jedisCluster" class="com.pingan.ela.structure.ex.JedisCluste ...

  5. Spring jdbcTemplate RowMapper绑定任意对象

    RowMapper可以将数据中的每一行封装成用户定义的类,在数据库查询中,如果返回的类型是用户自定义的类型则需要包装,如果是Java自定义的类型,如:String则不需要,Spring最新的类Simp ...

  6. spring 中的 RowMapper

    spring 中的 RowMapper sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类.    我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中 ...

  7. ref:Spring JdbcTemplate+JdbcDaoSupport实例

    ref:https://www.yiibai.com/spring/spring-jdbctemplate-jdbcdaosupport-examples.html 在Spring JDBC开发中,可 ...

  8. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  9. 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢

    我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate 首先我们 ...

随机推荐

  1. HotSpot的对象模型(6)

    接着上一篇,我们继续来讲oopDesc相关的子类. 3.instanceOopDesc类 instanceOopDesc类的实例表示除数组对象外的其它对象.在HotSpot中,对象在内存中存储的布局可 ...

  2. Angular 懒加载找不到模块问题解决方法

    问题: 懒加载无法找到模块 解决办法: 在app-routing.module.ts中引入该模块

  3. JSON基础使用详解

    JSON:JavaScript对象表示法 1.1 JSON说明 曾经一段时间,XML是互联网传递数据的统一标准,但是业界一直不乏质疑XML的人士,他们都认为XML过于繁琐,冗长:提取数据也过于麻烦 2 ...

  4. 1.对Java平台的理解。“Java是解释执行”对吗

    Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”,能够非常容易地获得跨平台能力: 另外就是垃圾收集(GC),Java通过垃圾收集器(Garbage Colle ...

  5. 【学习记录】C#保存数据至CSV文档 & DateTime格式模式控制解释

    数据类的定义: public class Result_Display { private string id; public string ID { get { return id; } set { ...

  6. 在Access中执行SQL

    1.基本介绍 Microsoft Access在很多地方得到广泛使用,例如小型企业,大公司的部门.喜爱编程的开发人员亦利用它来制作处理数据的桌面系统.它也常被用来开发简单的WEB应用程序. 2.Ace ...

  7. Java中的大数值使用

    在Java中,偶尔会遇到超大数值,超出了已有的int,double,float等等你已知的整数.浮点数范围,那么可以使用java.math包中的两个类:BigInteger和BigDecimal. 这 ...

  8. java 之死循环

    public class StringTest { public static void main(String[] args) { System.out.println(getStringCount ...

  9. Python 3爬虫、数据清洗与可视化实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python 3爬虫.数据清洗与可视化实战PDF高清完整版免费下载 提取码: 内容简介 <Python 3爬虫.数据清洗与可视化实战>是一本通过实战教初学者学习采集数据.清洗和组 ...

  10. centos7 离线安装paramiko

    离线安装paramiko   1. 利用yum下载paramiko依赖的rpm软件包 安装yum-utils yum -y install yum-utils yumdownloader python ...