4.1 Spring JDBC
4.1.1 Spring jdbc Template的解析
JdbcTemplate继承自抽象了JdbcAccessor,同时实现了JdbcOperations接口。
(1)JdbcOperations接口定义了再JdbcTemplate类中可以使用的操作集合,包括增删改查等操作
(2)JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性:
- DataSource:主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布事务的支持,它可以做诶访问数据库资源的标准接口。
- SQLExceptionTranslator:负责对SQLException进行转译工作。通过必要的设置或者获取SQLExceptionTranslator中的方法可以使JdbcTemplate在需要处理SQLException是委托它来完成相关的转译工作。
4.1.2 SpringJDBC的配置
SpringJDBC模块主要由4个包组成,分别是core(核心包)、DataSource(数据包)、object(对象包)和support(支持包)。
Spring对数据库的操作都封装在这几个包中,如果想要使用SpringJDBC,据需要对其进行配置。在Spring中,JDBC的配置是在配置文件applicationContext.xml中完成的,其配置模板:
上述代码定义了3个Bean,分别是DataSource,JdbcTemplate和需要注入类的Bean。其中DataSource对应的类用于对数据源进行配置,JdbcTemplate对应的类定义了JdbcTemplate的相关配置。上述代码中DataSource的配置就是JDBC连接数据库时所需的4个属性
如果数据库不在本地,就需要将地址中的localhost替换成相应的主机IP;如果修改过MySQL数据库的端口号,就需要加上修改后的端口号,如果为修改,那么端口号可以省略;同时连接数据库的用户名和密码需要与数据库创建时的用户名和密码保持一致。
定义JdbcTemplate时需要将DataSource注入JdbcTemplate中,而其他需要使用JdbcTemplate的Bean,也需要将JdbcTemplate注入其中(通常注入Dao类)
4.2 SpringJdbcTemplate的常用方法
4.2.1 execute()——执行SQL语句
示例4-1
-
在MySQL中创建一个名为db_spring的数据库。
首先使用SQL语句创建了数据库db_spring,然后选择使用db_spring,为了便于后续验证数据表是通过execute(string sql)方法执行创建的,这里使用了show tables语句查看数据库中的表,结果显示为空。
-
创建项目,导入jar包,mysql数据库驱动包,SpringJDBC包以及Spring事务处理包。
-
在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.DriverManagerDataSource">
<!-- 数据库驱动-->
<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>
- 创建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;
/**
* 使用excute()方法创建表
*/
public class JdbcTemplateTest {
public static void main(String[] args){
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取JdbcTemplate实例
JdbcTemplate jdbcTemplate= (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//使用execute方法执行语句,创建用户表user
jdbcTemplate.execute("create table user("+
"id int primary key auto_increment,"+
"username varchar(40),"+
"password varchar(40))");
}
}
成功运行后查询结果
4.2.2 update()——更新数据
updata()方法可以完成插入更新删除数据的操作
示例4-2
- 创建user类,定义id、username、password属性,以及对应getter()/setter()方法
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,定义添加更新删除方法。
package com.ssm.jdbc;
public interface UserDao {
public int addUser(User user);
public int updateUser(User user);
public int deleteUser(int id);
}
3.创建接口实现类
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;
}
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;
}
}
- 在applicationContext.xml中定义一个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 org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class addUserTest {
public static void main(String[] args){
// 加载配置文件
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("插入操作执行失败。");
}
}
}
运行结果
- 添加测试类updataUserTest
package com.ssm.jdbc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class updateUserTest {
public static void main (String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao= (UserDao) applicationContext.getBean("userDao");
User user = new User();
user.setId(1);
user.setUsername("tom");
user.setPassword("111111");
//更新用户
int num=userDao.updateUser(user);
if (num>0){
System.out.println("成功更新了"+num+"条数据。");
}else{
System.out.println("更新操作执行失败。");
}
}
}
- 添加测试类deleteUserTest
package com.ssm.jdbc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class deleteUserTest {
public static void main(String[] args){
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()——查询数据
示例4-3
- 向user表中插入几条数据。
- 在UserDao中分别创建一个通过id查询单个用户和查询所有用户的方法
public User findUserById(int id);
public List<User> findAllUser();
- 在实现类中实现接口方法,并使用query()方法分别进行查询
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中返回了一个Object类型的单行记录,在findAllUser中返回了一个结果集。
- 添加测试类 findUserByIdTest
package com.ssm.jdbc.test;
import com.ssm.jdbc.User;
import com.ssm.jdbc.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class findUserByIdTest {
public static void main(String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过id查询用户信息
UserDao userDao= (UserDao) applicationContext.getBean("userDao");
User user=userDao.findUserById(2);
System.out.println(user);
}
}
- 添加测试类findAllUserTest
package com.ssm.jdbc.test;
import com.ssm.jdbc.User;
import com.ssm.jdbc.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class findAllUserTest {
public static void main(String[] args){
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);
}
}
}