先说一下没有注解的

先给出实体类:

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入门经典(三) 之连接查询

    上一篇介绍到查询.这一篇主要讲连接查询,将介绍INNER JOIN,OUTER JOIN(LEFT和RIGHT),FULL JOIN,CROSS JOIN. 连接顾名斯义就是把多个数据表数据合并到一个 ...

  2. Anciroid的IPC机制-Binder概述

    在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...

  3. 自己实现一个Native方法的调用

    JNI 开始本篇的内容之前,首先要讲一下JNI.Java很好,使用的人很多.应用极广,但是Java不是完美的.Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系 ...

  4. .net开发笔记(十二) 设计时与运行时的区别(续)

    上一篇博客详细讲到了设计时(DesignTime)和运行时(RunTime)的概念与区别,不过没有给出实际的Demo,今天整理了一下,做了一个例子,贴出来分享一下,巩固前一篇博客讲到的内容. 简单回顾 ...

  5. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法

    Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...

  6. 两段for循环代码的区别

    第一段: #include<iostream>using namespace std;int main(){ int a; int x; for(a=0,x=0;a<=1&& ...

  7. 【原创】三分钟教你学会MVC框架——基于java web开发(1)

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法. ...

  8. [nRF51822] 4、 图解nRF51 SDK中的Schedule handling library 和Timer library

    :nRF51822虽然是一个小型的单片机,但是能真正达到任意调用其官方驱动以及BLE协议栈的人还是奇缺的.据我所见,大都拿官方给的一个冗长的蓝牙低功耗心率计工程改的.之前我对于这个工程进行log跟踪, ...

  9. 使用 PowerShell 自动登录Azure

    PowerShell 是管理 Azure 的最好方式之一,通过使用 PowerShell 脚本可以把很多的工作自动化.比如对于 Azure 上的虚拟机,可以设置定时关机操作,并在适当的时间把它开机,这 ...

  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题

    从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...