zoukankan      html  css  js  c++  java
  • MySQLのmybatis批量插入数据

    背景:项目中导入文件后需要批量插入数据到数据库。

    方案一、既然批量插入,就不能选择一条一条的执行插入语句

    insert INTO test VALUES ('1','name');

    方案二、应该考虑将SQL语句拼接组合后,批量提交执行。

    insert INTO test(id,name) VALUES ('2','name2'),('3','name3'),('4','name4')

    参考别人的代码,重点是selectKey标签和foreach标签

    <!-- 批量插入生成的兑换码 -->
         <insert id ="insertCodeBatch" parameterType="java.util.List" >
                <selectKey resultType ="java.lang.Integer" keyProperty= "id" order= "AFTER">
                    SELECT LAST_INSERT_ID()
                </selectKey >
               insert into redeem_code
               (bach_id, code, type, facevalue,create_user,create_time)
               values
                <foreach collection ="list" item="reddemCode" index= "index" separator =",">
                    (
                    #{reddemCode.batchId}, 
              #{reddemCode.code}, #{reddemCode.type}, #{reddemCode.facevalue}, #{reddemCode.createUser},
    #{reddemCode.createTime} )
    </foreach > </insert >

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

    foreach元素的属性主要有 item,index,collection,open,separator,close。

    item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
    3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题。

    他可以很随意的设置生成主键的方式,不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。

    属性 描述
    keyProperty selectKey 语句结果应该被设置的目标属性。
    resultType

    结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。

    order

    这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。

    如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。

    statementType

    和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,

    分别代表 PreparedStatement 和CallableStatement 类型。

    在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。像Oracle这样取序列的情况,需要设置为before,否则会报错。

  • 相关阅读:
    【leetcode】1228.Missing Number In Arithmetic Progression
    【leetcode】1227. Airplane Seat Assignment Probability
    【leetcode】1224. Maximum Equal Frequency
    【leetcode】1222. Queens That Can Attack the King
    【leetcode】1221. Split a String in Balanced Strings
    【leetcode】1219. Path with Maximum Gold
    【leetcode】1220. Count Vowels Permutation
    【leetcode】1218. Longest Arithmetic Subsequence of Given Difference
    【leetcode】1217. Play with Chips
    2018.11.27 元器件选型(2)- 连接器
  • 原文地址:https://www.cnblogs.com/yangjiming/p/13090342.html
Copyright © 2011-2022 走看看