Mybatis获取自增主键的值
pojo:
public class User {
private Integer id;
private String name;
private String pwd;
setter和getter....
}
数据库:

1、获取自增主键的值
映射文件:
<!-- UserMapper接口 public void addUser(User user); -->
<insert id="addUser" parameterType="com.workhah.pojo.User" useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
insert into user(name,pwd)
values(#{name},#{pwd})
</insert>
获取自增主键的值:
- \(Mysql\) 支持自增主键,自增主键值的获取,\(Mybatis\) 也是利用
statement.getGenreatedKeys() useGeneratedKeys="true"使用自增主键获取主键值策略keyProperty指定对应的主键属性,也就是\(Mybatis\) 获取到主键值以后,将这个值封装给\(javaBean\) 的哪个属性。
测试获取主键值:
@Test
public void test() {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(0, "workhah", "123");
mapper.addUser(user);
System.out.println(user.getId()); // 14
// 原本user表就有13条数据,现在插入一条数据该数据的id就为14,而且这个自增主键id的值返回了给user变量。
}
原本user表就有13条数据,现在插入一条数据该数据的id就为14,而且这个自增主键id的值返回了给user变量。
因此要注意的是,想要获取自增主键的值,必须得有对应得\(JavaBean\)类(如上例中的user变量),该类来封装自增主键的值。
2、获取非自增主键的值
Oracle不支持自增;Oracle使用序列来模拟自增;每次插入的数据的主键是从序列中拿到的值;
<!-- UserMapper接口 public void addUser(User user); -->
<insert id="addUser" databaseId="oracle">
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
<!-- 编写查询主键的sql语句 -->
<!-- BEFORE-->
select USER_SEQ.nextval from dual
</selectKey>
<!-- 插入时的主键是从序列中拿到的 -->
<!-- BEFORE:-->
insert into user(id,name,pwd)
values(#{id},#{name},#{pwd})
</insert>
keyProperty:查出的主键值封装给 \(javaBean\) 的哪个属性order="BEFORE":当前 sql 在插入 sql 之前运行
AFTER:当前 sql 在插入 sql 之后运行BEFORE运行顺序:
先运行selectKey查询 id 的 sql;查出 id 值封装给 \(javaBean\) 的 id 属性
在运行插入的 sql;就可以取出 id 属性对应的值AFTER运行顺序:
先运行插入的 sql(从序列中取出新值作为 id)
再运行selectKey查询 id 的 sql;
resultType:查出的数据的返回值类型
测试获取主键值:
@Test
public void test() {
SqlSession sqlSession = MyTest.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(0, "workhah", "123");
mapper.addUser(user);
System.out.println(user.getId()); // 12
}
思考
问题
既然 selectKey提前执行把获取到的主键值封装到 \(JavaBean\) 中,然后再作为 sql 的输入执行 sql 语句,那么selectKey可不可以获取的是其他的值,甚至是另一个表获取的数据作为输出呢
验证
答案是可以的!
blog类
public class Blog {
private int id;
private String title;
private String author;
private String createTime;
private int views;
setter和getter....
}
映射文件
<!-- UserMapper接口 public void updateUser(Blog blog); -->
<update id="updateUser" parameterType="user">
<selectKey keyProperty="title" resultType="String" order="BEFORE">
select title from blog where id = 1
</selectKey>
update user set name = #{title} where id = 13
</update>
测试
@Test
public void test() {
SqlSession sqlSession = MyTest.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Blog blog = new Blog(0, null, null, null,0);
System.out.println(blog);
// 结果
// Blog(id=0, title=Mybatis, author=null, createTime=null, views=0)
}
数据库

selectKey的返回值作为 sql 语句的输入成功修改和数据库,并且成功返回给了变量blog。这接口方法虽然可以实现跨表,但是需要用到Blog类参数协作,在实际开发中逻辑比较奇怪,这里只是作为对问题猜测的验证。
Mybatis获取自增主键的值的更多相关文章
- Mybatis学习笔记4 - 获取自增主键的值
获取自增主键的值:mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys():useGeneratedKeys="true&qu ...
- mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
笔记要点出错分析与总结 /**测试第16章的增,删,改 的内容 * 错误1: <insert id="addEmp" parameterType="com.bean ...
- Mybatis获取自增主键值
1.配置文件变化 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLI ...
- Mybatis获取自增主键的两种方式
<insert id="saveOne" parameterType="com.buwei.entity.User" > INSERT into u ...
- MyBatis映射文件1(增删改、insert获取自增主键值)
增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...
- 【JAVA - SSM】之MyBatis插入数据后获取自增主键
很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: (1)先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
- 深入分析Mybatis 使用useGeneratedKeys获取自增主键
摘要 我们经常使用useGenerateKeys来返回自增主键,避免多一次查询.也会经常使用on duplicate key update,来进行insertOrUpdate,来避免先query 在i ...
- 【JavaEE】之MyBatis插入数据后获取自增主键
很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: 先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段值,再 ...
随机推荐
- 【Linux】【Services】【SaaS】Docker+kubernetes(8. 安装和配置Kubernetes)
1. 概念 1.1. 比较主流的任务编排系统有mesos+marathon,swarm,openshift(红帽内部叫atom服务器)和最著名的kubernetes,居然说yarn也行,不过没见过谁用 ...
- Taro 微信小程序 上传文件到minio
小程序前端上传文件不建议直接引用minio的js npm包,一来是这个包本身较大,会影响小程序的体积,二来是ak sk需要放到前端存储,不够安全,因此建议通过请求后端拿到签名数据后上传. 由于小程序的 ...
- Jenkins构建通知
目录 一.简介 二.推送到gitlab 三.邮件通知 自带配置 Email Extension 四.钉钉通知 五.脚本钉钉通知 六.HTTP请求通知 一.简介 类似于监控报警,jenkins在配置持续 ...
- 项目集成seata和mybatis-plus冲突问题解决方案:(分页插件失效, 自动填充失效, 自己注入的id生成器失效 找不到mapper文件解决方案)
项目集成seata和mybatis-plus,seata与mybatis-plus冲突问题(所有插件失效,自动填充失效,找不到mapper文件解决方案) 自动填充代码: package com.fro ...
- Windows下mongodb的安装和配置
1----->下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl ...
- SROP例题
具体攻击原理可以参考安全客这篇文章:入口 刚学了一点,也是懵懵懂懂的,拿几道题来练练手. ciscn_2019_es_7 64位程序,只开启了NX保护. 相当于执行了read(0,buf,0x400) ...
- 日历共享(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 为了某一个项目,我们建好了一整套的日历,除了标准日历里加上了所有的假期以外,其他来自火星的水星的金星的土星的木星的BT的不 ...
- .NET Core工程应用系列(2) 实现可配置Attribute的Json序列化方案
背景 在这篇文章中,我们实现了基于自定义Attribute的审计日志数据对象属性过滤,但是在实际项目的应用中遇到了一点麻烦.需要进行审计的对象属性中会包含其他类对象,而我们之前的实现是没办法处理这种类 ...
- Django中的常用字段类型与参数
Django中的常用字段类型 1. 数值型 以下都是数值相关的,比如AutoField,它在MySQL中的类型为int(11),而BooleanField在MySQL中对应的类型是tinyint(1) ...
- CF1065A Vasya and Chocolate 题解
Content 小 V 有 \(s\) 块钱,商店里有巧克力卖,每块巧克力 \(c\) 块钱,现在商店给出优惠:购买 \(a\) 块巧克力可以免费获得 \(b\) 块巧克力,求小 V 最多能够买到的巧 ...