Mybatis 示例之 SelectKey
2016-05-17 00:00
369 查看
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。
不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。
selectKey Attributes
SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
像Oracle这样取序列的情况,需要设置为before,否则会报错。
另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。
下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:
[html]
view plain
copy
![](http://static.oschina.net/uploads/img/201605/17103511_IGhm.png)
![](http://static.oschina.net/uploads/img/201605/17103511_hktE.svg)
<insert id="insert" parameterType="map">
insert into table1 (name) values (#{name})
<selectKey resultType="java.lang.Integer" keyProperty="id">
CALL IDENTITY()
</selectKey>
</insert>
上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数
类型
还要一致,否则会报错。
[java]
view plain
copy
![](http://static.oschina.net/uploads/img/201605/17103511_IGhm.png)
![](http://static.oschina.net/uploads/img/201605/17103511_hktE.svg)
@Insert ("insert into table2 (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)
int insertTable2(Name name);
上面是注解的形式。
不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。
属性 | 描述 |
---|---|
keyProperty | selectKey 语句结果应该被设置的目标属性。 |
resultType | 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。 |
order | 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。 |
statementType | 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。 |
像Oracle这样取序列的情况,需要设置为before,否则会报错。
另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。
下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:
[html]
view plain
copy
![](http://static.oschina.net/uploads/img/201605/17103511_IGhm.png)
<insert id="insert" parameterType="map">
insert into table1 (name) values (#{name})
<selectKey resultType="java.lang.Integer" keyProperty="id">
CALL IDENTITY()
</selectKey>
</insert>
上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数
类型
还要一致,否则会报错。
[java]
view plain
copy
![](http://static.oschina.net/uploads/img/201605/17103511_IGhm.png)
@Insert ("insert into table2 (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)
int insertTable2(Name name);
上面是注解的形式。
相关文章推荐
- Activiti流程图乱码
- SEO优化四个步骤,让网站排名靠前
- Java 8 新特性 – 终极手册整理
- 使用单例模式实现自己的HttpClient工具类
- Spring4新特性:Groovy Bean定义DSL
- 创建兼容 IE/FireFox 的 event 及 event 的 srcElement、fromElement、toElement 属性
- 编写自己的代码生成工具五:代码生成实现
- java中final和static
- java二维码工具类,中间带LOGO的,很强大
- 使用ngrok让微信公众平台通过80端口访问本机
- 基于jQuery的一个简单的图片查看器实现
- JS全选反选
- javamail接收邮件(较全)工具类
- JAVA UUID 生成策略研究之为什么
- Nginx配置性能深度优化
- 微信公众帐号开发教程第1篇-引言
- Quartz使用示例总结
- 图片上传压缩处理
- java jsp实现不能通过后退访问缓存,每次都访问最新的
- html文本框不可编辑,禁止用户修改的几种方法