JDBCTemplate编程
场景:使用JdbcTemplate技术向MySQL中插入一条数据
-
表结构如下
create table t_person(
person_id int primary key auto_increment,
person_name varchar(20),
age tinyint,
sex enum('男','女','奥特曼'),
height decimal(4,1),
birthday datetime
)
-
API介绍
API 含义 Connection
数据库连接 作为Java程序向MySQL发送SQL和返回结果数据的网络连接 DataSource
连接池 Connection的管理者,内部有多个Connection,可以重复使用,免去了销毁和创建Connection所消耗的时间和CPU资源,可以提高性能。 JdbcTemplate
— 封装了JDBC的操作代码,相当于MySQL的客户端,可以发送SQL语句。 resultSet
结果集 里面封装了MySQL数据库返回的查询结果。 -
编程思路
1. 创建连接池DataSource 2. 创建JdbcTemplate对象 3. 发送SQL
-
编码实现
① 准备工作
-
使用IDEA创建一个的java项目
-
加入如下依赖
② 具体编码
package com.xx.test; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; public class InsertTest { public static void main(String[] args) { // 1. 创建数据库连接池(可以辅助我们获取连接管理连接) //连接路径: 连接途径:数据库类型://ip:port/数据库名?k=v&k=v(编码集&时区) String url = "jdbc:mysql://localhost:3306/xx2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"; String username = "root"; String password = "root"; DataSource dataSource=new DriverManagerDataSource(url,username,password); // 2. 创建JDBCTemplate (创建操作数据库的工具) JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); // 3. 书写SQL String sql = "insert into t_person(person_name,age) values('lisi',20)"; // 4. 发送执行SQL int n = jdbcTemplate.update(sql); // 5. 处理结果 if (n == 1) { //如果受影响行数为1,证明操作成功 System.out.println("添加成功!"); } else { System.out.println("添加失败"); } } }
-
二 结果集处理
场景:查询t_person表中的数据,并逐条地将每个字段输出在控制台。
ResultSet说明:
# 注意: 1. ResultSet表示的是查询结果,其数据已经是MySQL返回,并保存在Java程序中的。 2. ResultSet查询结果的列名,不是原表列名,而是select查询结果列名,可以由as进行别名定义。
1. RowMapper
功能: 用来把SQL查询结果集ResultSet,映射(转化)为Java对象,便于java程序的后续数据管理和处理。
语法:
-
① 定义一个类
class Java类{
1. 类名与对应表名相关
2. 一个属性对应一个字段
3. 属性类型必须与字段类型一致
4. 属性名必须与字段名相关
- 字段名只由一部分组成,属性名保持一致 age--age
- 字段名由多个部分组成,属性名采用小驼峰命名 person_id--personId
5. 进行正常封装
6. 提供有参无参的构造
7. 数据类型声明为引用类型
}
-
② 映射查询结果
List<Java类> personList = jdbcTemplate.query("查询的SQL语句", new RowMapper<Java类>() {
/**
功能:作为JdbcTemplate,将查询结果的每个字段映射为一个ORM对象的属性的实现。
执行时机:查询结果的每条数据的映射,都会调用一次mapRow方法。
参数:
ResultSet:结果集,封装了MySQL返回的查询结果。可以看作是之前MySQL客户端返回的行结果。
rowNum:当前映射的行,在整体本次查询结果的行号。
*/
@Override
public Java类 mapRow(ResultSet rs, int rowNum) throws SQLException {
//获取当前行数据
rs.getXxxx("查询结果列名");
rs.getString("");
rs.getInt("");
rs.getDouble("");
// 将结果封装成Java对象,并返回。
}
});
示例代码:
-
① 定义一个类
package com.xx.entity;
import java.util.Date;
/**
* 对应t_person表
*/
public class Person {
private Integer personId;
private String personName;
private Integer age;
private String sex;
private Double height;
private Date birthday;
//省略getter、setter、有参构造、无参构造
}
-
② 映射查询结果
package com.xx.test;
import com.xx.entity.Person;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
/**
* 需求:查询person表的所有数据
*/
public class SelectTest {
public static void main(String[] args) {
//创建数据库连接池
String url = "jdbc:mysql://localhost:3306/xx2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
DataSource dataSource = new DriverManagerDataSource(url, username, password);
//创建JDBCTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//书写SQL
String sql = "select * from t_person";
//发送SQL处理结果
List<Person> list=jdbcTemplate.query(sql, new RowMapper<Person>() {
/**
* RowMapper:更改当前操作的行号-->按照我们书写的代码处理结果集指定行的内容-->将返回的对象添加进集合
*
* @param rs 结果集 存放着所有的查询数据
* @param i 当前被处理的行号 RowMapper执行时自动使用,无需手动处理
* @return 本行数据对应的对象
* @throws SQLException
*/
@Override
public Person mapRow(ResultSet rs, int i) throws SQLException {
//获取字段值
Integer personId = rs.getInt("person_id");
String personName = rs.getString("person_name");
Integer age = rs.getInt("age");
String sex = rs.getString("sex");
Double height = rs.getDouble("height");
Date birthday = rs.getDate("birthday");
//组装当前行的Person对象
Person p = new Person(personId, personName, age, sex, height, birthday);
return p;
}
});
//查看集合数据
System.out.println("查询结果为:");
list.forEach(person -> System.out.println(person));
}
}
2. BeanPropertyRowMapper
💡JdbcTemplate还提供了内置的BeanPropertyRowMapper,简化查询结果和实体类对象的转换RowMapper的操作。
要求:
1. 如果查询结果(select后的字段名)的字段由一个单词构成,则Java类的属性名要和列名一致。 2. 如果查询结果(select后的字段名)的字段由n个单词构成,则Java类的属性名要变成驼峰命名法
如图:
语法:
jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(与查询结果对应的Java类.class));
编码:
package com.xx.test;
import com.xx.entity.Person;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import java.util.List;
/**
* 需求:查询person表的所有数据-BeanPropertyRowMapper
*/
public class SelectTest_2 {
public static void main(String[] args) {
//创建数据库连接池
String url = "jdbc:mysql://localhost:3306/xx2304?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
DataSource dataSource = new DriverManagerDataSource(url, username, password);
//创建JDBCTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//书写SQL
String sql = "select * from t_person";
//发送SQL处理结果
List<Person> list=jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Person.class));
//查看集合数据
System.out.println("查询结果为:");
list.forEach(person -> System.out.println(person));
}
}