• 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
    
  • 相关阅读:
    任意数字 保留 两位 小数 PHP
    在JavaScript中处理JSON数据 jquery js 定义 json 格式
    相对定位 绝对定位 relative absolute position 图片定位a标签
    oracle: listener.ora 、sqlnet.ora 、tnsnames.ora的配置及例子
    python
    python
    python-判断alter是否存在
    python-IE浏览器调用
    Python语言编写脚本时,对日期控件的处理方式
    python报错UnicodeDecodeError:
  • 原文地址:https://www.cnblogs.com/mozq/p/11480465.html
Copyright © 2020-2023  润新知