mybatis记录随便(二)insert获取主键方法

一、使用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();
}
}
posted @ 2019-07-24 17:31  攻城狮~2022  阅读(1288)  评论(0编辑  收藏  举报
所有内容都是自己使用过程的总结,如有不严谨或者不正确的地方,麻烦大家留言指出,一起研讨。