一、使用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();
}
}