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获取自增主键的值的更多相关文章

  1. Mybatis学习笔记4 - 获取自增主键的值

    获取自增主键的值:mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys():useGeneratedKeys="true&qu ...

  2. mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值

    笔记要点出错分析与总结 /**测试第16章的增,删,改 的内容 * 错误1: <insert id="addEmp" parameterType="com.bean ...

  3. Mybatis获取自增主键值

    1.配置文件变化 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLI ...

  4. Mybatis获取自增主键的两种方式

    <insert id="saveOne" parameterType="com.buwei.entity.User" > INSERT into u ...

  5. MyBatis映射文件1(增删改、insert获取自增主键值)

    增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...

  6. 【JAVA - SSM】之MyBatis插入数据后获取自增主键

    很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: (1)先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段 ...

  7. mybatis框架(6)---mybatis插入数据后获取自增主键

    mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...

  8. 深入分析Mybatis 使用useGeneratedKeys获取自增主键

    摘要 我们经常使用useGenerateKeys来返回自增主键,避免多一次查询.也会经常使用on duplicate key update,来进行insertOrUpdate,来避免先query 在i ...

  9. 【JavaEE】之MyBatis插入数据后获取自增主键

    很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: 先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段值,再 ...

随机推荐

  1. 超过三张表禁止join

    一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析 对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...

  2. 【Linux】【Services】【SaaS】Docker+kubernetes(12. 部署prometheus/grafana/Influxdb实现监控)

    1.简介 1.1. 官方网站: promethos:https://prometheus.io/ grafana:https://grafana.com/ 1.2. 架构图 2. 环境 2.1. 机器 ...

  3. maven高级学习

    上一篇<maven是什么>介绍了最初级的maven学习,今天就趁着周末的大好时光一起学习下maven的高级知识吧. 1.maven工程要导入jar包的坐标,就必须要考虑解决jar冲突 1) ...

  4. Spring Boot 自动扫描组件

    使用@ComponentScan自动扫描组件 案例准备 1.创建一个配置类,在配置类上添加 @ComponentScan 注解.该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <con ...

  5. 【C/C++】输入:连续输入,以逗号隔开

    连续输入,以空格或者以逗号隔开,换行符结束 [范例]输入 23 12 34 56 33或者 23,12,34,56,33 则 vector<int> data; int tmp; whil ...

  6. 【论文笔记】SamWalker: Social Recommendation with Informative Sampling Strategy

    SamWalker: Social Recommendation with Informative Sampling Strategy Authors: Jiawei Chen, Can Wang, ...

  7. Python语法之变量

    一.变量简介 1.什么是变量 变量即变化的量,用于记录事物的某种状态,比如人的年龄.性别,游戏角色的等级.金钱. 2.如何使用变量 日常生活中: 姓名:Jason 年龄:18 爱好:音乐 程序中: u ...

  8. 筛选(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 [视图]选项卡下有个[筛选器],筛选功能就在里面实现. 比如按[里程碑]筛选. 按[日期范围],再指定个起始日期和结束日期 ...

  9. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置

    1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...

  10. CF670A Holidays 题解

    Content 假设 \(1\) 年有 \(n\) 天,而每周同样会有 \(5\) 天工作日和 \(2\) 天休假.求一年最小的休假天数和最大休假天数. 数据范围:\(1\leqslant n\leq ...