Spring JdbcTemplate中关于RowMapper的使用实例
在spring boot 集成使用jdbctemplate,首先在pom文件中引入相应的依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.34</version>
- <scope>runtime</scope>
- </dependency>
- <!--整合druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
yml中配置数据源:
- #druid数据源
- druid:
- username: root
- password: 12345
- driver-class-name: com.mysql.jdbc.Driver
- url: jdbc:mysql://localhost:3306/corporationmanagement?useUnicode=true&characterEncoding=utf8
- initialSize: 1
- minIdle: 1
- maxActive: 5
- maxWait: 60000
- timeBetweenEvictionRunsMillis: 60000
- minEvictableIdleTimeMillis: 300000
- validationQuery: SELECT 1 FROM DUAL
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- poolPreparedStatements: true
- maxPoolPreparedStatementPerConnectionSize: 20
- connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
本文就来先解释下什么是Row Mapper,我们该如何正确地使用。
- @Override
- public Student getStudentByName(String name) {
- String sql = "select name, gender from test_student where name = ?";
- Student student = this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new RowMapper<Student>() {
- @Override
- public Student mapRow(ResultSet rs, int i) throws SQLException {
- Student s = new Student();
- s.setName(rs.getString("name"));
- s.setGender(rs.getString("gender"));
- return s;
- }
- });
- return student;
- }
- @Override
- public List<Student> getStudentsByName(String name) {
- String sql = "select name, gender from test_student where name = ?";
- List<Student> students = this.jdbcTemplate.query(sql, new Object[]{name}, new RowMapper<Student>() {
- @Override
- public Student mapRow(ResultSet rs, int i) throws SQLException {
- Student s = new Student();
- s.setName(rs.getString("name"));
- s.setGender(rs.getString("gender"));
- return s;
- }
- });
- return students;
- }
一、RowMapper的基本使用
使用过原生JDBC的朋友应该知道,从数据库查询出来的记录全都被保存在ResultSet结果集中,我们需要将结果集中的数据一条条地获取并设置到具体的实体类上,如此,该实体类才能在接下来的程序中使用。然而问题是,每次都要这么操作实在是太麻烦了,Spring就不应该提供什么功能来替我们做这些事情吗?答案当然是有的,那就是本文的主角——RowMapper。
Spring JDBC中目前有两个主要的RowMapper实现,使用它们应该能解决大部分的场景了。
1.1 SingleColumnRowMapper
通过名字我们就能大概了解,在查询返回单列数据的时候,就该使用这个RowMapper,下面我们来看看具体的代码:
- @Override
- public String getStudentNameById(String id) {
- String sql = "select name from test_student where id = ?";
- return this.jdbcTemplate.queryForObject(sql, new Object[]{id},
- new SingleColumnRowMapper<>(String.class));
- }
- @Override
- public List<String> getStudentNamesByGrade(Integer grade) {
- String sql = "select name from test_student where grade = ?";
- return this.jdbcTemplate.query(sql, new Object[]{grade},
- new SingleColumnRowMapper<>(String.class));
- }
- @Test
- public void getStudentNameById(){
- String name = studentService.getStudentNameById("3");
- assertEquals("李清照", name);
- }
- @Test
- public void getStudentNamesByGrade(){
- List<String> names = studentService.getStudentNamesByGrade(1);
- assertTrue(2 == names.size());
- }
1.2 BeanPropertyRowMapper
当查询数据库返回的是多列数据,且你需要将这些多列数据映射到某个具体的实体类上,那么就该使用这个Row Mapper,下面是具体的使用代码:
- @Override
- public Student getStudentByName2(String name) {
- String sql = "select name, gender from test_student where name = ?";
- return this.jdbcTemplate.queryForObject(sql, new Object[]{name},
- new BeanPropertyRowMapper<>(Student.class));
- }
- @Override
- public List<Student> getStudentsByName2(String name) {
- String sql = "select name, gender from test_student where name = ?";
- return this.jdbcTemplate.query(sql, new Object[]{name},
- new BeanPropertyRowMapper<>(Student.class));
- }
- @Test
- public void getStudentByName2(){
- Student student = studentService.getStudentByName2("杜甫");
- assertEquals("杜甫",student.getName());
- assertEquals("男",student.getGender());
- }
- @Test
- public void getStudentsByName2(){
- List<Student> studentList = studentService.getStudentsByName("Jack");
- assertTrue(2 == studentList.size());
- }
这种使用方式有一个前提,那就是数据库SQL查出来的数据其列名与实体类中的属性名是一致的,当然个数和顺序可以不一致。比如数据库SQL查出来的姓名列叫name,那么对应的实体类中的姓名也必须叫name,而不能叫studentName或者其它。
二、定义自己的RowMapper
当然,如果你SQL查询出来的数据列名就是和实体类的属性名不一样,或者想按照自己的规则来装配实体类,那么就可以定义并使用自己的Row Mapper。
- public class StudentRowMapper implements RowMapper<Student> {
- @Override
- public Student mapRow(ResultSet rs, int i) throws SQLException {
- Student student = new Student();
- student.setName(rs.getString("name"));
- student.setGender(rs.getString("gender"));
- student.setEmail(rs.getString("email"));
- return student;
- }
- }
- @Override
- public Student getStudentByName3(String name) {
- String sql = "select name, gender, email from test_student where name = ?";
- return this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new StudentRowMapper());
- }
- @Override
- public List<Student> getStudentsByName3(String name) {
- String sql = "select name, gender, email from test_student where name = ?";
- return this.jdbcTemplate.query(sql, new Object[]{name}, new StudentRowMapper());
- }
- @Test
- public void getStudentByName3(){
- Student student = studentService.getStudentByName3("杜甫");
- assertEquals("杜甫",student.getName());
- assertEquals("男",student.getGender());
- assertEquals("dufu@tang", student.getEmail());
- }
- @Test
- public void getStudentsByName3(){
- List<Student> studentList = studentService.getStudentsByName3("李白");
- assertTrue(2 == studentList.size());
- }
作者:力羊
链接:https://www.jianshu.com/p/be60a81e2fe7
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Spring JdbcTemplate中关于RowMapper的使用实例的更多相关文章
- Spring中JdbcTemplate中使用RowMapper
转自:https://blog.csdn.net/u012661010/article/details/70049633 1 sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类 ...
- 设计模式学习笔记(十五)命令模式及在Spring JdbcTemplate 中的实现
命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储.传递.调用.增加与管理. 也就是将发送者.接收者和调用命令封装成独立的对象,来供客户端调 ...
- Spring JdbcTemplate中的回调
回调 JdbcTemplate类支持的回调类: 1.预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句: 1.1 PreparedStatementCreator ...
- spring框架中由FactoryBean获取JedisCluster实例
spring配置文件: <bean id="jedisCluster" class="com.pingan.ela.structure.ex.JedisCluste ...
- Spring jdbcTemplate RowMapper绑定任意对象
RowMapper可以将数据中的每一行封装成用户定义的类,在数据库查询中,如果返回的类型是用户自定义的类型则需要包装,如果是Java自定义的类型,如:String则不需要,Spring最新的类Simp ...
- spring 中的 RowMapper
spring 中的 RowMapper sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类. 我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中 ...
- ref:Spring JdbcTemplate+JdbcDaoSupport实例
ref:https://www.yiibai.com/spring/spring-jdbctemplate-jdbcdaosupport-examples.html 在Spring JDBC开发中,可 ...
- 在listener或者工具中使用spring容器中的bean实例
在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...
- 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢
我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate 首先我们 ...
随机推荐
- HotSpot的对象模型(6)
接着上一篇,我们继续来讲oopDesc相关的子类. 3.instanceOopDesc类 instanceOopDesc类的实例表示除数组对象外的其它对象.在HotSpot中,对象在内存中存储的布局可 ...
- Angular 懒加载找不到模块问题解决方法
问题: 懒加载无法找到模块 解决办法: 在app-routing.module.ts中引入该模块
- JSON基础使用详解
JSON:JavaScript对象表示法 1.1 JSON说明 曾经一段时间,XML是互联网传递数据的统一标准,但是业界一直不乏质疑XML的人士,他们都认为XML过于繁琐,冗长:提取数据也过于麻烦 2 ...
- 1.对Java平台的理解。“Java是解释执行”对吗
Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”,能够非常容易地获得跨平台能力: 另外就是垃圾收集(GC),Java通过垃圾收集器(Garbage Colle ...
- 【学习记录】C#保存数据至CSV文档 & DateTime格式模式控制解释
数据类的定义: public class Result_Display { private string id; public string ID { get { return id; } set { ...
- 在Access中执行SQL
1.基本介绍 Microsoft Access在很多地方得到广泛使用,例如小型企业,大公司的部门.喜爱编程的开发人员亦利用它来制作处理数据的桌面系统.它也常被用来开发简单的WEB应用程序. 2.Ace ...
- Java中的大数值使用
在Java中,偶尔会遇到超大数值,超出了已有的int,double,float等等你已知的整数.浮点数范围,那么可以使用java.math包中的两个类:BigInteger和BigDecimal. 这 ...
- java 之死循环
public class StringTest { public static void main(String[] args) { System.out.println(getStringCount ...
- Python 3爬虫、数据清洗与可视化实战PDF高清完整版免费下载|百度云盘
百度云盘:Python 3爬虫.数据清洗与可视化实战PDF高清完整版免费下载 提取码: 内容简介 <Python 3爬虫.数据清洗与可视化实战>是一本通过实战教初学者学习采集数据.清洗和组 ...
- centos7 离线安装paramiko
离线安装paramiko 1. 利用yum下载paramiko依赖的rpm软件包 安装yum-utils yum -y install yum-utils yumdownloader python ...