目录
4.1 Spring JDBC
- Spring的JDBC模块负责数据库资源管理和错误处理,可以简化开发人员对数据库的操作。
4.1.1 Spring JdbcTemplate的解析
对于数据库的操作,Spring框架提供了JdbcTemplate类,这是Spring框架数据抽象层的基础,其他高层次的抽象类是建立在JdbcTemplate类之上的,JdbcTemplate类是Spring JDBC的核心类
JdbcTemplate类继承自抽象类JdbcAccessor,同时实现了JdbcOperations接口。
- JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。
- JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性:
- DataSource:其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布事务的支持,它可以作为访问数据库资源的标准接口。
- SQLExceptionTranslator:org.springframework.jdbc.support.SQLExceptionTranslator接口负责对SQLException进行转译工作。通过必要的设置或者获取SQLExceptionTranslator中的方法可以使JdbcTemplate在需要处理SQLException时委托SQLExceptionTranslator的实现类来完成相关的转译工作。
4.1.2 Spring JDBC的配置
Spring JDBC模块主要由4个包组成
- core(核心包)
- dataSource(数据包)
- object(对象包)
- support(支持包)
Spring对数据库的操作都封装在这几个包中,如果想要使用Spring JDBC,就需要进行配置,JDBC的配置是在applicationContext.xml中完成的。
定义了3个Bean
- dataSource,其中dataSource对应的org.springframework.jdbc.datasource.DriverManagerDataSource类用于对数据源进行配置
- jdbcTemplate,jdbcTemplate对应的org.springframework.jdbc.core.JdbcTemplate类中定义了JdbcTemplate的相关配置。
- 需要注入类的Bean
- 上述代码中dataSource的配置就是JDBC连接数据库时所需的4个属性,如图
4个属性需要根据数据库类型或者机器配置的不同设置相应的属性值。例如,如果数据库类型不同,就需要更改驱动名称;如果数据库不在本地,就需要将地址中的localhost替换成相应的主机IP;如果修改过MySQL数据库的端口号(默认为3306),就需要加上修改后的端口号,如果未修改,那么端口号可以省略;同时连接数据库的用户名和密码需要与数据库创建时设置的用户名和密码保持一致。一般都设置Spring数据库的用户名和密码都是root。
- 定义jdbcTemplate时,需要将dataSource注入jdbcTemplate中,而其他需要使用jdbcTemplate的Bean,也需要将jdbcTemplate注入该Bean中(通常注入Dao(操作)类中,在Dao类中进行与数据库的相关操作)。
4.2 Spring JdbcTemplate的常用方法
JdbcTemplate类中提供了大量更新查询数据库的方法
4.2.1 execute(String sql)—执行SQL语句
实例一
步骤一
在cmd命令行界面打开数据库操作,
mysql -hlocalhost -uroot -p
进入数据库
在MySQL数据库中创建一个名为db_spring的数据库
步骤二
在Eclispe中创建一个Web项目,将所有需要的驱动jar包都导入到lib目录,发布到类路径。
步骤三
创建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-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/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>
步骤四
创建一个测试类JdbcTemplateTest.class。
代码如下
package com.ssm.jdbc;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
*使用excute()方法创建表
*/
public class JdbcTemplateTest {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取JdbcTemplate实例
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//使用execute()方法执行SQL语句,创建用户表user
jdbcTemplate.execute("create table user(" +
"id int primary key auto_increment," +
"username varchar(40)," +
"password varchar(40))");
}
}
运行该程序,再次查询数据库,如图所示,成功创建数据库表user。
4.2.2 update()—更新数据
常用的方法
实例二
- 创建User类
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,定义对User用户的操作方法
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);
}
- 创建UserDao接口的实现类
package com.ssm.jdbc;
import java.util.List;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
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;
}
}
- 在配置文件中定义一个id为userDao的Bean,用于将jdbcTemplate注入userDao实例中,代码如下
<!-- 定义id为userDao的Bean -->
<bean id="userDao" class="com.ssm.jdbc.UserDaoImpl">
<!--将 jdbcTemplate注入到 userDao实例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
- 创建测试类
package com.ssm.jdbc;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
*使用excute()方法创建表
*/
public class JdbcTemplateTest {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取JdbcTemplate实例
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//使用execute()方法执行SQL语句,创建用户表user
/*jdbcTemplate.execute("create table user(" +
"id int primary key auto_increment," +
"username varchar(40)," +
"password varchar(40))");*/
}
@Test
public void addUserTest(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123456");
int num=userDao.addUser(user);
if(num>0){
System.out.println("成功插入了"+num+"条数据。");
}else{
System.out.println("插入操作执行失败。");
}
}
@Test
public void updateUserTest(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
User user = new User();
user.setId(2);
user.setUsername("lisi");
user.setPassword("666666");
int num=userDao.updateUser(user);
if(num>0){
System.out.println("成功更新了"+num+"条数据。");
}else{
System.out.println("更新操作执行失败。");
}
}
@Test
public void deleteUserTest(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
int num=userDao.deleteUser(1);
if(num>0){
System.out.println("成功删除了"+num+"条数据。");
}else{
System.out.println("删除操作执行失败。");
}
}
}
4.2.3 query()—查询数据
常用方法
-
向数据库表中插入几条数据,方便查询结果检验
-
在UserDao中分别创建一个通过id查询单个用户和查询所有用户的方法
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();
}
- 在UserDaoImpl实现中实现新增的方法
package com.ssm.jdbc;
import java.util.List;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
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;
}
//通过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()方法返回了一个结果集合。
- 在测试类中新增测试方法来查询
@Test
public void findUserByldTest(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
User user=userDao.findUserById(2);
System.out.println(user);
}
@Test
public void findAllUserTest(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
List<User> list=userDao.findAllUser();
for(User user:list){
System.out.println(user);
}
}
运行结果如下