一、前言                                

数据库操作怎能少了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

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

MyBatis的Insert操作详解的更多相关文章

  1. MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

    一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解   其属性如下: parameterType  ...

  2. MyBatis魔法堂:Insert操作详解

    一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType:入参的全限 ...

  3. 多表insert操作详解

    --1.无条件的多表insert all ; ; ; --没有条件,向多个目标表全量插入,必须有all insert all --不指定emp_1后面的列,也不指定values,那么emp_1中的所有 ...

  4. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

  5. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  6. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  7. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  8. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  9. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

随机推荐

  1. 兼容pc端和移动端的轮播图插件 swiper.js

    swiper.js是一款纯JavaScript打造的滑动特效插件,可以用来实现检点轮播图,tab触摸滑动切换等常用效果.下载地址:https://www.swiper.com.cn/download/ ...

  2. R_Studio(cart算法决策树)对book3.csv数据用测试集进行测试并评估模型

    对book3.csv数据集,实现如下功能: (1)创建训练集.测试集 (2)用rpart包创建关于类别的cart算法的决策树 (3)用测试集进行测试,并评估模型 book3.csv数据集 setwd( ...

  3. iOS13即将到来,iOS推送Device Token适配方案详解

    关于提前适配iOS13 苹果推送DeviceToken的通知 随着苹果iOS13系统即将发布,个推提前推出DeviceToken适配方案,以确保新版本的兼容与APP推送服务的正常使用.iOS13的一个 ...

  4. 在Idea下配置Maven

    Idea 自带了apache maven,默认使用的是内置maven,所以我们可以配置全局setting,来调整一下配置,比如远程仓库地址,本地编译环境变量等. 使用IDEA自带的maven时,若不配 ...

  5. TreeMap元素必须实现Comparable接口

    纠正一下,TreeMap实现一定顺序是通过Comparable接口的,而他实现元素不重复也是完全通过compareTo,而不是hashCode和equals,因为debug不会走到hashCode和e ...

  6. C++ Map实践

    实践如下: #include <iostream> #include <map> #include <string> #include <typeinfo&g ...

  7. Lognormal Distribution对数正态分布

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  8. Jmeter(十三) JDBC Request

    Jmeter中取样器(Sampler)是与服务器进行交互的单元.一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录响应时间信息 有时候工作中我们需要对数据库发起请求或者对数据 ...

  9. nodejs 框架 中文express 4.xxx中文API手册

       介于最近express 中文文档比较难找的现状,特地找了一个,供大家学习思考 Express 4.x API express 翻译 api文档 中文 --     express() expre ...

  10. qrcode-reader——二维码识别

    JavaScript QRCode reader for HTML5 enabled browser 参考资料1:[https://www.npmjs.com/package/qrcode-reade ...