zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    JavaScript备忘录-逻辑运算符
    CMake 构建项目教程-简介
    C++ 跨语言调用 Java
    Thrift-0.10.0 CenOS 7 编译错误 error: expected ')' before 'PRIu32'
    CentOS 7 安装 MySQL Database
    CentOS 安装 Wine
    FreeBSD 配置
    CentOS 6.5 升级 GCC 4.9.3
    Favorite Setting
    shell编程-1到100的求和与冒泡排序
  • 原文地址:https://www.cnblogs.com/mozq/p/11480465.html
Copyright © 2011-2022 走看看