• MyBatis 使用 foreach 批量插入


    MyBatis 使用 foreach 批量插入

    参考博文

    老司机学习MyBatis之动态SQL使用foreach在MySQL中批量插入

    使用MyBatis一次性插入多条数据时候可以使用 <foreach> 标签。

    yml文件

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db3?serverTimezone=Asia/Shanghai&allowMultiQueries=true
        username: root
        password: root
    
    mybatis:
      type-aliases-package: com.mozq.boot.sbmybatis02.domain
      mapper-locations: classpath:mapper/*Mapper.xml
    

    第1种方式 单条语句插入多个值

    可以使用 useGeneratedKeys 返回每个插入记录的主键。

    修改 Mapper 添加批量插入方法

    @Mapper
    public interface UserMapper {
        void batchSave(List<User> userList);
    }
    

    修改映射文件 添加批量插入映射语句

    <insert id="batchSave">
        insert into user(name, password) values
        <foreach collection="list" item="user" separator=",">
            (#{user.name}, #{user.password})
        </foreach>
    </insert>
    

    测试接口

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SbMybatis02ApplicationTests {
        @Test
        public void testBatchSave(){
            User user1 = new User();
            user1.setName("关羽");
            user1.setPassword("guanyu");
            User user2 = new User();
            user2.setName("张飞");
            user2.setPassword("zhangfei");
            List<User> userList  = new ArrayList<>();
            userList.add(user1);
            userList.add(user2);
    
            userMapper.batchSave(userList);
        }
    }
    

    第2种方式 多条语句插入多个值

    如果插入的同时获取主键,则只有第1条记录可以获取到,其他记录获取不到生成的主键。

    修改 Mapper 添加批量插入方法

    @Mapper
    public interface UserMapper {
        void batchSave(List<User> userList);
    }
    

    修改映射文件 添加批量插入映射语句

    <insert id="batchSave">
        <foreach collection="list" item="user" separator=";">
            insert into user(name, password) values
            (#{user.name}, #{user.password})
        </foreach>
    </insert>
    

    修改 jdbcUrl 允许执行多条语句

    jdbc:mysql://localhost:3306/db3?serverTimezone=Asia/Shanghai&allowMultiQueries=true
    

    测试接口

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SbMybatis02ApplicationTests {
        @Test
        public void testBatchSave(){
            User user1 = new User();
            user1.setName("关羽");
            user1.setPassword("guanyu");
            User user2 = new User();
            user2.setName("张飞");
            user2.setPassword("zhangfei");
            List<User> userList  = new ArrayList<>();
            userList.add(user1);
            userList.add(user2);
    
            userMapper.batchSave(userList);
        }
    }
    

    bugs

    Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into user(name, password) values('张飞', 'zhangfei')' at line 4
    方案:
    	jdbcUrl 添加参数 allowMultiQueries=true
    
  • 相关阅读:
    vim插件:显示树形目录插件NERDTree安装 和 使用【转】
    CMake 入门实战【转】
    在 linux 下使用 CMake 构建应用程序【转】
    Buildroot构建指南——根文件系统(Rootfs)【转】
    Buildroot构建指南--快速上手与实用技巧【转】
    Vim升华之树形目录插件NERDTree安装图解【转】
    【转】Android端与Android端利用WIFI进行FTP通信
    【转】Android 服务器之SFTP服务器上传下载功能 -- 不错
    【转】session setup failed: NT_STATUS_LOGON_FAILURE -- 不错
    【转】Mac OS X开机启动Path had bad permissions错误解决方案
  • 原文地址:https://www.cnblogs.com/mozq/p/11480465.html
Copyright © 2020-2023  润新知