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

这篇具有很好参考价值的文章主要介绍了mybatis实战:四、insert 用法(普通插入、返回主键自增的值)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简单的 insert 方法

1.UserMapper.xml

      <insert id="insert" useGeneratedKeys="true" keyProperty="id" >
      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})
    </insert>

1.指定特殊数据类型

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

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

id :命名空间中的唯 标识符,可用来代表这条语句
parameterType :即将传入的语句参数的完全限定类名或别名 这个属性是可选的,因为 MyBatis 可以推断出传入语句的具体参数,因此不建议配置该属性
flushCache :默认值为 true ,任何时候只要语句被调用,都会清空一级缓存和二级缓存
timeout :设置在抛出异常之前,驱动程序等待数据库返回请求结果的秒数
statementType :对于 STATEMENT PREPARED ALLABLE, MyBatis 会分别使用对应的 Statement PreparedStatement Callable tatement ,默认 值为PREPARED
useGeneratedKeys :默认值为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);

2.回滚(不写入数据库)

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

3.插入后判断是否为空(为空/不为空,抛异常)文章来源地址https://www.toymoban.com/news/detail-733459.html

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

3.UserMapper

int insert(SysUser user);

二、返回主键自增的值

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

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

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

<selectKey resultType="Long" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
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 where
tabid=l

到了这里,关于mybatis实战:四、insert 用法(普通插入、返回主键自增的值)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot】Mybatis执行insert/update后如何获得主键id

    在业务开发的时候,由于MyBatis框架的insert语句默认是不返回记录的主键值,而是返回插入的记录条数的,但是如果业务层需要得到插入数据的主键时候,可以通过配置的方式来实现获取插入数据的ID功能。 方法1、开启useGeneratedKeys属性方法 方法2、使用selectKey和 order=\\\"AFTER\\\"方式

    2024年02月11日
    浏览(41)
  • Mybatis使用insert插入后获取id值

    在mapper中定义insert方法: 属性 useGeneratedKeys:设置为true,否则无法获取到主键id。 keyProperty:实体类对象的主键id属性名称。 keyColumn:数据库中主键id字段名称。 调用orderMapper.insertOrder(record)执行插入语句,返回值是一个int类型,如果成功返回的是1,失败返回的是exception。 插

    2024年02月16日
    浏览(45)
  • Mybatis 批量新增 只返回第一主键ID 其他返回null

    出现 问题 是加 on duplicate key update 受了影响, 去掉 on duplicate key update代码 ON DUPLICATE key update是根据索引字段是否重复来判断是否执行,如果重复则执行update,否则则执行insert。 优先级主键唯一索引 当主键重复时则执行update 当主键不重复,唯一索引重复时也执行update 当主键

    2024年02月16日
    浏览(38)
  • Mybatis的<insert>,<update>,<delete>标签用法

    之前对mybatis的select标签以及其他相关标签做了讲解,很多标签也是可以拿到增删改的标签中来用的,下面先说下insert标签的用法: insert 标签顾名思义就是插入语句,用于将数据插入到数据库中,一般插入标签没有返回值,传入一个实体对象的数据,一般不对插入的数据做判断

    2024年02月07日
    浏览(39)
  • mysql表主键自增过大问题

    问题及项目环境   问题 最近在做项目时,发现我创建的每一个表的主键设置自增,在插入数据数据时会出现 自增值过大的问题。 问题展示: 在后端执行Basemapper中的insert()方法时,数据库中的主键id字段为下: 且我在对应的实体类的设置为下:  我们的期望时看到Id = 1,而不是

    2024年02月16日
    浏览(45)
  • spring boot集成mybatis-plus——Mybatis Plus 新增数据并返回主键 ID(图文讲解)

     更新时间 2023-01-10 15:37:37 大家好,我是小哈。 本小节中,我们将学习如何通过 Mybatis Plus 框架给数据库表新增数据,主要内容思维导图如下: Mybatis Plus 新增数据思维导图 为了演示新增数据,在前面小节中,我们已经定义好了一个用于测试的用户表, 执行脚本如下: 定义一

    2024年02月02日
    浏览(54)
  • 通过DBeaver 给Postgre SQL表 设置主键自增

    1.创建表 CREATE TABLE public.company ( id int4 NOT NULL , name text NOT NULL, age int4 NOT NULL, address bpchar(50) NULL, salary float4 NULL, join_date date NULL, CONSTRAINT company_pkey PRIMARY KEY (id) ); 2.插入数据(不传入id) INSERT INTO public.company (name, age, address, salary, join_date) VALUES(\\\'Kobe\\\', 20, \\\'Lake\\\', 10000, \\\'1996-07-13\\\');  

    2024年02月12日
    浏览(70)
  • Hibernate适配DM数据库主键自增配置

    hibernate有多种生成主键策略,例如assigned、increment、hilo、seqhilo、sequence、identity、native、uuid、guid等方法,其中native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用

    2023年04月24日
    浏览(47)
  • mysql高并发下主键自增打来的问题

    在一般情况下,在新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键,在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里,如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值,对

    2024年02月13日
    浏览(37)
  • MySQL数据库——MySQL AUTO_INCREMENT:主键自增长

    在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 通过给字段添加  AUTO_INCREMENT  属性来实现主键自增长。语法格式如下: 默认情况下,AUTO_INCREMENT 的初

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包