MyBatis插入记录时返回主键id的方法
有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种。
对应实体类:
public class User {
private int userId;
private String userName;
private int userAge;
}
对应DAO类:
public interface UserMapper {
int save(User user);
}
方法一、使用useGeneratedKeys属性。
<insert id="save" useGeneratedKeys="true" keyProperty="userId" keyColumn="id">
INSERT INTO user (id, name, age)
VALUES (UUID(), #{userName}, #{userAge})
</insert>
该方法只支持主键非自增的情况。只需要在插入的方法标签上,添加useGeneratedKeys、keyProperty、keyColumn三个属性。
useGeneratedKeys:true,表示允许获取自增主键。
keyProperty:表示实体对象中主键的属性名称。
keyColumn:表示数据库中主键的字段名称。
使用的时候,就正常调用这个方法就好,会将返回的主键存入参数User实体的userId属性中(详见最后说明)。
方法二、使用selectKey标签。
(1)主键自增的情况。
<insert id="save">
<selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (name, age)
VALUES (#{userName}, #{userAge})
</insert>
(2)主键非自增的情况。
<insert id="save">
<selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.String">
SELECT UUID()
</selectKey>
INSERT INTO user (id, name, age)
VALUES (#{userId}, #{userName}, #{userAge})
</insert>
在插入的方法标签里,加入selectKey标签,对应属性说明如下:
keyProperty:表示实体对象中主键的属性名称。
order:表示该标签执行的先后,值分为BEFORE、AFTER。主键自增的情况下使用AFTER,在插入操作后获取到主键;主键非自增的情况下使用BEFORE,在插入操作前获取到主键。
resultType:主键的类型。
使用的时候,就正常调用这个方法就好,会将返回的主键存入参数User实体的userId属性中(详见最后说明)。
三、总结
方法一写起来比较简洁,但是不支持主键非自增的情况。方法二则相对灵活,可以根据主键是否自增进行对应的配置。且在主键非自增情况下,主键是可以根据自己需求进行调整的,即SELECT UUID()这句,可以调整如下:
SELECT upper(replace(UUID(), '-', ''))
PS:save方法的返回值是插入所影响的行数,并不是主键;主键的返回方式,两种方法是一样的,都是通过传入参数User实体的userId属性来获取,如下:
public void save() {
User user = new User();
user.setUserName("peter");
user.setUserAge(20);
int rs = userMapper.save(user);
System.out.println("插入主键为:" + user.getUserId());
System.out.println("插入影响行数:" + rs);
}
MyBatis插入记录时返回主键id的方法的更多相关文章
- mybatis添加记录时返回主键id
参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...
- MyBatis在insert插入操作时返回主键ID的配置
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过Mapper.XML配置的方式来完成这个功能. 在 INSER ...
- mybatis 插入数据时返回主键
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:显然,假如主键是你生成后插入的,自然你已经有主键了,显然不需要我们再去获得,所以我们这里处理的是当主键 ...
- Mybatis插入数据后返回主键id
有时候使用mybatis插入数据后,需要用到记录在数据库中的自增id,可以利用keyProperty来返回,赋值给实体类中的指定字段. 单条记录插入并返回 First, if your databas ...
- mysql数据库使用mybatis 插入数据时返回主键
为了体现题目,特指的是mysql,先贴上代码: <insert id="saveBizProdOrderDetail" useGeneratedKeys="true ...
- Mybatis中insert中返回主键ID的方法
<insertid=“doSomething"parameterType="map"useGeneratedKeys="true"keyProp ...
- MyBatis 插入记录同时获取主键
MyBatis 插入记录同时获取主键 MyBatis 插入记录同时获取主键的系统界面 useGeneratedKeys 属性 keyProperty 属性 keyColumn 属性 selectKey ...
- Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值
有时,我们需要往一张表插入一条记录,同时返回主键ID值. 假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值 这里有几种情况需要注意: 1)如果建表语句含有主键ID的触发器,通过 ...
- Laravel 5 插入数据后返回主键ID
方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:( ...
随机推荐
- PostgreSQL数据库安装
PostgreSQL数据库安装 postgresqllinux9.6.0 2018年01月31日 10时53分13秒 编译以及安装 源码编译 程序安装 数据库的启动和停止 启动数据库 关闭数据库 数据 ...
- JSON.stringify(),JSON.parse(),toJSON()使用方法总结
今天在看<你不知道的javascript-中>第四章‘强制类型转换’的时候,发现JSON.stringify(),JSON.parse(),toJSON()有很多细节,自己也就总结测试了一 ...
- Java精通并发-通过openjdk源码分析ObjectMonitor底层实现
在我们分析synchronized关键字底层信息时,其中谈到了Monitor对象,它是由C++来实现的,那,到底它长啥样呢?我们在编写同步代码时完全木有看到该对象的存在,所以这次打算真正来瞅一下它的真 ...
- poj1860 Currency Exchange(spfa判断是否存在正环)
题意:有m个货币交换点,每个点只能有两种货币的互相交换,且要给佣金,给定一开始的货币类型和货币数量,问若干次交换后能否让钱增加. 思路:spfa求最长路,判断是否存在正环,如果存在则钱可以在环中一直增 ...
- 微信小程序~跳页传参
[1]需求: 点击商品,跳到相应商品详情页面 [2]代码: (1)商品列表页 <view class="goodsList"> <view wx:for=&quo ...
- *P2398 GCD SUM[数论]
题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 解析 给出n求sum. gcd(x,y)表示x,y的最大公约数. 直接枚举复杂度为\(O(n^2)\),显然无 ...
- 前端Map封装源码
源于后台思路,简单封装了一下Map插件,方便以后使用. function Map() { this.elements = new Array(); //获取MAP元素个数 this.size = fu ...
- idea常用设置汇总
https://www.cnblogs.com/wangmingshun/p/6427088.html
- Yarn (转自之乎者也)
作者:青俞链接:https://www.zhihu.com/question/34016617/answer/57822812来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- JavaScript基础03——函数的作用域及变量提升
1.作用域 作用域,变量在函数内部作用的范围/区域.有函数的地方就有作用域. 2.局部作用域和全局作用域 function fn(){ var a = 1; } console.log(a); / ...