如何使用Spring JDBC 来实现增删改查

Spring框架针对数据库提供了JdbcTemplate 类,JdbcTemplate 是Spring 数据抽象层的基础,其他更高层次的抽象类都是构建在其基础之上,JdbcTemplate 是Spring JDBC的核心类。JdbcTemplate 继承自抽象类JdbcAccessor,同时实现了JdbcOperations 接口,JdbcTemplate定义在了JdbcTemplate类中从而可以使用增删改查来对数据库进行操作。JdbcTemplate 的直接父类是JdbcAccessor,它提供了一些访问数据库时所需要使用的公共属性,包括DataSource以及SQLExceptionTranslator 等。前者用于获取数据库连接以及引入对数据库连接的缓冲池以及分布式事务等支出。后者是对SQLException 进行转译工作。

Spring JDBC的配置

Spring JDBC 模块主要包括core、dataSource、object、support四个包

  • core 包括JDBC的核心功能,例如JdbcTemplate类、simpleJdbcInsert类、simpleJdbcCall 类以及NamedParameterJdbcTemplate类。
  • dataSource 包括了访问数据库的实用工具类。
  • object 以OOP的方式访问数据库,它允许执行查询操作并将返回结果作为业务对象,可以在数据表和业务对象的属性直接映射查询关系。
  • support 包括core 和object包的支持类,例如提供一些SQLException类。

我们了解了这些模块的功能,接来下我们看看怎么去配置JDBC,请看下面的xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!--1配置数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!--连接数据库的ur1 -->
<property name="url" value="jdbc:mysql://localhost:3306/spring_db" />
<!--连接数据库的用户名 -->
<property name="username" value="root" />
<!--连接数据库的密码 -->
<property name="password" value="root" />
</bean>
<!--2配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--默认必须使用数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>

在上述xml 文件中的beans 中定义了三个bean,分别是dataSource、jdbcTemplate。

其中dataSource中的4个属性分别对应的是

  • driverClassName,它是数据库的驱动

  • url 数据库的访问地址

  • username 数据库的用户名

  • password 数据库的密码

在使用传统的JDBC操作数据库时,这些参数我们也是要配置的。

下面我们通过实例的方式来讲解如何通过JDBC来对数据库进行操作,我们需要进行以下准备工作

1.配置maven的pom.xml 下载所需要的jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>

2.需要有一个可以反问的数据库,比如我的数据库设置密码为root

1
mysqladmin -u root password root

3.创建一个spring_db 的表

1
2
MariaDB [(none)]> create database spring_db;
Query OK, 1 row affected (0.000 sec)
  1. 在idea 工程中新建一个com.ssm.jdbc 的包,并在该包中创建一个JdbcTempTest的测试类,首先我们加载xml 配置,配置文件就是上面的xml配置文件,我们创建一个数据表为user_table,使用jdbctemp.execute(String s) 方法执行SQL语句
1
2
3
4
5
6
7
8
9
10
11
@Test
public void TestJdbcTemplate() {
//加载配置
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
//获取JdbcTemplate实例
JdbcTemplate jdbctemp = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
jdbctemp.execute("create table user_table(" +
"id int primary key auto_increment," +
"username varchar(80)," +
"password varchar(40))");
}

进入数据库,我们可以看到该表已经被创建出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MariaDB [(none)]> use spring_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [spring_db]> show tables;
+---------------------+
| Tables_in_spring_db |
+---------------------+
| user_table |
+---------------------+
1 row in set (0.000 sec)

MariaDB [spring_db]>

下面,我们通过jdbc 来实现增删改查操作,首先,我们要创建一个类,名字为User,这个User 类中包含了用户的id、用户名和密码信息,并设置其set和get属性

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
package com.ssm.jdbc;

public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}

然后我们创建一个UserDao 接口,该接口定义了添加、更新、删除、根据ID查询和查询所有用户的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.ssm.jdbc;

import java.util.List;

public interface UserDao {
public int addUser(User user);
public int updateUser(User user);
public int deleteUser(int id);
//通过id查询用户
public User findUserById(int id);
//查询所有用户
public List<User> findAllUser();

}

接下来,我们来对UserDao的接口进行实现,在这个方法中我们对具体的增删改查逻辑进行设置,直接看代码吧

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
package com.ssm.jdbc;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;

public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public int addUser(User user) {
String sql="insert into user_table(username,password) value(?,?)";
Object[] obj=new Object[]{
user.getUsername(),
user.getPassword()
};
int num=this.jdbcTemplate.update(sql,obj);
return num;
}

@Override
public int updateUser(User user) {
String sql="update user_table set username=?,password=? where id=?";
Object[] params=new Object[]{
user.getUsername(),
user.getPassword(),
user.getId()
};
int num=this.jdbcTemplate.update(sql,params);
return num;
}

@Override
public int deleteUser(int id) {
String sql="delete from user_table where id=?";
int num=this.jdbcTemplate.update(sql,id);
return num;
}

@Override
public User findUserById(int id) {
String sql="select * from user_table where id=?";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
return this.jdbcTemplate.queryForObject(sql,rowMapper,id);
}

@Override
public List<User> findAllUser() {
String sql="select * from user_table";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
return this.jdbcTemplate.query(sql,rowMapper);
}
}

然后我们在jdbc.xml 中加入bean,加入UserDao

1
2
3
4
5
<!-- 定义id为userDao的Bean -->
<bean id="userDao" class="com.ssm.jdbc.UserDaoImpl">
<!--将 jdbcTemplate注入到 userDao实例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>

好了,一切准备就绪,我们接来下通过测试类来测试下具体的增删改查。

首先来测试下添加用户方法,如图下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void addUserTest(){
//加载jdbc.xml 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
//获取UserDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//创建user实例
User user = new User();
//设置属性
user.setUsername("张三");
user.setPassword("123");
//添加用户
int num = userDao.addUser(user);
if (num > 0) {
System.out.println("Success insert "+num+" data");
}else {
System.out.println("erro");
}
}

更新用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void updateUserTest(){
//加载jdbc.xml 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
//获取UserDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//创建user实例
User user = new User();
//设置属性
user.setId(1);
user.setUsername("李四");
user.setPassword("12345");
//更新用户信息
int num = userDao.updateUser(user);
if (num > 0) {
System.out.println("Success update "+num+" data");
}else {
System.out.println("erro");
}
}

删除用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void delUserTest(){
//加载jdbc.xml 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
//获取UserDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//删除,传入ID值
int num = userDao.deleteUser(1);
if (num > 0) {
System.out.println("Success delete "+num+" data");
}else {
System.out.println("erro");
}
}

查询用户信息,包括了根据ID查询和查询所有

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
@Test
public void findUserTest(){
//加载jdbc.xml 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
//获取UserDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//根据ID查询用户
User user = userDao.findUserById(2);
System.out.println(user);

}

@Test
public void findAllUserTest(){
//加载jdbc.xml 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jdbc.xml");
//获取UserDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//根据ID查询用户
List<User> list = userDao.findAllUser();
for (User user:list){
System.out.println(user);
}

}