开启事务时mybatis返回主键id
先说一下没有注解的
先给出实体类:
public class City {
private int city_id;
private String city_name;
public int getCity_id() {
return city_id;
}
public void setCity_id(int city_id) {
this.city_id = city_id;
}
public String getCity_name() {
return city_name;
}
public void setCity_name(String city_name) {
this.city_name = city_name;
}
@Override
public String toString() {
return "City [city_id=" + city_id + ", city_name=" + city_name + "]";
} }
以下为mysql的示例:
当我们插入一条数据的时候,需要创建一个对象,然后无论是在xml中,或者使用注解的形式,直接插入就可以了,但是需要创建一个对象来插入
这里我演示新增一个城市,为了简单,我就直接操作dao层了,按理来说应该从service中操作的:
@RequestMapping("/test")
public void test(){
City c = new City();
c.setCity_name("赣州");
baseDao.addCity(c);
System.out.println(c);
}
上面是一个控制层,我直接new了一个城市的对象,但是并没有设置它的id,直接传到了dao层来操作,下面看dao层的代码:
@Insert("insert into t_city(city_name)values(#{city_name})")
@SelectKey(statement="SELECT LAST_INSERT_ID()",keyProperty="city_id",before=false,resultType=Integer.class)
public void addCity(City c);
@insert注解还是和往常一样,没有变化。
重要的是@SelectKey注解,是它完成了返回主键id的功能,上面来具体说明一下
statement这个属性,它是与数据库相关的,代表着查询主键id的功能,MySql是
SELECT LAST_INSERT_ID()
Oracle是
CALL IDENTITY()
keyProperty,代表着传入对象的主键id属性,所以之前说,传入的必须是一个对象,因为当插入完成后,mybaits会通过反射,掉用这个对象的set方法,把对应的id值set进去这个对象,然后在外部,就可以直接取这个对象的id属性了,这样就完成了返回主键的功能
可能 xml用的比较多一点,这里也给出xml的代码:
<insert id="insert" parameterType="实体类的地址">
insert into t_city (city_name) values (#{city_name})
<selectKey resultType="java.lang.Integer" keyProperty="city_id">
SELECT LAST_INSERT_ID()
</selectKey> </insert>
下面就是重头戏了
在有事务的时候,如何返回主键id呢?
大家都知道,开启事务的时候,是为了可以在发生异常的时候,回滚数据。那么由于这样的一个机制,在@transaction中的这个方法,如果没有执行完毕,是不会真正的操作数据库的,那么这个时候,既然没有在数据库里插入数据时候,怎么能知道数据库的主键id呢?
其实我在网上看到好多人都束手无策,但是其实是有办法解决了,mybaits真的非常强大。
下面给出xml的代码:
<insert id="addCity" parameterType="com.ujia.modular.base.dao.BaseDao" useGeneratedKeys="true" keyProperty="city_id">
insert into t_city(city_name)values(#{city_name})
</insert>
大家可能会惊讶的发现,这里的代码竟然更少了,但是实现的效果竟然是一样的,而且更加强大。它可以在事务中,得到主键id。那么上面的参数简单的说明一下
useGeneratedKeys是使用mybaits生成的key,这一步很重要,需要数据库支持自动生成才能做到。只要指定为true,那么mybaits就会从数据库中获取生成策略,然后计算后主键id,并且设置到该对象中,那么keyProperty就是之前说所的,标明主键id,在对象中的属性名称。
如果使用注解的话,依然可以保持上面的方式:
@Insert("insert into t_city(city_name)values(#{city_name})")
@SelectKey(statement="SELECT LAST_INSERT_ID()",keyProperty="city_id",before=false,resultType=Integer.class)
public void addCity(City c);
这里的一切代码,都是在mysql环境下测试的,本来并没有测试过oracle数据库,但是博主觉得肯定是可以的
开启事务时mybatis返回主键id的更多相关文章
- mybatis添加记录时返回主键id
参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...
- MyBatis插入记录时返回主键id的方法
有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种. 对应实体类: public class User ...
- 深入浅出mybatis之返回主键ID
目录 添加单一记录时返回主键ID 在映射器中配置获取记录主键值 获取新添加记录主键字段值 添加批量记录时返回主键ID 获取主键ID实现原理 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前 ...
- mybatis 批量插入 返回主键id
我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签 ...
- sql insert、update、delete完以后返回主键ID
以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查 ...
- MyBatis返回主键,MyBatis Insert操作返回主键
MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...
- Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值
有时,我们需要往一张表插入一条记录,同时返回主键ID值. 假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值 这里有几种情况需要注意: 1)如果建表语句含有主键ID的触发器,通过 ...
- MyBatis返回主键
网上给的例子都很简单 , 只要用useGeneratedKey就行了. @Insert({ "INSERT INTO money_record_increasement (id, creat ...
- mybatis与mysql插入时返回主键id的值
<insert id="insertCharge" parameterType="com.bb.bean.Rechargerecord"> < ...
随机推荐
- Icident event 分析
现象 备库中断,显示如下错误 Connect_Retry: 60 Master_Log_File: mysql-bin.000185 Read_Master_Log_Pos: 308647804 Re ...
- Ubuntu全新安装firefox最新版本
Ubuntu默认安装firefox,但是自带的软件仓库是不会随firefox更新的,我在使用中老是提示flash插件需要激活,提示中可选的解决方式有三种 1.更新flash插件,但是跳转到adobe的 ...
- Web Essentials之Browser Link
返回Web Essentials功能目录 本篇目录 功能 当Browser Link运行时,会有一个菜单注入到你的网站上,Web Essentials可以使用该菜单上所有可用的一套Browser Li ...
- AMD加载器实现笔记(四)
继续这一系列的内容,到目前为止除了AMD规范中config的map.config参数外,我们已经全部支持其他属性了.这一篇文章中,我们来为增加对map的支持.同样问题,想要增加map的支持首先要知道m ...
- Spring AOP简述
使用面想对象(Object-Oriented Programming,OOP)包含一些弊端,当需要为多个不具有继承关系的对象引入公共行为时,例如日志,安全检测等.我们只有在每个对象中引入公共行为,这样 ...
- Robotium的左右为难 -- enterText
最近测试框架收到反馈,详查后发现了一个Robotium的问题,甚有趣,遂记录. 问题场景: Robotium.enterText输入数据后,点击"发送"按钮,多数情况下失败,少数时 ...
- SQL关联查询总结
employee表: department表: 笛卡儿积: 等值连接: 内连接(和等值连接效果是相同的): 外连接(外连接不仅返回满足条件的记录,还将返回不满足条件的记录)以下是左外连接,右外连接.全 ...
- tomcat4 请求的处理——初步分析
以tomcat4为例, 每当HttpConnector的ServerSocket得到客户端的连接时,会创建一个Socket. 接下来就处理这个Socket发来的数据. 怎么处理呢? 考虑到客户端同时发 ...
- java 锁2
并发,其实是多线程才有的场景... java 多线程? 锁? 现在看来,即使已经工作了4.5年,这仍然不是一个简单的问题. 其实java 本身有提供锁的机制. 比如 Object对象的 wait .n ...
- vi小结1
我使用xshell,vi里面中文乱码: http://www.cnblogs.com/TianFang/archive/2013/01/21/2870181.html 发现他的问题(gcc编译出错时会 ...