Mybatis 示例之 SelectKey(转)

摘要:
无论SelectKey有多好,都尽量不要遇到这种情况。毕竟,这很麻烦。selectKeyAttributes属性描述应该为keyPropertyselectKey语句的结果设置的目标属性。MyBatis通常可以计算,但在写作上没有问题。MyBatis允许将任何简单类型用作主键,包括字符串。statementType与上一个相同。MyBatis支持STATION、PREPARED和CALLABLE语句的映射类型,分别表示PreparedStatement和CallableStatement类型。此外,当使用Spring管理事务时,SelectKey和Insert位于同一事务中。因此,在MySQL的情况下,数据不会插入数据库,因此无法获得自动增长的Key。[java]viewplaincopy@Insert@选择键盘插入表2;以上为注释形式。

参考:http://blog.csdn.net/isea533/article/details/21153791

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。

不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。

 

selectKey Attributes
属性描述
keyPropertyselectKey 语句结果应该被设置的目标属性。
resultType结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。

 

SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

像Oracle这样取序列的情况,需要设置为before,否则会报错。

 

另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。

 

下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <insert id="insert" parameterType="map">  
  2.     insert into table1 (name) values (#{name})  
  3.     <selectKey resultType="java.lang.Integer" keyProperty="id">  
  4.       CALL IDENTITY()  
  5.     </selectKey>  
  6.   </insert>  


上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。

 

 

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. @Insert("insert into table2 (name) values(#{name})")  
  2. @SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)  
  3. int insertTable2(Name name);  

上面是注解的形式。

免责声明:文章转载自《Mybatis 示例之 SelectKey(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux环境下排查cpu占比高的MySQL数据库sql语句Java中ASM框架详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mybatis批量增、删、改(更新)操作oracle和mysql批量写法小记

前言:用mybatis也好几年了,mybatis在批量的增删操作也写起来也是比较简单的,只有批量更新这一块是特别坑,特此记录。注:本文主要用来记录oracle和mysql数据库在使用mybatis的情况下批量增、删、改(更新)的常用写法 一、批量插入1、oracle写法: <insert parameterType="cc.eguid.Zaixcs"...

mybatis plus 联合查询

在xml中只需要需要写如下的代码即可实现分页: <select parameterType="map" resultType="com.test.mybatisplus.pojo.User"> SELECT <include refid="Base_Column_List" />...

springboot整合mybatis将sql打印到日志(转)

在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢? 见下面的mybatis配置文件: [html]view plaincopyprint? <?xml version="1.0" encoding="UTF-8" ?>   <!DOCTYPE configuration PU...

mybatis plus 主键生成 Twitter雪花算法 id 及修改id为字符型

mybatis plus配置主键生成策略为2,就是 使用Twitter雪花算法 生成id spring boot中配置为: GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector()); conf.setIdType(5); 这样生成的是long类型的,如果想把这个i...

Mybatis常见疑问

1.在连接数据库时候,mysql是否支持fetchsize分页获取?   满足以下几个条件,可以使用fetchsize,根据游标获得记录   ①MySQL 从5.0.2开始支持分页获得.   ②同时需要在jdbc连接参数上配置 jdbc:mysql://localhost:3306/test?useCursorFetch=true   ③设置FetchSi...

Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6973266.html  前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合 使用官方网站的mapper自动生成工具mybatis-generator-core-1.3.2来生成po类和mapper映射文...