摘要:無論使用什麼框架,只要須要往數據庫寫入數據,主鍵生成問題都是頭等大事。那麼,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>