摘要:无论使用什么框架,只要须要往数据库写入数据,主键生成问题都是头等大事。那么,mybatis是如何解决这个问题的呢java
1、数据库自动生成主键数据库
在众多的关系型数据库管理产品当中,有许多产品其自身支持自动生成主键,如MySQL、SQL Server。若是咱们想把主键生成的主动权交给数据库管理,Mybatis也提供了很好的支持。mybatis
就是无须做任何特别配置。 oracle
<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表的主键。ui
那么,如何在插入A表数据时,返回A表的主键呢?能够做以下配置:spa
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.sensible.model.User">
useGeneratedKeys会告诉MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键,keyProperty指定
可以惟一识别对象的属性,MyBatis会使用getGeneratedKeys的返回值或insert语句的selectKey子元素设置它的值。
2、自定义主键
对于不支持自动生成主键列的数据库,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>