Spring JDBC
Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从烦琐的数据库操作中解脱出来,从而将更多的精力投入编写业务逻辑中。
Spring JdbcTemplate的解析
针对数据库的操作,Spring框架提供了jdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说,jdbcTemplate类是Spring JDBC的核心类。
JdbcTemplate类的继承关系十分简单。它继承自抽象类JdbcAccessor,同时实现了JdbcOperations接口。
- JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。
- JdbcTemplate类的直接父类是JdbcAccessor, 该类为子类提供了一些访问数据库时使用的公共属性
- DataSource: 其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布事务的支持,它可以作为访问数据库资源的标准接口。
Spring JDBC的配置
Spring JDBC模块主要由4个包组件,分别是core(核心包)、dataSource(数据包)、object(对象包)和support(支持包)。 具体说明如下表:
JDBC的配置是在配置文件applicationContext.xml中完成的,其配置模板如下:
上述代码中定义了3个Bean, 分别是dataSource、jdbcTemplate和需要注入类的Bean。其中dataSource对应的org.springframework.jdbc.datasource.DriverManagerDataSource类用于对数据源进行配置,jdbcTemplate对应的org.springframework.jdbc.core.JdbcTemplate类中定义了JdbcTemplate的相关配置。
dataSource中的4个属性,如下表所示;
定义jdbcTemplate时,需要将dataSource注入jdbcTemplate中,而其他需要使用jdbcTemplate的Bean,也需要将jdbcTemplate注入该Bean中(通常注入Dao类中,在Dao类中进行与数据库的相关操作)
Spring JdbcTemplate常用方法
execute()——执行SQL语句
execute(String sql) 方法能够完成执行SQL语句的功能。
这里我使用的是SQLyong, 打开SQLyong创建数据库text,并创建sprint_text表,如下图所示
导入以下jar包
如果使用的是Maven的话,我在前面Spring系列中已经给出了所有的坐标,这里就不再给出了。
applicationContext.xml
在该文件中配置id为dataSource的数据源Bean和id为jdbcTemplate的JDBC模板Bean,并将数据源注入JDBC模板中。代码如下:
<?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.xsd">
<!--1.配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动-->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<!--连接数据库的url-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC"/>
<!--连接数据库的用户名-->
<property name="username" value="root"/>
<!--连接数据库的密码-->
<property name="password" value="1424025155abc"/>
</bean>
<!--2.配置JDBC模板-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--默认必须使用数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
JdbcTemplateTest.java
在src.java目录下创建一个com.ssm.jdbc包,在该包中创建测试类JdbcTemplateTest.
package com.ssm.jdbc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateTest {
public static void main(String[] args) {
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 获取JdbcTemplate实例
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//3.使用execute()方法执行SQL语句,往spring_text表中插入一条数据
jdbcTemplate.execute("insert into sprint_text(username,password) values ('小鑫','726599');");
System.out.println("插入成功");
}
}
成功运行程序后,可以发送spint_text表中多出了一条数据.
update()——更新数据
update()方法可以完成插入、更新和删除数据的操作。JdbcTemplate类中提供了一系列update()方法,如下表所示:
User.java
在com.ssm.jdbc包中创建User类,为数据Model
package com.ssm.jdbc;
//User实例类
public class User {
private Integer id; //用户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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserDao.java
在com.ssm.jdbc包中创建接口UserDao,并在接口中定义添加、更新和删除用户的方法,代码如下:
package com.ssm.jdbc;
public interface UserDao {
//1.添加用户
public int addUser(User user);
//2.更新用户方法
public int updateUser(User user);
//3.删除用户方法
public int deleteUser(int id);
}
UserDaoImpl.java
在com.ssm.jdbc包中创建UserDao接口的实现类UserDaoImpl,并在类中实现添加、更新和删除账户的方法,代码如下:
package com.ssm.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;
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 sprint_text(username,password) values(?,?)";
Object[] objects = new Object[]{
user.getUsername(),
user.getPassword()
};
int num = jdbcTemplate.update(sql,objects);
return num;
}
//更新用户方法
@Override
public int updateUser(User user) {
String sql = "update sprint_text set username=?,password=? where id=?";
Object[] params = new Object[]{
user.getUsername(),
user.getPassword(),
user.getId()
};
int num = jdbcTemplate.update(sql,params);
return num;
}
@Override
//删除用户方法
public int deleteUser(int id) {
String sql = "delete from sprint_text where id = ?";
int num = jdbcTemplate.update(sql,id);
return 0;
}
}
applicationContext.xml
在applicationContext.xml中定义一个id为userDao的Bean,该Bean用于将jdbcTemplate注入userDao实例中,代码如下:
<!--定义id为userDao的Bean-->
<bean id="userDao" class="com.ssm.jdbc.UserDaoImpl">
<!--将jdbcTemplate注入userDao实例中-->
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
JdbcTemplateTest.java
在测试类JdbcTemplateTest中添加一个测试方法addUserTest。用于添加用户信息。
private static void addUserTest(){
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取userDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//创建user实例
User user = new User();
user.setUsername("小鑫好看錒");
user.setPassword("1111111");
//添加用户
int num = userDao.addUser(user);
if(num>0){
System.out.println("成功插入了"+num+"条数据");
}else{
System.out.println("插入操作执行失败");
}
}
运行程序后,打开SQLyong发现多了一条数据。
接着在添加一个测试方法updateUserTest(),用于修改用户数据,代码如下:
private static void updateUserTest(){
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取userDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//创建user实例
User user = new User();
user.setId(1);
user.setUsername("小鑫是仙女");
user.setPassword("1456789");
//更新用户
int num = userDao.updateUser(user);
if(num>0){
System.out.println("成功更新了"+num+"条数据");
}else{
System.out.println("插入操作执行失败");
}
}
更新数据,我们增加了id属性值的设置, 因为我们是根据id去修改用户。运行程序后,打开SQLyong,发现id为1的数据得到了更新
添加一个测试方法deleteUser() 用来删除用户,代码如下:
public static void deleteUser(){
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取userDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
int num = userDao.deleteUser(2);
if(num>0){
System.out.println("成功删除了"+num+"条数据");
}else{
System.out.println("插入操作执行失败");
}
}
在删除操作中,我们删除id为2的数据,运行程序后,打开SQLyong,发现id为2的数据已经被删除了。
query()——查询数据
JdbcTemplate类中提供了大量的query()方法来处理各种对数据库表的查询操作。其中常用的query()方法如下表所示:
1.我们先调用addUserTest()方法,往数据库中添加几条用户数据。
2.在UserDao中创建一个通过id查询一个通过id查询单个用户和查询所有用户的方法,代码如下:
//通过id查询用户
public User findUserById(int id);
//查询所有用户
public List<User> findAllUser();
3.在UserDao接口的实现类UserDaoImpl中实现接口中的方法,并使用query()方法分别进行查询,代码如下:
//通过id查询用户数据
@Override
public User findUserById(int id) {
String sql = "select * from sprint_text where id=?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
return (User) jdbcTemplate.queryForObject(sql,rowMapper,id);
}
//查询所有用户数据信息
@Override
public List<User> findAllUser() {
String sql = "select * from sprint_text";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
return jdbcTemplate.query(sql,rowMapper);
}
其中,BeanPropertyRowMapper是RowMapper接口的实现类,可以自动地将数据表中的数据映射到用户自定义类中(前提是用户自定义类中的字段要与数据表中的字段相对应)。创建完BeanPropertyRowMapper对象后,在findUserById()方法中通过quertForObject()方法返回了一个Object类型的单行记录,而在findAllUser()方法中通过query()方法返回了一个集合列表。
4.在JdbcTemplateTest中添加一个测试方法,在findUserByIdTest()来测试条件查询,代码如下:
public static void findUserByIdTest(){
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取userDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//通过id查询用户数据信息
User user = userDao.findUserById(5);
System.out.println(user);
}
运行程序,通过findUserById()方法获取了id为5的用户信息,结果如下:
5.接着在测试类JdbcTemplate中添加一个测试方法findAllUserTest()来测试所有用户信息,代码如下:
public static void findAllUserTest(){
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取userDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//通过id查询用户数据信息
List<User> userList = userDao.findAllUser();
System.out.println(userList);
}
运行程序,控制台可以看到,我们将所有的用户查询出来了。