前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录

在项目中经常需要获取到插入数据的主键来保障后续操作,数据库中主键一般我们使用自增或者uuid()的方式自动生成

问题:对于uuid使用Java代码生成的方式还比较容易控制,然而使用数据库生成的主键,这样我们就需要将插入的数据再查询出来得到主键,某些情况下还可能查询到多条情况,这样就比较尴尬了。

那有什么办法来插入数据的时候就得到这个主键呢?

以下是Demo,分别定义了一个主键自增的表,一个uuid主键的表,对应实体Student,和UUidStudent分别说明两种情况下插入数据如何获取到主键值

一、自增对应实体Student

packagecom.ydcc.model;public classStudent

{privateString id;privateString name;privateInteger age;}

对应的mapper.xml如下

insert into t_student (name,age) values (#{name},#{age})

二、uuid非自增对应实体:UUidStudent

packagecom.ydcc.model;public classUUidStudent

{privateString uuid;privateString name;private intage;}

对应的xml如下

SELECT uuid()insert into t_uuidstudent (uuid,name,age) values ( uuid(), #{name},#{age})

来看以下测试代码和运行效果

packagecom.ydcc.service;importorg.apache.ibatis.session.SqlSession;importorg.apache.log4j.Logger;importorg.junit.After;importorg.junit.Before;importorg.junit.Test;importcom.ydcc.mappers.StudentMapper;importcom.ydcc.mappers.UUidStudentMapper;importcom.ydcc.model.Student;importcom.ydcc.model.UUidStudent;importcom.ydcc.util.SqlSessionFactoryUtil;public classStudentTest2

{private static Logger logger = Logger.getLogger(StudentTest2.class);private SqlSession sqlSession = null;private StudentMapper studentMapper = null;private UUidStudentMapper uuidstudentMapper = null;/*** 测试方法前调用

*

*@throwsException*/@Beforepublic void setUp() throwsException

{

sqlSession=SqlSessionFactoryUtil.openSession();

studentMapper= sqlSession.getMapper(StudentMapper.class);

uuidstudentMapper= sqlSession.getMapper(UUidStudentMapper.class);

}/*** 测试方法后调用

*

*@throwsException*/@Afterpublic void tearDown() throwsException

{

sqlSession.close();

}

@Testpublic voidtestAdd()

{

logger.info("添加学生");

Student student= newStudent();

student.setName("王五");

student.setAge(12);

studentMapper.add(student);

logger.info("Student是:" +student.toString());

sqlSession.commit();

}

@Testpublic voidtestAddUUidStudent()

{

logger.info("添加uuid学生");

UUidStudent uuidStudent= newUUidStudent();

uuidStudent.setName("uuid王五");

uuidStudent.setAge(12);

uuidstudentMapper.add(uuidStudent);

logger.info("uuidStudent是:" +uuidStudent.toString());

sqlSession.commit();

}

}

运行结果:

[main] INFO com.ydcc.service.StudentTest2 - 添加uuid学生

[main] INFO com.ydcc.service.StudentTest2 - uuidStudent是:UUidStudent [uuid=6885de71-c32d-11e8-88e1-0c9d920ff4e1, name=uuid王五, age=12]

[main] INFO com.ydcc.service.StudentTest2 - 添加学生

[main] INFO com.ydcc.service.StudentTest2 - Student是:Student [id=9, name=王五, age=12]

经过与插入数据对比,发现数据无误,这里总结注意的点

1、keyProperty对应的是实体中的属性,不是数据库字段

2、对于非自增主键,必须显式写出

SELECT uuid()

order的设置,在insert sql语句执行前(BEFORE)或者执行后(AFTER),

上面注释掉的代码用的before,看测试代码中我并没有对uuidStudent进行uuid set值,但是insert sql中缺用到#{uuid},理解为在执行前已经将主键id值赋给实体,直接取值就行.经过测试如果把#{uuid}换成uuid(),就发现得到的主键和入库的数据不一致

使用after,可以看到使用了数据库的uuid(),那么在插入数据后,把这个值赋给了实体uuidStudent.

3、对于自增的设计,我们直接用useGeneratedKeys="true" keyProperty="id"正常些插入语句即可

附上标签中几个字段的解释:

敲demo过程中因为用的电脑上之前的mysql-connector包,连接数据库时报Unknown character set index for field '255' received from server.的错,经查,因为是我本地用的mysql8的版本高、jar包版本低的原因

MYSQL 5.5 之前, UTF8 编码只支持1-3个字节;从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,升级下jar包就解决了

mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值相关推荐

  1. mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录    在项目中经常需要获 ...

  2. Mybatis插入数据后获取主键的值

    Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...

  3. mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列

    parameterType: 参数类型, 可以省略 mysql支持自增主键,自增主键的获取, mybatis也是利用statement.getGenreatedKeys();  useGenerate ...

  4. mysql插入成功返回主键_MyBatis + MySQL返回插入成功后的主键id

    这是最近在实现perfect-ssm中的一个功能时碰到的一个小问题,觉得需要记录一下,向MySQL数据库中插入一条记录后,需要获取此条记录的id值,以生成对应的key值存入到redis中,id为自增i ...

  5. MYSQL插入数据后返回主键

    最近做项目,要求不能使用mybatis等框架,所以一切数据库访问操作都是用原生的JDBC. 用过mybatis的都知道,插入新数据后可以直接返回主键的值,但是使用JDBC不行,于是上网搜了一下,找到一 ...

  6. 对数据进行插入操作并且获取主键的值

    eg. eg:工作中写定时模块,先插入时间段,然后直接获取id

  7. 插入后获取主键id(tkMapper)

    @Id @Column(name = "id", insertable = false) @KeySql(useGeneratedKeys = true) private Inte ...

  8. 3、JavaWeb中Service层的作用、MyBatis的重要组件、mybatis-config.xml中的别名映射、properties配置、#{}和${}的区别、获取插入数据的主键值

    文章目录 1.Service层的作用 2.MyBatis重要组件 Resources SqlSessionFactoryBuilder SqlSessionFactory SqlSession 针对上 ...

  9. MyBatis在Oracle中插入数据并返回主键的问题解决

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言:我早期用过这个方法,但是返回的依旧是影响行数,不是主键. 只是这种写法可以达到我要的效果: 用 ...

最新文章

  1. postgresql之数据库管理
  2. 我与编程:十载寒冰,难凉热血
  3. 关于mysql优化_关于MySQL优化的几点总结
  4. openresty + nginx-http-sysguard 调研使用
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的奖学金评定管理系统
  6. 企业内网巡航扫描神器
  7. java基础七--网络编程(1)
  8. c语言二级笔试试卷,二级C语言笔试试卷
  9. java 中文网址大全
  10. couldn't connect to the device trackpad
  11. 微信小程序调用扫码功能
  12. 兼容 IE、 FireFox 的 javascript 日历控件 原创作者:寒羽枫(cityhunter172)
  13. 六、定语从句和关系代词
  14. 银行wifi认证登录怎么样
  15. 能否构成三角形的条件代码_三角形基础知识
  16. Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法
  17. 羊皮卷之五:假如今天是我生命中的最后一天
  18. 搭建网校系统,既能解决疫情下教育培训难题,也解决了企业办公问题
  19. Linux下修改Oracle字符集为ZHS16GBK
  20. 自动标注工具 Autolabelimg

热门文章

  1. 微软正式发布XAML Standard与.NET Standard 2.0:现已提供下载
  2. XunSearch的安装和加入服务器开机脚本以及将目录写入系统变量
  3. 计算机应用技术 平面设计,全国信息化计算机应用技术水平教育考试试卷 平面设计师...
  4. 第三方app_为什么第三方APP不能下载呢?
  5. Android之封装倒计时页面
  6. linux之ftp怎么把本地文件拷贝到服务端
  7. 剑指offer之求两个链表的第一个公共节点
  8. java之Synchronized(锁住对象和锁住代码)
  9. linux c之用fopen、fputs、fgets、 fseek来对文件进行写、替换、读
  10. 用非递归方式实现二叉树中序遍历