Spring JDBC

Spring JDBC

Spring JDBC是Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使开发人员从繁琐的数据库操作中解脱,从而将更多精力投入到编写业务逻辑中

JdbcTemplate解析

针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说,JdbcTemplate类是Spring JDBC的核心类

JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性

DataSource:其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。

参考资料

使用步骤

1. 导入jar包

2. 创建JdbcTemplate对象。依赖于数据源DataSource

1
JdbcTemplate template=new JdbcTemplate(ds);

工具类 JDBCUtils.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package 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 JDBCUtils {
//定义成员变量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 (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void close(Statement stat,Connection conn){
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//重载close方法(省略)
//获取连接池方法
public static DataSource getDataSource(){
return ds;
}
}

3. 调用JDBCTemplate的方法来完成CRUD的操作

  • update():执行DML语句。增、删、改语句
  • queryForMap():查询结果将结果集封装为map集合
  • queryForList():查询结果将结果集封装为list集合
  • query():查询结果,将结果封装为JavaBean对象
  • queryForObject:查询结果,将结果封装为对象

4. 练习

  1. 修改id为17200数据的math为99
  2. 添加一条记录

  1. 删除刚添加的记录

  1. 查询id为17222的记录,将其封装为Map集合
  2. 查询所有记录,将其封装为List

  1. 查询所有记录,将其封装为student的List集合
  2. 查询总记录数

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package datasource;

import domain.Student;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import utils.JDBCUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

//Junit单元测试,可以让方法独立运行
public class JDBCTemplateDemo2 {

//1. 获取JdbcTemplate对象
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());

@Test
public void test1(){

//2.定义sql
String sql="update stu set math=99 where id=17200;";
//3.执行sql
int count = template.update(sql);
System.out.println(count);
}

@Test
public void test2(){
//使用预编译sql防止sql注入
String sql="insert into stu values(?,?,?,?,?,?,?)";
int count = template.update(sql, 17268, "八百", 26, "北京", 100, 69, "男");
System.out.println(count);
}

@Test
public void test3(){
String sql="delete from stu where id =?;";
int count = template.update(sql, 17268);
System.out.println(count);
}
//查询id为17222的记录,将其封装为Map集合
//注意:这个方法查询的结果集长度只能是1
@Test
public void test4(){
String sql="select * from stu where id=?";
Map<String, Object> map = template.queryForMap(sql, 17222);
System.out.println(map);
//{id=17222, name=猪大头, age=24, address=西安, math=80, english=66, sex=男}
}

//查询所有记录,将其封装为List
//注意:该方法是将每一条记录封装为一个map集合,再将map集合装在到List集合中
@Test
public void test5(){
String sql="select * from stu";
List<Map<String,Object>> list=template.queryForList(sql);

for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
}

//查询所有记录,将其封装为student的List集合
@Test
public void test6(){
String sql="select * from stu";
List<Student> list = template.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
for (Student student : list) {
System.out.println(student);
}

}


//查询总记录数
//一般用于聚合函数的查询
@Test
public void test7(){
String sql="select count(id) from stu;";
Integer total = template.queryForObject(sql, Integer.class);
System.out.println(total);
}

}

请我喝杯咖啡吧~

支付宝
微信