Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。
步骤:
1、 添加依赖
2、创建JdbcTemplate对象。依赖于数据源DataSource
*JdbcTemplate template = new JdbcTemplate(ds);
3、调用JdbcTemplate的方法来完成CRUD的操作
*update():执行DML语句。增、删、改语句。
* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合。
注意:这个方法查询的结果集长度只能是1
*queryForList():查询结果将结果集封装为list集合。
注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
*query():查询结果,将结果封装为JavaBean对象。
query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
newBeanPropertyRowMapper<类型>(类型.class)
*queryForObject:查询结果,将结果封装为对象。
* 需求:
1)、修改1号数据的 salary 为 10000
2)、添加一条记录
3)、删除刚才添加的记录
4)、查询id为1的记录,将其封装为Map集合
5)、查询所有记录,将其封装为List
6)、查询所有记录,将其封装为Emp对象的List集合
7)、查询总记录数
druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3308/jdbcTemplate?useSSL=false&serverTimezone=UTC
username=root
password=12345678
initialSize=5
maxActive=10
maxWait=3000
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid连接池的工具类
*/
public class JDBCUtils {
//1.定义成员变量 DataSource
private static DataSource ds ;
static{
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Statement stmt,Connection conn){
/* if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}*/
close(null,stmt,conn);
}
public static void close(ResultSet rs , Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource(){
return ds;
}
}
//--------------------------
import java.util.Date;
public class Emp {
private Integer id;
private String ename;
private Integer job_id;
private Integer mgr;
private Date joindate;
private Double salary;
private Double bonus;
private Integer dept_id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Integer getJob_id() {
return job_id;
}
public void setJob_id(Integer job_id) {
this.job_id = job_id;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Date getJoindate() {
return joindate;
}
public void setJoindate(Date joindate) {
this.joindate = joindate;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Double getBonus() {
return bonus;
}
public void setBonus(Double bonus) {
this.bonus = bonus;
}
public Integer getDept_id() {
return dept_id;
}
public void setDept_id(Integer dept_id) {
this.dept_id = dept_id;
}
}
//-----------------------------------
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class JdbcTemplateDemo2 {
//1. 获取JDBCTemplate对象
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 1. 添加一条记录
*/
@Test
public void test2() {
String sql = "insert into emp(id,ename,dept_id) values(null,?,?)";
int count = template.update(sql, "郭靖", 10);
System.out.println(count);
}
@Test
public void test3() {
String sql = "delete from emp where id = ?";
int count = template.update(sql, 1015);
System.out.println(count);
}
/**
* 4.查询id为1001的记录,将其封装为Map集合
* 注意:这个方法查询的结果集长度只能是1
*/
@Test
public void test4() {
String sql = "select * from emp where id = ?";
Map<String, Object> map = template.queryForMap(sql, 1016);
System.out.println(map);
//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
}
/**
* 5. 查询所有记录,将其封装为List
*/
@Test
public void test5() {
String sql = "select * from emp";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
}
/**
* 6. 查询所有记录,将其封装为Emp对象的List集合
*/
@Test
public void test6() {
String sql = "select * from emp";
List<Emp> list = template.query(sql, new RowMapper<Emp>() {
@Override
public Emp mapRow(ResultSet rs, int i) throws SQLException {
Emp emp = new Emp();
int id = rs.getInt("id");
String ename = rs.getString("ename");
int job_id = rs.getInt("job_id");
int mgr = rs.getInt("mgr");
Date joindate = rs.getDate("joindate");
double salary = rs.getDouble("salary");
double bonus = rs.getDouble("bonus");
int dept_id = rs.getInt("dept_id");
emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setMgr(mgr);
emp.setJoindate(joindate);
emp.setSalary(salary);
emp.setBonus(bonus);
emp.setDept_id(dept_id);
return emp;
}
});
for (Emp emp : list) {
System.out.println(emp.getEname());
}
}
// 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
@Test
public void test6_2() {
String sql = "select * from emp";
List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
for (Emp emp : list) {
System.out.println(emp);
}
}
}
----------------------------------------------------------
JdbcTemplate是什么】
- JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。
- Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
- 常用方法
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL(数据库模式定义语言)语句;
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
【为什么要使用jdbctemplate】
如果直接使用JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等一系列的动作,繁琐且代码看起来不直观。而使用 jdbctemplate 则无需关注加载驱动、释放资源、异常处理等一系列操作,我们只需要提供 sql 语句并且提取最终结果即可,大大方便我们编程开发。此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值、赋值等操作,提高开发效率;
【jdbctemplate常用方法】
jdbcTemplate主要提供的5类方法及使用:
(1)execute() 方法:可以执行任何SQL语句,一般用于执行DDL语句。
(2)update(sqlStr, 参数列表) 方法:用于执行新增、修改、删除等语句。
(3)batchUpdate() 方法:用于执行批处理相关语句,batchUpdate方法第二参数是一个元素为 Object[] 数组类型的 List 集合。
(4)query() 方法及 queryForXXX() 方法:用于执行查询相关语句,查询结果为基本数据类型或者是单个对象一般使用 queryForObject()
queryForInt():查询一行数据并返回 int 型结果。例子:jdbcTemplate.queryForInt("select count(*) from user")
queryForObject(sqlStr, 指定的数据类型, 参数列表):查询一行任何类型的数据,最后一个参数指定返回结果类型。例子:jdbcTemplate.queryForObject("selct count(*) from user", Integer.class)
queryForMap(sqlStr, 参数列表):查询一行数据并将该行数据转换为 Map 返回。将会将列名作为key,列值作为 value 封装成 map。当查询出来的行数大于1时会报错。例子:jdbcTemplate.queryForMap("select * from user where username = ?", "aaa");
List<Map<String, Object>> queryForList(sqlStr, 参数列表):将查询结果集封装为 list 集合,该集合的每一条元素都是一个 map。
query(sqlStr, RowMapper对象, 参数列表):查询多行数据,并将结果集封装为元素是 JavaBean 的 list。(注意,指定的JavaBean的属性最好不要是基本类型,因为查询出来的结果可能是null,而null赋值为基本数据类型将会报错。比如int最好定义为Integer)
(5)call() 方法:用于执行存储过程、函数相关语句。
2、编写代码所需的工具类JDBCUtils
-
package com.Utils;
-
import com.alibaba.druid.pool.DruidDataSourceFactory;
-
import javax.sql.DataSource;
-
import java.io.IOException;
-
import java.sql.Connection;
-
import java.sql.ResultSet;
-
import java.sql.SQLException;
-
import java.sql.Statement;
-
import java.util.Properties;
-
/**
-
* 以下链接Druid的工具类
-
*/
-
public class JDBCUtil {
-
//创建Datasource对象
-
private static DataSource ds;
-
static {
-
//创建Properties对象
-
Properties pro = new Properties();
-
try {
-
pro.load(JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
-
ds=DruidDataSourceFactory.createDataSource(pro);
-
} catch (IOException e) {
-
e.printStackTrace();
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
/**
-
* 返回链接对象
-
*/
-
public static Connection getconnection() throws SQLException {
-
return ds.getConnection();
-
}
-
/**
-
* 关闭流
-
*/
-
public static void close(Statement sta,Connection con){
-
if(sta != null){
-
try {
-
sta.close();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
}
-
if(con !=null){
-
try {
-
con.close();//归还连接
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
/**
-
* 关闭三个流
-
*/
-
public static void close(ResultSet rs,Statement sta,Connection con){
-
if(rs !=null){
-
try {
-
rs.close();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
}
-
if(sta !=null){
-
try {
-
sta.close();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
}
-
if(con !=null){
-
try {
-
con.close();//归还连接
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
/**
-
* 获取数据源
-
*/
-
public static DataSource getDatasource(){
-
return ds;
-
}
-
}
3、编写JDBCTemplate基本程序
-
package com.Jdbctemplate;
-
import com.Utils.JDBCUtil;
-
import org.springframework.jdbc.core.JdbcTemplate;
-
/**
-
* 以下程序是使用Jdbctemplate初级方法
-
*/
-
public class test {
-
public static void main(String[] args) {
-
//1、导入5个Jar包
-
//2、新建对象
-
JdbcTemplate jdbc = new JdbcTemplate(JDBCUtil.getDatasource());
-
//3、编写sql语句
-
String sql = "update student set age = 20 where name=?";
-
//4、执行修改语句
-
int count = jdbc.update(sql, "大王");
-
//5、打印输出
-
System.out.println(count);
-
}
-
}
4、运行程序,数字1代表成功
【------补充资料----】
JdbcTemplate入门 - 代码先锋网(JDBCTemplate的使用 开始学习啦)
https://www.cnblogs.com/zwh0910/p/15708453.html
CREATE TABLE `emp` (
- `id` int(0) NOT NULL AUTO_INCREMENT,
- `ename` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
- `job_id` int(0) NULL DEFAULT NULL,
- `mgr` int(0) NULL DEFAULT NULL,
- `joindate` datetime(0) NULL DEFAULT NULL,
- `salary` double(10, 2) NULL DEFAULT NULL,
- `bonus` double(10, 2) NULL DEFAULT NULL,
- `dept_id` int(0) NULL DEFAULT NULL,
- PRIMARY KEY (`id`) USING BTREE
- ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
【--------如果不需要jar包,依赖文件按开始------】
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- 连接到mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>