Spring JDBCTemplate的介绍及使用
Spring JDBC
- 传统的JDBC即使执行一条简单的SQL语句,其过程也不简单,要先打开数据库连接执行SQL语句,然后组装结果,最后关闭数据库资源,但太多的try…catch…finally…语句,造成了代码泛滥。在Spring出现之后,为了解决这些问题,Spring提供了自己的方案,就是JDBCTemplate模板。
Spring JDBCTemplate
- Spring框架在数据库开发中的应用主要使用的是JDBCTemplate类,它是Spring针对JDBC代码失控提供的解决方案。JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和获取结果。
在JdbcTemplate中执行SQL语句的方法大致分为3类:
- execute():可以执行所有SQL语句,一般用于执行DDL语句。
- update():用于执行INSERT、UPDATE、DELETE等DML语句。
- query():用于DQL数据查询语句。
JdbcTemplate配置连接池
org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
public JdbcTemplate(DataSource dataSource)
创建JdbcTemplate对象,方便执行SQL语句
public void execute(final String sql)
execute可以执行所有SQL语句,因为没有返回值,一般用于执行DDL语句。
JdbcTemplate使用步骤
1.导入依赖jar包
2.编写Spring配置文件applicationContext.xml,配置dataSource数据源,配置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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置数据源 -->
<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/demo?serverTimezone=UTC"/>
<!-- 连接数据库的用户名 -->
<property name="username" value="root"/>
<!-- 连接数据库的密码 -->
<property name="password" value="root"/>
</bean>
<!-- 配置jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置一个id为userDao的bean -->
<bean id="userDao" class="com.ssm.dao.impl.UserDaoImpl">
<!--将jdbcTemplate注入到UserDao实例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
</beans>
3.创建JdbcTemplate对象
4.调用execute()、update()、query()等方法
代码示例:
public class TestJdbcTemplate {
public static void main(String[] args) {
//初始化spring容器,加载applicationContext.xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取JdbcTemplate的实例
JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
String sql="create table user(id int primary key auto_increment,
username varchar(20),password varchar(32))";
//使用execute方法创建用户表
jdbcTemplate.execute(sql);
System.out.println("用户表user创建成功!");
}
}
JdbcTemplate实现增删改
API介绍
org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
public int update(final String sql)
用于执行`INSERT`、`UPDATE`、`DELETE`等DML语句。
使用步骤
- 创建JdbcTemplate对象
- 编写SQL语句
- 使用JdbcTemplate对象的update方法进行增删改
代码示例:
UserDaoImpl
public class UserDaoImpl implements UserDao{
JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public int addUser(User u) {
String sql="insert into user(username,password) values(?,?)";
//使用数组来存储SQL语句中的参数
Object[] params=new Object[] {u.getUserName(),u.getPassword()};
//执行添加操作,返回的是受SQL影响的记录条数
int count=jdbcTemplate.update(sql, params);
return count;
}
@Override
public int deleteUser(int id) {
String sql="delete from user where id=?";
//执行删除操作,返回的是受SQL影响的记录条数
int count=jdbcTemplate.update(sql, id);
return count;
}
@Override
public int updateUser(User user) {
String sql="update user set username=?,password=? where id=?";
//使用数组来存储SQL语句中的参数
Object[] params=new Object[]{user.getUserName(),user.getPassword(),user.getId()};
//执行更新操作,返回的是受SQL影响的记录条数
int count=jdbcTemplate.update(sql,params);
return count;
}
}
测试类
/*
*添加用户
*/
@Test
public void testAdd() {
//初始化spring容器,加载applicationContext.xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao实例
UserDao userdao=(UserDao) ctx.getBean("userDao");
//创建User对象,并向User对象中添加数据
User user=new User();
user.setUserName("李白");
user.setPassword("123456");
//执行addUser方法,并获取返回结果
int count=userdao.addUser(user);
if(count>0) {
System.out.println("成功插入"+count+"条数据");
}else {
System.out.println("插入失败");
}
}
/*
删除用户
*/
@Test
public void testDelete() {
//初始化spring容器,加载applicationContext.xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao实例
UserDao userdao=(UserDao) ctx.getBean("userDao");
//执行deleteUser方法,并获取返回结果
int count=userdao.deleteUser(2);
if(count>0) {
System.out.println("成功删除"+count+"条记录");
}else {
System.out.println("删除失败");
}
}
/*
*更新用户
*/
@Test
public void testUpdate() {
//初始化spring容器,加载applicationContext.xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao实例
UserDao userdao=(UserDao) ctx.getBean("userDao");
//创建User对象,并向User对象中添加数据
User user=new User();
user.setId(2);
user.setUserName("杜甫");
user.setPassword("123");
//执行updateUser方法,并获取返回结果
int count=userdao.updateUser(user);
if(count>0) {
System.out.println("成功更新"+count+"条记录");
}else {
System.out.println("更新失败");
}
}
JdbcTemplate查询 – queryForObject返回一个Object
org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
API介绍
public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)
//该方法将args参数绑定到SQL语句中,通过RowMapper返回单行记录,并转换为一个Object类型返回
使用步骤
- 创建JdbcTemplate对象
- 编写查询的SQL语句
- 使用JdbcTemplate对象的queryForObject方法,并传入需要返回的数据的类型
- 输出结果
UserDaoImpl
//通过id查询单个用户信息
public User queryUserById(int id){
//定义单个查询的SQL语句
String sql="select *from user where id=?";
/*
* 创建一个新的BeanPropertyRowMapper对象,
将结果集通过Java反射机制映射到Java对象中
*/
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
//将id绑定到SQL语句中,并通过RowMapper返回一个Object类型的对象
return this.jdbcTemplate.queryForObject(sql, rowMapper,id);
}
测试类
/* 通过id查询单个用户信息*/
@Test
public void testQueryUserById() {
//初始化spring容器,加载applicationContext.xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao实例
UserDao userdao=(UserDao) ctx.getBean("userDao");
//执行queryUserById方法,获取User对象
User user=userdao.queryUserById(3);
System.out.println(user);
}
JdbcTemplate查询-RowMapper返回自定义对象
org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
API介绍
public <T> List<T> query(String sql, RowMapper<T> rowMapper)
执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。
使用步骤
- 创建JdbcTemplate对象
- 编写查询的SQL语句
- 使用JdbcTemplate对象的query方法,并传入RowMapper匿名内部类
- 在匿名内部类中将结果集中的一行记录转成一个User对象
UserDaoImpl
//查询所有用户信息
public List<User> queryAllUser(){
//定义查询所有用户的SQL
String sql="select *from user";
/*创建一个新的BeanPropertyRowMapper对象,*/
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
//执行静态的SQL语句,并通过RowMapper返回结果
return this.jdbcTemplate.query(sql, rowMapper);
}
测试类
/*查找所有用户*/
@Test
public void testQueryAllUser() {
//初始化spring容器,加载applicationContext.xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao实例
UserDao userDao=(UserDao) ctx.getBean("userDao");
//执行queryAllUser方法,获取User对象的集合
List<User> users=userDao.queryAllUser();
//循环输出集合中的对象
for(User u:users) {
System.out.println(u);
}
}