文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatis实战:四、insert 用法(普通插入、返回主键自增的值)

2023-09-27 15:50

关注

一、简单的 insert 方法

1.UserMapper.xml

            insert into sys_user(user_name,user_password,user_email,user_info,head_img,create_time)        values ( #{userName} , #{userPassword} , #{userEmail},        #{userInfo} , #{headImg, jdbcType=BLOB },        #{createTime, jdbcType= TIMESTAMP})    

指定特殊数据类型

(1)为了防止类型错误,对于 些特殊的数据类型,建议指定具体的 jdbcTypeheadimg 指定 BLOB 类型, createTime 指定 TIME STAMP 类型(2)BLOB 对应的类型是 ByteArrayinputStream ,就是二进制数据流由于数据库区分 date、time、datetime 类型,但是 Java 中一般都使用 jave.util.Date类型 因此为了保证数据类型的正确,需要手动指定日期类型, date、time datetime应的 JDBC 类型分别为 DATE、TIME、TIMESTAMP

<insert >元素,这个标签包含如下属性

id :命名空间中的唯 标识符,可用来代表这条语句parameterType :即将传入的语句参数的完全限定类名或别名 这个属性是可选的,因为 MyBatis 可以推断出传入语句的具体参数,因此不建议配置该属性flushCache :默认值为 true ,任何时候只要语句被调用,都会清空一级缓存和二级缓存timeout :设置在抛出异常之前,驱动程序等待数据库返回请求结果的秒数statementType :对于 STATEMENT PREPARED ALLABLE, MyBatis 会分别使用对应的 Statement PreparedStatement Callable tatement ,默认 值为PREPAREDuseGeneratedKeys :默认值为false ,如果设置为true, MyBatis 使用 JDBC getGeneratedKeys 方法来取出由数据库内部生成的主键keyProperty: MyBatis 通过 getGeneratedKeys 获取 键值后将要赋值的属性名如果希望得到多个数据库自动生成的列,属性值也可以是以逗号分隔的属性名称列keyColumn :仅对时INSERT和 UPDATE 有用 通过生成的键值设置 中的列名, 这个设置仅在某些数据库(如 PostgreSQL )中是必须的, 当主键列不是 中的第 列时要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表database Id :如果配置了 databaseidProvider会加载所有的不带 databaseId 的或匹配当前 databaseId 的语句 如果同时存在带databaseId 和不带 databaseid 的语句,后者会被忽略.

 2.UserMapperTest

  @Test    public void testinsert() {        SqlSession sqlSession = getSqlSession();        try {            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);            SysUser user = new SysUser();            user.setUserName("test1");            user.setUserPassword("123456");            user.setUserEmail("test@mybatis.tk");            user.setUserInfo("test_info");            user.setHeadImg(new byte[]{1, 2, 3});            user.setCreateTime(new Date());            //只插入一条数据            int result=userMapper.insert(user);            Assert.assertEquals(1, result);            //id null ,没有给 id 赋佳,并且没有配置回写 id 的值            Assert.assertNotNull(user.getId());            System.out.println(user.getId());        } finally {            sqlSession.rollback();//          sqlSession.commit();            sqlSession.close();        }    }

 1.只插入一条数据

Assert.assertEquals(1, result);

回滚(不写入数据库)

            sqlSession.rollback();//修改数据库 sqlSession.commit();

插入后判断是否为空(为空/不为空,抛异常)

Assert.assertNotNull(user.getId());Assert.assertNull(user.getId());

3.UserMapper

int insert(SysUser user);

二、返回主键自增的值

方法一:使用 JDBC 方式返回主键自增的值

useGeneratedKeys 设置为 true 后, MyBatis 会使用 JDBC getGeneratedKeys方 法来取出 由数据库内部生成的主键。获得主键值后将其赋值给 keyProperty 配置的 id 属性。 当需要设置多个属性时,使用逗号隔开,这种情况下通常还需要设置 keyCo lumn 属性 按顺 序指定数据库的列,这里列的值会和 keyProperty 配置的属性一一对应。由于要使用数据库 返回的主键值,所以 上下两部分的列中去掉了 id 列和对应的#{ id }属性。

 方法二:使用 selectKey 返回主键的值

            SELECT LAST_INSERT_ID()        
1.selectKey 标签 keyColumn keyProperty 和上面 useGeneratedKeys 的用法含义相同 ,这 resultType 用于设置返回值类型 ,order 属性的设置和使用的数据库有关 MySQL 数据库中, order 属性设置的值是 AFTER,因为当前记录的主键值在 insert 语句 ,执行成功后才能获取 而在 Oracle 数据库中, order 的值要设置为 BEFORE ,这是因为 Oracl 中需要先从序列获取值,然后将值作为主键插入到数据库中.2.可以发现, selectKey 元素放置的位置和之前 MySQL 例子中的不同,其实这个元素放置的位置不会影响 selectKey 中的方法在 insert 前面或者后面执行的顺序,影响执行顺序 order 属性,这么写仅仅是为了符合实际的执行顺序,看起来更直观而已selectKey 元素中的内容。它内容就是一个独立的 SQL 语句,在 Oracle 示例中, SELECT SEQ_ ID.nextval from dual是一个获取序列的 SQL 语句。 MySQL 中的 SQL 语句 SELECT LAST_ INSERT_ ID ()用于获取数据库中最后插入的数据的 ID 以下是其他 些支持主键自增的数据库配置 electKey中回写主键的 SQL··DB2 使用 VALUES IDENTITY_VAL_LOCAL ()• MYSQL 使用 SELECT LAST_INSERT_ID ()• SQLSERVER 使用 SELECT SCOPE_IDENTITY ()。• CLOUDSCAPE 使用 VALUES IDENTITY_VAL_LOCAL ()• DERBY 使用 VALUES IDENTITY_VAL_LOCAL ()• HSQLDB 使用 CALL IDENTITY()SYBASE 使用 SELECT @@IDENTITY• DB2 MF 使用 SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMYl• FORMIX 使用 select dbinfo ('sqlea.sqlerrdl') from systables wheretabid=l

来源地址:https://blog.csdn.net/H215919719/article/details/128131512

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯