先说一下没有注解的

先给出实体类:

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的更多相关文章

  1. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...

  2. MyBatis插入记录时返回主键id的方法

    有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种. 对应实体类: public class User ...

  3. 深入浅出mybatis之返回主键ID

    目录 添加单一记录时返回主键ID 在映射器中配置获取记录主键值 获取新添加记录主键字段值 添加批量记录时返回主键ID 获取主键ID实现原理 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前 ...

  4. mybatis 批量插入 返回主键id

    我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签 ...

  5. sql insert、update、delete完以后返回主键ID

    以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查 ...

  6. MyBatis返回主键,MyBatis Insert操作返回主键

    MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...

  7. Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值

    有时,我们需要往一张表插入一条记录,同时返回主键ID值. 假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值 这里有几种情况需要注意: 1)如果建表语句含有主键ID的触发器,通过 ...

  8. MyBatis返回主键

    网上给的例子都很简单 , 只要用useGeneratedKey就行了. @Insert({ "INSERT INTO money_record_increasement (id, creat ...

  9. mybatis与mysql插入时返回主键id的值

    <insert id="insertCharge" parameterType="com.bb.bean.Rechargerecord"> < ...

随机推荐

  1. SQL Server里的闩锁介绍

    在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介 ...

  2. require、module、exports dojo中的三个特殊模块标识

    查看dojo源码过程中,发现这三个模块名并不以dojo.dijit.dojox开头,在dojo加载器中属于特殊模块名. require 这是一个上下文智能的加载器. 我们通过dojoConfig配置了 ...

  3. 如何在IIS7/7.5上配置IISADMPWD

    问题 很多IIS用户还记得在早期的IIS版本上有一个web应用, IISADMPWD. 该应用是与IIS5 和IIS6一起发布的. 主要用于为域用户提供修改密码的功能, 同时也可以修改本机用户的密码. ...

  4. java提高篇(十二)-----代码块

    在编程过程中我们可能会遇到如下这种形式的程序: public class Test { { //// } } 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起, ...

  5. Linux 数组

    200 ? "200px" : this.width)!important;} --> :介绍 在shell4.0之后支持普通数组和关联数组,普通数组只能使用整数作为索引,关 ...

  6. appserv中php升级问题

    当前版本为2.1,要升级到2.3.4 那么,首先到http://windows.php.net/downloads/releases/archives/ 找到2.3.4,需要注意的是,一般我们是非nt ...

  7. 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展

    在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...

  8. easy-ui JOB 及 小记录

    $:获取  $.ajax({             type: "POST" ,             url: "" ,             cont ...

  9. redis配置文件redis.conf中文版(基于2.4)

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/99.html?1455869981 代码如下: # Redis示例配置文件 ...

  10. vue初体验:实现一个增删查改成绩单

    前端变化层出不穷,去年NG火一片,今年react,vue火一片,ng硬着头皮看了几套教程,总被其中的概念绕晕,react是faceback出品,正在不断学习中,同时抽时间了解了vue,查看了vue官方 ...