目录
- 1.Spring JDBC
- 1.1 Spring JdbcTemplate的解析
- 1.2 Spring JDBC的配置
- 2 Spring JdbcTemplate的常用方法
- 2.1 execute()——执行SQL语句
- 2.2 update()——更新数据
- 2.3 query()——查询数据
1.Spring JDBC
1.1 Spring JdbcTemplate的解析
针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础,其他更高层次的抽象类是构建于JdbcTemplate类之上的。可以说,JdbcTemplate类是Spring JDBC的核心类。JdbcTemplate类的继承关系十分简单。它继承自抽象类JdbcAccessor,同时实现了JdbcOperations接口。
(1)JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。
(2)JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性,具体如下。
- DataSource:其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布事务的支持,它可以作为访问数据库资源的标准接口。
- SQLExceptionTranslatororg.springframework.jdbc.support.SQLExceptionTranslator接口负责对SQLException进行转译工作。通过必要的设置或者获取SQLExceptionTranslator中的方法可以使JdbcTemplate在需要处理SQLException时委托SQLExceptionTranslator的实现类来完成相关的转译工作。
1.2 Spring JDBC的配置
Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据包)、object(对象包)和support(支持包)。关于这4个包的具体说明如表所示。
Spring对数据库的操作都封装在了这几个包中,如果想要使用Spring JDBC,就需要对其进行配置。在Spring中,JDBC的配置是在配置文件applicationContext.xml中完成的,其配置模板如下所示。
<?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.DriverMangerDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- 连接数据库url -->
<property name="url" value="jdbc:mysql://localhost:3306/db_spring"/>
<!-- 连接数据库的用户名 -->
<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>
<!-- 3.配置注入类 -->
<bean id="xxx" class="xxx">
<!-- 默认必须使用数据源 -->
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
</beans>
在上述代码中定义了3个Bean,分别是dataSource、jdbcTemplate和需要注入类的Bean。其中dataSource对应的org.springframework.jdbc.datasource.DriverManagerDataSource
类用于对数据源进行配置,jdbcTemplate对应的org.springframework.jdbc.core.JdbcTemplate
类中定义了JdbcTemplate的相关配置。上述代码中dataSource的配置就是JDBC连接数据库时所需的4个属性,如表所示。
定义jdbcTemplate时,需要将dataSource注入jdbcTemplate中,而其他需要使用jdbcTemplate的Bean,也需要将jdbcTemplate注入该Bean中(通常注入Dao类中,在Dao类中进行与数据库的相关操作)。
2 Spring JdbcTemplate的常用方法
在JdbcTemplate类中提供了大量更新和查询数据库的方法,我们就是使用这些方法来操作数据库的。
2.1 execute()——执行SQL语句
execute(String sql)方法能够完成执行SQL语句的功能。
【示例4-1】下面以创建数据表的SQL语句为例演示此方法的使用,具体步骤如下。
步骤01 在MySQL中创建一个名为db_spring的数据库。
步骤02 在idea中创建一个名为chapter00的Web项目。
步骤03 在src目录下创建配置文件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.DriverMangerDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- 连接数据库url -->
<property name="url" value="jdbc:mysql://localhost:3306/db_spring"/>
<!-- 连接数据库的用户名 -->
<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>
步骤04 在src目录下创建一个com.ssm.jdbc包,在该包中创建测试类JdbcTemplateTest。在该类的main()方法中通过Spring容器获取在配置文件中定义的JdbcTemplate实例,然后使用实例的execute(String s)方法执行创建数据表的SQL语句。
package com.ssm.jdbc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* 使用excute()方法创建表
*
* @author: 衍生星球
* @date: 2023年04月21日 9:37
*/
public class JdbcTemplateTest {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取jdbcTemplate实例
JdbcTemplate jdbcTemplate =(JdbcTemplate)applicationContext.getBean("jdbcTemplate");
//使用excute()方法执行sql语句,创建用户表user
jdbcTemplate.execute("create table user(" +
"id int primary key auto_increment," +
"username varchar(40)," +
"password varchar(40))");
}
}
2.2 update()——更新数据
update()方法可以完成插入、更新和删除数据的操作。在JdbcTemplate类中提供了一系列update()方法,其常用格式如表所示。
【示例4-2】通过一个用户管理的案例来演示update()方法的使用,具体步骤如下。
步骤01 在chapter00项目的com.ssm.jdbc包中创建User类,在该类中定义id、username和password属性,以及其对应的getter()/setter()方法。
package com.ssm.jdbc;
/**
* 功能描述
*
* @author: 衍生星球
* @date: 2023年04月22日 19:21
*/
// 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;
}
public String toString() {
return "User [id=" +id+ ", username=" +username+", password=" + password + "]";
}
}
步骤02 在com.ssm.jdbc包中创建接口UserDao,并在接口中定义添加、更新和删除用户的方法。
package com.ssm.jdbc;
public interface UserDao {
//添加用户方法
public int addUser(User user);
//更新用户方法
public int updateUser(User user);
//删除用户方法
public int deleteUser(int id);
}
步骤03 在com.ssm.jdbc包中创建UserDao接口的实现类UserDaoImpl,并在类中实现添加、更新和删除账户的方法。
package com.ssm.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* 功能描述
*
* @author: 衍生星球
* @date: 2023年04月22日 19:37
*/
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
//添加用户方法
public int addUser(User user) {
String sql = "insert into user(username,password) value(?,?)";
Object[] obj = new Object[] {
user.getUsername(),
user.getPassword()
};
int num = this.jdbcTemplate.update(sql,obj);
return num;
}
//更新用户方法
public int updateUser(User user) {
String sql = "update user set username=? ,password=? where id=?";
Object[] params = new Object[] {
user.getUsername(),
user.getPassword(),
user.getId()
};
int num = this.jdbcTemplate.update(sql,params);
return num;
}
//删除用户方法
public int deleteUser(int id) {
String sql = "delete from user where id=?";
int num = this.jdbcTemplate.update(sql,id);
return num;
}
}
添加、更新和删除操作的实现步骤类似,只是定义的SQL语句有所不同。
步骤04 在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>
步骤05 在测试类JdbcTemplateTest中添加一个测试方法addUserTest()。该方法主要用于添加用户信息。
package com.ssm.jdbc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 添加用户方法
*
* @author: 衍生星球
* @date: 2023年04月21日 9:37
*/
public class JdbcTemplateTest {
@Test
public void addUserTest() {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取userDao实例
UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
//创建User实例
User user = new User();
//创建User实例属性值
user.setUsername("zhangsan");
user.setPassword("123456");
//添加用户
int num = userDao.addUser(user);
if (num>0) {
System.out.println("成功插入了" + num + "条数据。");
} else {
System.out.println("添加用户失败!");
}
}
}
获取UserDao的实例后又创建了User对象,并向User对象中添加了属性值。然后调用UserDao对象的addUser()方法向数据表中添加一条数据。最后,通过返回的受影响的行数来判断数据是否插入成功。运行后,控制台的输出结果如图所示。
此时再次查询数据库中的user表,其结果如图所示。从中可以看出,使用JdbcTemplate的update()方法已成功地向数据表中插入了一条数据。
步骤06 执行完插入操作后,接下来使用JdbcTemplate类的update()方法执行更新操作。在测试类JdbcTemplateTest中添加一个测试方法updateUser Test()。
@Test
public void updateUserTest() {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取userDao实例
UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
User user = new User();
user.setId(1);
user.setUsername("lisi");
user.setPassword("111111");
//更新用户
int num = userDao.updateUser(user);
if (num>0) {
System.out.println("更新成功了" + num + "条数据。");
} else {
System.out.println("更新用户失败!");
}
}
与addUserTest()方法相比,更新操作的代码增加了id属性值的设置,并在将用户名和密码修改后调用了UserDao对象中的updateUser()方法执行对数据表的更新操作。使用JUnit4运行方法后,再次查询数据库中的user表,其结果如图所示。从中可以看出,使用update()方法已成功更新了user表中id为1的用户的用户名和密码。
步骤07 在测试类JdbcTemplateTest中添加一个测试方法deleteUserTest()来执行删除操作。
@Test
public void deleteUserTest() {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取userDao实例
UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
//删除用户
int num = userDao.deleteUser(1);
if (num>0) {
System.out.println("成功删除了" + num + "条数据。");
} else {
System.out.println("删除用户失败!");
}
}
在上述代码中,获取了UserDao的实例后,执行实例中的deleteUser()方法来删除id为1的数据。
运行方法后,查询user表中的数据,其结果如图所示。从中可以看出,已成功通过deleteUser()方法删除了id为1的数据。由于user表中只有一条数据,因此删除后表中数据为空。
2.3 query()——查询数据
JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作。其中常用的几个query()方法格式如表所示。
【示例4-3】通过一个具体的案例演示query()方法的使用,其实现步骤如下。
步骤01 向数据表user中插入几条数据,插入后user表中的数据如图所示。
步骤02 在UserDao中分别创建一个通过id查询单个用户和查询所有用户的方法。
//通过id查询用户
public User findUserById(int id);
//查询所有用户
public List<User> findAllUser();
步骤03 在UserDao接口的实现类UserDaoImpl中实现接口中的方法,并使用query()方法分别进行查询。
//通过id查询用户数据信息
public User findUserById(int id) {
String sql = "select * from user where id=?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
return this.jdbcTemplate.queryForObject(sql,rowMapper,id);
}
//查询所有用户数据信息
public List<User> findAllUser() {
String sql = "select * from user";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
return this.jdbcTemplate.query(sql,rowMapper);
}
在上面两个方法代码中,BeanPropertyRowMapper
是RowMapper接口的实现类,可以自动地将数据表中的数据映射到用户自定义的类中(前提是用户自定义类中的字段要与数据表中的字段相对应)。创建完BeanPropertyRowMapper对象后,在findUserById()方法中通过queryForObject()方法返回了一个Object类型的单行记录,而在findAllUser()方法中通过query()方法返回了一个结果集合。
步骤04 在测试类 JdbcTemplateTest中添加一个测试方法findUserByIdTest()来测试条件查询,其代码如下所示。
@Test
public void findUserByIdTest() {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取userDao实例
UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
//通过id查询用户数据信息
User user = userDao.findUserById(5);
System.out.println(user);
}
上述代码通过执行findUserById()方法获取了id为1的对象信息,并通过输出语句输出。运行后,控制台的输出结果如图所示。
步骤05 在测试类JdbcTemplateTest中添加一个测试方法findAllUserTest()来测试所有用户信息。
@Test
public void findAllUserTest() {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取userDao实例
UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
//查询所有用户数据信息
List<User> list = userDao.findAllUser();
//循环输出用户信息
for (User user:list) {
System.out.println(user);
}
}
在上述代码中,调用了UserDao对象的findAllUser()
方法查询所有用户账户信息,并通过for循环输出查询结果。运行findAllUser()方法后,控制台的显示信息如图所示,数据表user中的4条记录都已经被查询出来。