• 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
    
  • 相关阅读:
    小程序工程化探索:大规模场景下的问题和解决方案----------------引用
    对Taro Next小程序跨框架开发的探索与实践-----------------引用
    对Node.js 中的依赖管理------------引用
    对redux的研究--------引用
    JavaScript 中的 for 循环---------------引用
    对JavaScript 模块化的深入-----------------引用
    对Webpack 应用的研究-----------------引用
    webpack5持久化缓存
    设置x 轴斜体(每次我都百度,这次单独为它发一个)
    字典元组列表常用方法
  • 原文地址:https://www.cnblogs.com/mozq/p/11480465.html
Copyright © 2020-2023  润新知