Mybatis「MySQL-Oracle」 中主键自动生成 序列化

有时候咱们不单单是经过返回 int 影响行数来肯定数据是否插入成功就好了,由于咱们老是会用到这个刚刚插入的自增主键,好比主子表入库,子表须要主表的 id,那这个时候咱们再去数据库查就显得有点 low 了~java

关于数据库中主键的生成无非就两种,一种是 int 类型的自增,一种是 varchar 类型的非自增(例如:UUID)。数据库

在 Mybatis 中,提供了 selectKey 来帮咱们获取新增的主键,同时经过 selectKey 能够很容易的实现自增仍是非自增规则的需求。ide

首先看一下 Mybatis 中 selectKey 的属性说明:ui

属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性(也就是自增的主键字段,好比id)。
resultType 结果的类型,好比java.lang.Integer,java.lang.String等。MyBatis 一般能够算出来,可是写上也没有问题。MyBatis 容许任何简单类型用做主键的类型,包括字符串。
order 这能够被设置为 BEFORE 或 AFTER。若是设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 而后执行插入语句。若是设置为 AFTER,那么先执行插入语句,而后是 selectKey 元素-这和如 Oracle 数据库类似,能够在插入语句中嵌入序列调用。
statementType 和前面的相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别表明 PreparedStatement 和 CallableStatement 类型。

下面从 Oracle 跟 MySQL 分别举例说明。对象

1. Oracle

<insert id="insertUserInfo" parameterType="club.sscai.entity.UserInfo">
    <selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
        select SEQ_T_USER_INFO.NEXTVAL from dual
    
    insert into "T_USER_INFO"
    <trim prefix="(" suffix=")" suffixOverrides=",">
        ID,USER_NAME,PASSWORD,PHONE,STATUS,
        <if test="remark != null">
            REMARK,
        if>
        CREATE_TIME,UPDATE_TIME,UPDATE_BY
    
    <trim prefix="values (" suffix=")" suffixOverrides=",">
        #{id,jdbcType=DECIMAL}, #{userName,jdbcType=VARCHAR},
        #{PASSWORD,jdbcType=VARCHAR},#{PHONE,jdbcType=VARCHAR},#{status,jdbcType=CHAR},
        <if test="remark != null">
            #{remark,jdbcType=VARCHAR},
        if>
        #{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}

如上代码主要是向 T_USER_INFO 表插入用户数据,parameterType 值传入的是实体对象,这里也能够是 map 或者是其余对象。rem

其中 的 keyProperty 值对应生成主键的字段,resultType 表示要返回的主键的类型,在这里我用的 Integer 类型,你也能够用 String,只要跟实体的字段对应便可。order 属性须要注意一下,不一样于支持自增类型的 MySQL 等数据库,Oracle 须要设置设置为 after 才能取到正确的值,可是若是要从序列化中取值,则须要设置为 befor,不然会报错,我上边的代码是从序列中取值因此设置为 befor。字符串

标签内的 SEQ_T_USER_INFO 表示该表的序列化,关于建立表序列化代码以下(SEQ_T_USER_INFO 名称随便起,尽可能规范便可):string

create sequence SEQ_T_USER_INFO
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
cache 20;

字符串 uuid 类型非自增主键, selectKey 以下:it

<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
    select sys_guid() from dual

2. MySQL

<insert id="insertUserInfo" parameterType="club.sscai.entity.UserInfo" >
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.string">
        select uuid()
    
    insert into T_USER_INFO 
        (id, user_name, PASSWORD,PHONE,STATUS,REMARK,CREATE_TIME,UPDATE_TIME,UPDATE_BY)
    values 
    (#{id},#{userName},#{password},#{phone},#{status},省略...)
insert>

上方是 MySQL 经过 select uuid() 就能获得 uuid 字符串,实现 UUID 字符串形式的主键生成。若是须要 int 类型则以下所示:table

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
    select LAST_INSERT_ID()
selectKey>

至此,关于主键生成基本已经完事了,再额外补充关于 order = befor、after 的应用。

若是你使用的是 UUID() 这种形式的,建议选择 order = befor,而 order = after 更适合返回自增(int)类型的主键。

相关文章
相关标签/搜索