• 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();
    }
    }
  • 相关阅读:
    javaWeb下载
    javaWeb上传
    JavaWeb过滤器
    JavaWeb中的监听器
    数据库dbutils
    数据库连接池
    51nod 1837 砝码称重【数学,规律】
    Codeforces Round #437 (Div. 2)[A、B、C、E]
    Codeforces Round #436 (Div. 2)【A、B、C、D、E】
    Codeforces Round #435 (Div. 2)【A、B、C、D】
  • 原文地址:https://www.cnblogs.com/lovechengyu/p/11239573.html
一二三 - 开发者的网上家园