当前位置: 首页 > news >正文

【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框架如何实现数据的批量操作,包括(批量新增、批量删除、批量更新)。

相关文章:

  • Fisher信息与最大似然估计的渐进正态性(附有在Bernoulli分布上的计算)
  • Patroin源码修改八:初始化Opengauss
  • 金仓数据库 KingbaseES 插件参考手册 zhparser
  • 多御安全浏览器超强版本发布:新增密码检查功能
  • java架构知识-设计模式与实践(学习笔记)
  • Evil.js(罪恶的) —— 代码
  • 全球与中国多壁碳纳米管行业市场调查及投资竞争力分析报告2022-2028年
  • java计算机毕业设计交通事故档案管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  • linux ifconfig命令:显示或设置网络设备参数信息
  • django请求生命周期流程图 路由匹配 无名分组 有名分组 反向解析 无名有名反向解析 路由分发 名称空间
  • cks 考试指南
  • 全球与中国防水薄膜行业市场前瞻及未来投资潜力预测报告2022-2028年
  • CTFHUB.introduction
  • 基于神经网络的图像识别,人工神经网络图像识别
  • 快鲸智慧楼宇系统:助力商办楼宇快速实现智慧化、数字化运营
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • ES6语法详解(一)
  • HTTP--网络协议分层,http历史(二)
  • Java 内存分配及垃圾回收机制初探
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Linux Process Manage
  • nginx 配置多 域名 + 多 https
  • Promise初体验
  • Python3爬取英雄联盟英雄皮肤大图
  • Redis中的lru算法实现
  • Solarized Scheme
  • 大数据与云计算学习:数据分析(二)
  • 开源地图数据可视化库——mapnik
  • 什么是Javascript函数节流?
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #QT(串口助手-界面)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C#)一个最简单的链表类
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)php新闻发布平台 毕业设计 141646
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ./configure,make,make install的作用(转)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 6 redis操作类
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 受管制代码
  • .net的socket示例
  • .NET企业级应用架构设计系列之开场白
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ1008][HNOI2008]越狱
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C++]类和对象(中)