• MyBatis的Insert操作详解


    一、前言                                   

      数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅。

    二、 insert元素 属性详解                            

      其属性如下:

       parameterType ,入参的全限定类名或类型别名

       keyColumn ,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

       keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

       useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

       statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE

       flushCache ,取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存

       timeout ,默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常

       databaseId ,取值范围oracle|mysql等,表示数据库厂家,元素内部可通过`<if test="_databaseId = 'oracle'">`来为特定数据库指定不同的sql语句

    三、一般的INSERT操作——返回值为插入的记录数目                

    mapper接口代码:

    1. /**
    2. * 添加学生信息
    3. * @param student 学生实例
    4. * @return 成功操作的记录数目
    5. */
    6. int add(EStudent student);

    mapper.xml:

    1. <insert id="add" parameterType="EStudent">
    2. insert into TStudent(name, age) values(#{name}, #{age})
    3. </insert

    四、执行INSERT操作后获取记录主键                        

    mapper接口代码:

    1. /**
    2. * 添加学生信息
    3. * @param student 学生实例
    4. * @return 成功操作的记录数目
    5. */
    6. int add(EStudent student);

    至于mapper.xml则分为两种情况了,一种是数据库(如MySQL,SQLServer)支持auto-generated key field,另一种是数据库(如Oracle)不支持auto-generated key field的。

     1. 数据库(如MySQL,SQLServer)支持auto-generated key field的情况

        手段①(推荐做法):

    1. <insert id="add" parameterType="EStudent" useGeneratedKeys="true" keyProperty="id">
    2. insert into TStudent(name, age) values(#{name}, #{age})
    3. </insert>

        手段②:

    1. <insert id="add" parameterType="EStudent">
    2. // 下面是SQLServer获取最近一次插入记录的主键值的方式
    3. <selectKey resultType="_long" keyProperty="id" order="AFTER">
    4. select @@IDENTITY as id
    5. </selectKey>
    6. insert into TStudent(name, age) values(#{name}, #{age})
    7. </insert>

      由于手段②获取主键的方式依赖数据库本身,因此推荐使用手段①。

     2. 数据库(如Oracle)不支持auto-generated key field的情况

    1. <insert id="add" parameterType="EStudent">
    2. <selectKey keyProperty="id" resultType="_long" order="BEFORE">
    3. select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1
    4. </selectKey>
    5. insert into TStudent(id, name, age) values(#{id}, #{name}, #{age})
    6. </insert>

      注意:mapper接口返回值依然是成功插入的记录数,但不同的是主键值已经赋值到领域模型实体的id中了。

    五、 selectKey子元素 详解                            

      作用:在insert元素和update元素中插入查询语句。

      其属性如下:

         keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

         resultType ,keyPropety所指向的属性类全限定类名或类型别名

         order属性 ,取值范围BEFORE|AFTER,指定是在insert语句前还是后执行selectKey操作

         statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE

    注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。并提供给insert语句使用

    六、批量插入                                 

      方式1:

    1. <insert id="add" parameterType="EStudent">
    2. <foreach collection="list" item="item" index="index" separator=";">
    3. INSERT INTO TStudent(name,age) VALUES(#{item.name}, #{item.age})
    4. </foreach>
    5. </insert>

    上述方式相当语句逐条INSERT语句执行,将出现如下问题:
    1. mapper接口的add方法返回值将是最一条INSERT语句的操作成功的记录数目(就是0或1),而不是所有INSERT语句的操作成功的总记录数目
    2. 当其中一条不成功时,不会进行整体回滚。

      方式2(仅限于MSSQL):

    1. <insert id="add" parameterType="EStudent">
    2. WITH R AS
    3. <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    4. SELECT #{item.name} as a, #{item.age} as b
    5. </foreach>
    6. INSERT INTO TStudent(name,age) SELECT a, b FROM R
    7. </insert>

    上述方式解决了方式1中的问题。但该方式仅限于MSSQL

      方式3(通用解决方法)方式3(MSSQL):

    1. INSERT INTO TStudent(name,age)
    2. <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    3. SELECT #{item.name} as a, #{item.age} as b
    4. </foreach>

    该方式与方式2效果一样,若为Oracle则采用

    七、总结                                    

      关于MyBatis的INSERT操作就总结到这里吧。

      尊重原创,转载来自:http://www.cnblogs.com/fsjohnhuang/p/4078659.html  ^_^肥仔John

    八、参考                                    

      http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html 

       如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/jpfss/p/11629873.html
Copyright © 2020-2023  润新知