【MyBatis笔记07】MyBatis中的批量操作(批量新增、批量删除、批量更新)
这篇文章,主要介绍MyBatis框架如何实现数据的批量操作,包括(批量新增、批量删除、批量更新)。
目录
一、MyBatis批量操作
1.1、准备环境
(1)SQL建表语句
(2)User实体类
1.2、批量新增
(1)创建Mapper接口
(2)创建XML映射文件
(3)测试程序
1.3、批量删除
(1)常见Mapper接口
(2)创建XML映射文件
(3)测试程序
1.4、批量更新
(1)创建Mapper接口
(2)创建XML映射文件
(3)测试程序
一、MyBatis批量操作
对数据的批量操作在实际开发过程里面是使用比较多的,从我个人的工作里面,我就遇见了很多的情况,比如:数据的批量新增,批量更新等等。下面就分别介绍如何通过MyBatis框架实现数据的批量操作。
1.1、准备环境
这篇文章的批量操作都将是针对User用户表,下面给出相关的代码。
(1)SQL建表语句
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` varchar(50) DEFAULT NULL COMMENT '用户名称',
`password` varchar(50) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3010 DEFAULT CHARSET=utf8;
(2)User实体类
package com.mybatis.demo.domain;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:21
* @Description
*/
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;
}
}
1.2、批量新增
批量新增可以有多种方式,例如:通过【for循环insert】执行插入,也可以通过【insert...values(),(),()】的方式一次性插入多条数据,或者在一个会话里面一次性执行多个【insert】语句。这里不介绍for循环的方式,因为效率太慢了,实际开发里面也不允许这么操作。
(1)创建Mapper接口
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:21
* @Description
*/
public interface UserMapper {
/**
* 批量查询
* @param userList
* @return
*/
int batchInsert(@Param("userList") List<User> userList);
}
(2)创建XML映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 批量插入 -->
<insert id="batchInsert" parameterType="com.mybatis.demo.domain.User">
insert into user(id, username, password)
values
<foreach collection="userList" item="user" separator=",">
(#{user.id},
#{user.username},
#{user.password})
</foreach>
</insert>
</mapper>
(3)测试程序
package com.mybatis.demo;
import com.mybatis.demo.domain.User;
import com.mybatis.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:23
* @Description
*/
public class BatchTest {
public static void main(String[] args) throws IOException {
// 1、加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3、创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = builder.build(is);
// 4、创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5、获取 UserMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行批量操作
List<User> list = createData();
int record = userMapper.batchInsert(list);
System.out.println("record: " + record);
// 提交事务: mybatis 默认是不会自动提交事务的
sqlSession.commit();
// 关闭流
sqlSession.close();
is.close();
}
private static List<User> createData() {
List<User> list = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
User user = new User();
user.setId(10000 + i);
user.setUsername("uname000" + i);
user.setPassword("test000" + i);
list.add(user);
}
return list;
}
}
运行上面测试程序,查看数据库就可以看到批量插入的数据啦。
批量插入之后,方法返回的是一个数字,这个数字代表的是受影响的行数,也就是成功插入了多少条数据。
1.3、批量删除
批量删除这种功能应该比较常见了吧,在一个多选表格里面,勾选哪些记录,然后调用批量删除就可以成功的将这些选中的数据直接删掉。批量删除情况下,一般是给定需要删除的记录标识,然后通过【IN】关键字,将其作为删除条件实现的。
(1)常见Mapper接口
package com.mybatis.demo.mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:21
* @Description
*/
public interface UserMapper {
/**
* 批量删除
* @param ids
* @return
*/
int batchDelete(@Param("ids") List<Integer> ids);
}
(2)创建XML映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 批量删除 -->
<delete id="batchDelete" parameterType="java.lang.Integer">
delete from user
where id in
<foreach collection="ids" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</delete>
</mapper>
(3)测试程序
package com.mybatis.demo;
import com.mybatis.demo.domain.User;
import com.mybatis.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:23
* @Description
*/
public class BatchDeleteTest {
public static void main(String[] args) throws IOException {
// 1、加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3、创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = builder.build(is);
// 4、创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5、获取 UserMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行批量操作
List<Integer> list = createData();
int record = userMapper.batchDelete(list);
System.out.println("record: " + record);
// 提交事务: mybatis 默认是不会自动提交事务的
sqlSession.commit();
// 关闭流
sqlSession.close();
is.close();
}
private static List<Integer> createData() {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
list.add(10000 + i);
}
return list;
}
}
1.4、批量更新
批量更新是通过mybatis的foreach标签生成多条update语句实现的,如下所示。
注意:由于这里批量操作是通过多条【update】语句实现的,所以首先需要让mybatis框架开启批量操作的支持。也就是允许同时执行多条SQL语句。
在mybatis的数据源连接地址后面,添加:【allowMultiQueries=true】属性即可开启批量操作的支持。
(1)创建Mapper接口
package com.mybatis.demo.mapper;
import com.mybatis.demo.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:21
* @Description
*/
public interface UserMapper {
/**
* 批量更新
* @param userList
* @return
*/
int batchUpdate(@Param("userList") List<User> userList);
}
(2)创建XML映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
<!-- 批量更新 -->
<update id="batchUpdate" parameterType="com.mybatis.demo.domain.User">
<foreach collection="userList" item="user" separator=";">
update user
set username = #{user.username},
password = #{user.password}
where id = #{user.id}
</foreach>
</update>
</mapper>
(3)测试程序
package com.mybatis.demo;
import com.mybatis.demo.domain.User;
import com.mybatis.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* @author ZhuYouBin
* @version 1.0.0
* @Date: 2022/9/1 16:23
* @Description
*/
public class BatchUpdateTest {
public static void main(String[] args) throws IOException {
// 1、加载配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3、创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = builder.build(is);
// 4、创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5、获取 UserMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行批量操作
List<User> list = createData();
int record = userMapper.batchUpdate(list);
System.out.println("record: " + record);
// 提交事务: mybatis 默认是不会自动提交事务的
sqlSession.commit();
// 关闭流
sqlSession.close();
is.close();
}
private static List<User> createData() {
List<User> list = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
User user = new User();
user.setId(10000 + i);
user.setUsername("uname_update000" + i);
user.setPassword("test_update000" + i);
list.add(user);
}
return list;
}
}
注意:因为这里是执行了多条update语句,每次执行的update语句只会更新一条数据,所以mapper接口方法的返回值不是表示受影响的总记录数,而是最后一次执行update更新的记录数。
以上,就是MyBatis框架实现批量操作的具体代码。
综上,这篇文章结束了,主要介绍MyBatis框架如何实现数据的批量操作,包括(批量新增、批量删除、批量更新)。