Mybatis支持的主键生成方案

摘要:不管使用什么框架,只要需要往数据库写入数据,主键生成问题都是头等大事。那么,mybatis是如何解决这个问题的呢

 

一、数据库自动生成主键

  在众多的关系型数据库管理产品当中,有许多产品其自身支持自动生成主键,如MySQL、SQL Server。如果我们想把主键生成的主动权交给数据库管理,Mybatis也提供了很好的支持。

就是无须作任何特别配置。 

<insert id="insert" parameterType="com.sensible.model.User">
    insert into sys_user (NAME, PASSWORD, salt, email, mobile, STATUS,
      dept_id, create_by, create_time, last_update_by, last_update_time, del_flag )
    values
    (
    #{name},
    #{password},
    #{salt},
    #{email},
    #{mobile},
    #{status},
    #{deptId},
    #{createBy},
    #{createTime},
    #{lastUpdateBy},
    #{lastUpdateTime},
    #{delFlag}
    )
</insert>

主键回填  

  大多数在实际项目开发中,仅上面这么处理是不够的。实际开发中,表与表之间是相互关联的。A表的主键可能会是与B表相关联的字段,所以在我们写入B表时就需要知道A表的主键

那么,如何在插入A表数据时,返回A表的主键呢?可以作如下配置:

<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.sensible.model.User">
useGeneratedKeys会告诉MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键,keyProperty指定
能够唯一识别对象的属性,
MyBatis会使用getGeneratedKeys的返回值
insert语句的selectKey子元素设置它的值。

二、自定义主键
  对于不支持自动生成主键列的数据库,Mybatis还支持自定义生成主键,框架提供了主键生成器接口KeyGenerator,并为我们呈现了三种常用的实现,它们分别是
SelectKeyGenerator、Jdbc3KeyGenerator和NoKeyGenerator实现类。

Oracle序列模拟自增
每次插入新的数据,主键都从序列中取得。
<insert id="insert" databaseId="oracle">
    <selectKey keyProperty="" resultType="" order="BEFORE">
        select SQ_AAZ163.nextVal from dual
    </selectKey>
    insert into sys_user (id, NAME, PASSWORD, salt, email, mobile, STATUS, dept_id, create_by, create_time, last_update_by, last_update_time, del_flag )
    values
    (
    #{id},
    #{name},
    #{password},
    #{salt},
    #{email},
    #{mobile},
    #{status},
    #{deptId},
    #{createBy},
    #{createTime},
    #{lastUpdateBy},
    #{lastUpdateTime},
    #{delFlag}
    )
    </insert>            

MySQL的uuid作为主键
  MySQL不仅提供了自动增长主键列,还提供了uuid()生成uuid可以作为数据库表的主键。
<insert id="insert" databaseId="oracle">
    <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
        select replace(uuid(),'-','')  FROM dual
    </selectKey>
        insert into sys_user (id, NAME, PASSWORD, salt, email, mobile, STATUS,
    dept_id, create_by, create_time, last_update_by, last_update_time, del_flag )
    values
    (
    #{id},
    #{name},
    #{password},
    #{salt},
    #{email},
    #{mobile},
    #{status},
    #{deptId},
    #{createBy},
    #{createTime},
    #{lastUpdateBy},
    #{lastUpdateTime},
    #{delFlag}
    )
    </insert>
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/jordan0953/p/13278178.html