当前位置:   article > 正文

Mybatis 获取自增主键值(Mysql,Oracle)_mysql oracle mybatis auto

mysql oracle mybatis auto

本文转自:https://blog.csdn.net/yamadeee/article/details/83997122

在某些场景下,我们需要使用mybatis返回生成的主键值。Mybatis在insert和update标签中就提供了这种功能。

  1. <insert id=”indetifyId” useGeneratedKeys=true” keyProperty=”id” keyColumn="id">
  2. </insert>

useGeneratedKeys: 是否自动生成主键,默认false
keyProperty :返回的主键值赋给哪个属性
keyColumn: 数据库中的自增主键的列名,默认是数据库表的第一列。当主键列不是表中的第一列的时候需要设置,PostgreSQL必须设置。
主键自动生成,取决于数据库是否支持自增主键。实际上当设置了useGeneratedKeys=“true”,Mybatis会调用JDBC的getGeneratedKeys方法,并将获取的主键值赋值给keyProperty 指定的属性。

准备
Mysql数据库
 

  1. create table user(
  2. USER_ID bigint not null auto_increment,
  3. USER_NAME varchar(50) not null,
  4. USER_PASSWORD varchar(30) not null,
  5. CREATE_TIME datetime,
  6. ....
  7. primary key(USER_ID)
  8. )

实体

  1. package com.test.User
  2. public class User{
  3. private Long userId;
  4. private String userName;
  5. private String userPassword;
  6. ...
  7. setter getter....
  8. }

mapper

  1. public interface UserMapper{
  2. int insertUser(User user); //新增用户
  3. }

Service

  1. @Service
  2. public UserServiceImple implements UserService{
  3. @Autowired
  4. UserMapper userMapper;
  5. public Long inserUser(User user){
  6. //user数据操作,例如加密
  7. int inserts=userMapper.insertUser(user);
  8. if(inserts == 0)//插入失败
  9. return -1L;
  10. return user.getUserId();//返回主键值
  11. }
  12. }

获取主键值

  1. 对于支持主键自增的数据库(MySql)

  1. <insert id=”insertUser” useGeneratedKeys=true” keyProperty=”userId” >
  2. insert into user(
  3. user_name, user_password, create_time)
  4. values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
  5. </insert>

parameterType 可以不写,Mybatis可以推断出传入的数据类型。如果想要访问主键,那么应当parameterType 应当是java实体或者Map。这样数据在插入之后 可以通过ava实体或者Map 来获取主键值。上例中就是通过 getUserId获取主键

	user.getUserId()

2不支持主键自增的数据库(Oracle)

对于像Oracle这样的数据,没有提供主键自增的功能,而是使用序列的方式获取自增主键。可以使用<selectKey>标签来获取主键的值,这种方式不仅适用于不提供主键自增功能的数据库,也适用于提供主键自增功能的数据库。
select Key 一般的用法

  1. <selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE">
  2. </selectKey>


下面以 oracle 为例:
创建 Oracle 序列:

  1. -- 创建序列, 计数开始值: 1 ; 步长:1 ; 没有最大值, 当超过最大值时 开始从头开始计数
  2. create sequence USER_ID INCREMENT by 1 START WITH 1 NOMAXVALUE CYCLE;
  3. -- 获取当前序列号加 +1
  4. select USER_ID.nextval from dual;
  5. -- 获取当前序列号
  6. select USER_ID.currval from dual;

获取主键(序列号),并插入

  1. <insert id=”insertUser” >
  2. <selectKey keyColumn="id" resultType="long" keyProperty="userId" order="BEFORE">
  3. SELECT TO_CHAR(SYSDATE, 'yyyymmdd') || USER_ID.nextval as id from dual
  4. </selectKey>
  5. insert into user(
  6. user_id,user_name, user_password, create_time)
  7. values(#{userId},#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
  8. </insert>

此时会将Oracle生成的主键值赋予userId变量。这个userId 就是USER对象的属性,这样就可以将生成的主键值返回了。如果仅仅是在insert语句中使用但是不返回,此时keyProperty=“任意自定义变量名”,
resultType 可以不写。
Oracle 数据库中的值要设置为 BEFORE ,这是因为 Oracle中需要先从序列获取值,然后将值作为主键插入到数据库中。

虽然说Mybatis 官方文档说 可以推断出 resultType类型,但是实际操作过程中。 使用实体类的属性字段去接受selectKey的查询结果, 没有指明resultType 的话抛出了类似如下的异常:A query was run and no Result Maps were found for the Mapped Statement 'insertXXXX!selectKey

扩展:
如果Mysql 使用selectKey的方式获取主键,需要注意下面两点:

order : AFTER
获取递增主键值 :SELECT LAST_INSERT_ID()
 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/241362?site
推荐阅读
相关标签
  

闽ICP备14008679号