mybatis 08: 返回主键值的insert操作 + 利用UUID获取字符串(了解)
返回主键值的insert操作
应用背景

- 图示说明
- 在上述业务背景下,涉及两张数据表的关联操作:用户表 + 用户积分表
- 传统操作:在对用户表执行完插入语句后,再次查询该用户的uid,将该uid作为外键,最后插入积分数据到用户积分表
- 数据库操作次数:3次
- 优化操作:在对用户表执行完插入语句后返回该用户的主键uid,将该uid作为外键,再插入用户积分数据到用户积分表
- 数据库操作次数:2次
- 优化操作可以减少对数据库的操作次数
代码实现
UsersMapper.java接口
package com.example.mapper;
import com.example.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 数据访问层的接口,定义对数据库完成的CRUD的操作
*/
public interface UsersMapper {
//插入用户数据并返回用户id
int insertAndReturnId(User user);
}
- 接口代码说明
- 方法中int类型的返回值并不是返回的用户id,而是插入操作执行后受影响的记录条数
- 至于返回的用户id会通过特殊的sql标签中的属性来指定接收者
- 后文中的映射文件会具体的介绍该特殊的sql标签及其属性,后文的测试输出结果中,也可以看到该特殊标签及其属性的底层作用原理
- 在SqlMapConfig.xml核心配置文件中添加日志输出,方便查看sql标签的底层解析
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 设置日志输出-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
UsersMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UsersMapper">
<!--
//插入用户数据并返回用户id
int insertAndReturnId(User user);
-->
<insert id="insertAndReturnId" parameterType="user">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select
last_insert_id()
</selectKey>
insert into
users(username, birthday, sex, address)
values
(#{userName}, #{birthday}, #{sex}, #{address})
</insert>
</mapper>
- 映射文件说明
- 在原先的insert标签中嵌套了selectKey标签(上文提到的特殊标签),关于该子标签的属性说明
- keyProperty属性:指明子标签的返回结果由入参中的哪个属性来接收
- resultType属性:子标签的返回结果的类型
- order属性:子标签相对于外层标签中的sql语句执行的先后顺序
- last_insert_id():mysql内置的函数,返回插入的最后一条记录的自增主键id值
- 关于sql标签的执行顺序以及内层标签的返回值到底由谁来接收,可以看测试结果输出的底层内容
- 在原先的insert标签中嵌套了selectKey标签(上文提到的特殊标签),关于该子标签的属性说明
测试代码
package com.example.mapper;
import com.example.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class TestUsersMapper {
//时间刷
SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");
//SqlSession对象
SqlSession sqlSession;
//mybatis动态代理对象
UsersMapper usersMapper;
//获取SqlSession
@Before
public void getSqlSession() throws IOException {
//读取核心配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//获取SqlSession
sqlSession = factory.openSession();
//获取mybatis动态代理对象
usersMapper = sqlSession.getMapper(UsersMapper.class);
}
//归还SqlSession
@After
public void closeSession(){
sqlSession.close();
}
@Test
public void testInsertAndReturnId() throws ParseException {
String dataStr = "1996-11-22";
User u = new User("小青", date.parse(dataStr), "女", "沈阳市");
int num = usersMapper.insertAndReturnId(u);
sqlSession.commit();
if(num == 1){
System.out.println("导入数据成功!");
}else{
System.out.println("导入数据失败!");
}
System.out.println("用户id: " + u.getId());
}
}
输出结果
Checking to see if class com.example.mapper.TestUsersMapper matches criteria [is assignable to Object]
Checking to see if class com.example.mapper.UsersMapper matches criteria [is assignable to Object]
Opening JDBC Connection
Created connection 295180183.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@11981797]
==> Preparing: insert into users(username, birthday, sex, address) values (?, ?, ?, ?)
==> Parameters: 小青(String), 1996-11-22 00:00:00.0(Timestamp), 女(String), 沈阳市(String)
<== Updates: 1
==> Preparing: select last_insert_id()
==> Parameters:
<== Columns: last_insert_id()
<== Row: 30
<== Total: 1
Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@11981797]
导入数据成功!
用户id: 30
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@11981797]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@11981797]
Returned connection 295180183 to pool.
Process finished with exit code 0
测试结果分析
- 由sql标签在底层的解析顺序以及解析后的内容可知
- 在执行映射文件中的标签时,先执行的是selectKey标签外层标签中的sql语句,后执行的是子标签中的sql语句
//先
==> Preparing: insert into users(username, birthday, sex, address) values (?, ?, ?, ?)
==> Parameters: 小青(String), 1996-11-22 00:00:00.0(Timestamp), 女(String), 沈阳市(String)
<== Updates: 1
//后
==> Preparing: select last_insert_id()
==> Parameters:
<== Columns: last_insert_id()
<== Row: 30
<== Total: 1
根据测试代码以及对应的输出结果可知
接口文件中,方法中int类型的返回值并不是返回的用户id,而是插入操作执行后受影响的记录条数
keyProperty属性指明了子标签的返回结果(这里是用户id)由入参中的哪个属性来接收
//测试代码
int num = usersMapper.insertAndReturnId(u);
sqlSession.commit();
if(num == 1){
System.out.println("导入数据成功!");
}else{
System.out.println("导入数据失败!");
}
System.out.println("用户id: " + u.getId());
//对应输出结果
导入数据成功!
用户id: 30
- 数据表中的结果

UUID
- 由数字字母中划线组成的不重复的36位随机字符串
- java和mysql对UUID都有支持
package com.example.mapper;
import java.util.UUID;
public class TestUsersMapper {
@Test
public void testUUID(){
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
}
}
/*
输出结果:
c5393056-6711-46c1-8134-80b83d2e9a76
Process finished with exit code 0
*/
select UUID();
--输出结果:13e622a2-1b0f-11ed-b2f9-0242ac110002
mybatis 08: 返回主键值的insert操作 + 利用UUID获取字符串(了解)的更多相关文章
- mybatis添加数据时返回主键 insert 返回主键值
insert 返回主键值 useGeneratedKeys=“true” parameterType=“USer” keyProperty=“id”, <insert id="inse ...
- 深入浅出mybatis之返回主键ID
目录 添加单一记录时返回主键ID 在映射器中配置获取记录主键值 获取新添加记录主键字段值 添加批量记录时返回主键ID 获取主键ID实现原理 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前 ...
- Mybatis批量insert 返回主键值和foreach标签详解
Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...
- Mybatis+Mysql 返回主键的值
需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...
- mybatis+mysql 返回主键
需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...
- Mybaits插入记录返回主键值
某些情况进行insert时不知道主键值(主键为自增),例如系统新增用户时,有用户序号(主键 自增),用户名,密码.插入时只需插入用户名和密码,之后取得mysql自增的序号. 如下为mysql的usr表 ...
- mybatis insertUseGeneratedKeys 返回主键为null
package tk.mybatis.mapper.common.special; import org.apache.ibatis.annotations.InsertProvider; impor ...
- MyBatis插入语句返回主键值
插入语句xml代码: <insert id="insertUser" parameterType="com.spring.mybatis.po.User" ...
- 使用mybatis注解@Options实现添加记录时返回主键值
官网:http://www.mybatis.org/mybatis-3/index.html 在使用mybatis作为ORM框架时,我通常更喜欢使用注解而非xml配置文件的方式.业务场景:添加记录之后 ...
随机推荐
- 我熬夜读完这份“高分宝典”,竟4面拿下字节跳动offer
前言 怎样的契机? 实际上,目前毕业已经两年时间了,在大学时就已经开始关注字节跳动的发展.一开始,我是电气自动化专业的,大二清楚目标之后就转计算机了,大四进了一家小型的互联网公司实习,具体就不说哪家了 ...
- Docker权限 “Got permission denied while trying to connect to the Docker daemon socket at unix:///var/”
问题及解决办法 在普通用户下执行docker命令需要用sudo,没加sudo出现了下图所示的提示: 从上图看出,权限不足连接/var/run/docker.sock,我们看下这个文件: 可以看出,这个 ...
- 一个 curl 配置引发的惨案
问题 这两天想装新版本的 node,发现 nvm 一直报下面这个错误.我反复 Google 了,但是并没有找到一条我能用的. 痛苦 我起初一直怀疑是我用的 zsh-nvm 抽疯,所以今天有空就把它还有 ...
- bare Git 仓库是什么?
背景 今天,坐我旁边的同事问我一些关于服务器上命令的问题.其中有一个用了特殊参数的 git init 的命令,我也不认识,遂去 Google... bare Git 仓库 定义 A bare Git ...
- Java-调用R语言和调用Python(前后端展示)
1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...
- 论文阅读 Exploring Temporal Information for Dynamic Network Embedding
10 Exploring Temporal Information for Dynamic Network Embedding 5 link:https://scholar.google.com.sg ...
- UiPath存在元素Element Exists的介绍和使用
一.Element Exists的介绍 使您能够验证UI元素是否存在,即使它不可见,输出的是一个布尔值 二.Element Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Se ...
- NC20806 区区区间间间
NC20806 区区区间间间 题目 题目描述 给出长度为n的序列a,其中第i个元素为 \(a_i\),定义区间(l,r)的价值为 \(v_{l,r} = max(a_i - a_j | l \leqs ...
- Vue模板解析
mustcache 什么是模板引擎 模板引擎是将数据变为视图的最优雅的解决方案 数据 [ {"name":"小明","age":12,&qu ...
- labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用
跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...