一、使用JDBC方式返回主鍵自增的值(只適用於允許主鍵自增的數據庫)
主要的變化是在insert標簽上配置如下兩個屬性:
useGeneratedKeys=" true"
keyProperty="id"
useGeneratedKeys 設置為 true 后, MyBatis 會使用 JDBC 的 getGeneratedKeys 方法來取出 由數據庫內部生成的主鍵。
獲得主鍵值后將其賦值給 keyProperty 配置的 id 屬性。
當需要設置多個屬性時,使用逗號隔開,這種情況下通常還需要設置 keyCo lumn 屬性 , 按順序指定數據庫的列,這里列的值會和 keyProperty 配置的屬性一一對應。
二、使用selectKey返回之間的值
注意看下面這段代碼,在 <insert>標簽增加了 selectKey 標簽 。
<selectKey keyColumn=” id” resultType=” long” keyProperty=” id” order=” AFTER” >
SELECT LAST INSERT ID ()
</selectKey>
selectKey 標簽 的 keyColumn 、 keyProperty 和上面 useGeneratedKeys 的用法含義相同 ,
resu ltType 用於設置返回值類型 。
order 屬性的設置和使用的數據庫有關 。
在 MySQL 數據庫中, order 屬性設置的值是 AFTER,因為當前記錄的主鍵值在 insert 語句執行成功后才能獲取到 。
而在 Oracle 數據庫中, order 的值要設置為 BEFORE ,這是因為 Oracle中需要先從序列獲取值,然后將值作為主鍵插入到數據庫中 。
selectKey 不同數據庫會有區別,根據具體數據庫。
Oracle 方式的副SERT 語句中明確寫出了 id列和值#{ id},因為執行 selectKey 中的
語句后 id 就有值了,我們需要把這個序列值作為主鍵值插入到數據庫中,所以必須指定 id
列,如果不指定這一列,數據庫就會因為主鍵不能為空而拋出異常 。
@Test
public void testInsert() {
SqlSession sqlSession = getSqlSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser sysUser = new SysUser();
sysUser.setUserName("testl ");
sysUser.setUserPassword(" 123456");
sysUser.setUserEmail("test@126.com");
sysUser.setUserInfo("test info");
//正常情況下應該讀入一張圖片存到 byte 數紐中
sysUser.setHeadImg(new byte[]{1, 2, 3});
sysUser.setCreateTime(new Date());
//將新建的對象插入數據庫中,特別注意這里的返回值 result 是執行的 SQL 影響的行數
int result = userMapper.insert2(sysUser);
Assert.assertEquals(1,result);
//id 為 null ,沒有給 id 賦值,並且沒有配置回寫 id 的值
Assert.assertNull(sysUser.getId());
} finally {
//為了不影響其他測試,這里選擇曰:農
// 由於默認的 sqlSessionFactory . openSession ()是不自動提交的
// 因此不手動執行 commit 也不會提交到數據庫
sqlSession.rollback();
sqlSession.close();
}
}