mybatis如何获取刚刚新插入数据的主键值id

 更新时间:2023年08月31日 17:17:00   作者:洛阳纸贵  
这篇文章主要介绍了mybatis如何获取刚刚新插入数据的主键值id问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

mybatis获取刚刚新插入数据的主键值id

插入操作后,立马返回主键Id。查阅了很多资料,用keyProperty和useGeneratedKeys属性。

useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。

当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

主要是以这样的方式:

<insert id="insertFileRecord" useGeneratedKeys="true" keyProperty="id">
      insert xxx
    </insert>

但是没有生效,于是我找用了useGeneratedKeys="true"的写法,发现我少写了

<insert id="insertFileRecord" parameterType="FileRecord" useGeneratedKeys="true" keyProperty="id">
      insert xxx
    </insert>

parameterType只能告诉它,在哪个实体类中,在Mybatis Mapper文件中添加属性 “useGeneratedKeys”和“keyProperty”,其中 keyProperty 是 Java 对象的属性名,而不是表的字段名。

但是还是没生效,我开始怀疑是我自增id是long类型,但实际上,并不是的,是我在mapper接口类中,加了这样一个注释

int insertFileRecord(@Param("fileRecord") FileRecord fileRecord);

并且在insert语句中fileRecord.fileName,去掉@Param,终于看到id了,

最后附上完整的写法:

mapper接口:

    /**
     * @Description: 新增数据
     * @Author: wj
     * @param: cc.jz.work.entity.FileRecord
     * @Return: 影响行数
     * @Date: 2022-03-31 10:37:18
     */
    int insertFileRecord(FileRecord fileRecord);

xml:

<insert id="insertFileRecord" parameterType="cc.jz.work.entity.FileRecord"  useGeneratedKeys="true" keyProperty="id">
        insert into
        file_record
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="fileAddress != null and fileAddress != ''">
                file_address,
            </if>
            <if test="fileName != null and fileName != ''">
                file_name,
            </if>
            <if test="uploadUserId != null">
                upload_user_id,
            </if>
            <if test="uploadTime != null">
                upload_time,
            </if>
            <if test="status != null and status != ''">
                status,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="fileAddress != null and fileAddress != ''">
                #{fileAddress,jdbcType=VARCHAR},
            </if>
            <if test="fileName != null and fileName != ''">
                #{fileName,jdbcType=VARCHAR},
            </if>
            <if test="uploadUserId != null">
                #{uploadUserId,jdbcType=INTEGER},
            </if>
            <if test="uploadTime != null">
                #{uploadTime,jdbcType=TIMESTAMP},
            </if>
            <if test="status != null and status != ''">
                #{status,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

mybatis中插入记录获取主键值

在数据库中主键的值是通过自动递增的方式创建的,然而在通过mybatis插入数据之后想获取插入数据的主键值可以通过下面两种方法:

方法一

在xml的配置文件中的insert标签中加入 <selectKey> 标签

<insert id="insert">
		<selectKey keyProperty="id" resultType="int" order="AFTER">
			select LAST_INSERT_ID()
		</selectKey>
		insert into t_student(uname,pass,stu_name,gender,birthdate,score)
		values(#{uname},#{pass},#{stu_name},#{gender},#{birthdate},#{score})
	</insert>
public static void doInsert() {
		SqlSession sqlSession = MybatisUtil.getSqlSession();
		Student s = new Student();
		s.setBirthdate("2020-01-01");
		s.setGender('1');
		s.setPass("123");
		s.setScore(69.3);
		s.setStu_name("张四");
		s.setUname("jack");
		int i = sqlSession.insert("student.insert",s);
		System.out.println("i="+i);
		System.out.println("新插入的学生的id为:"+s.getId());
		sqlSession.commit();
		sqlSession.close();
	}

注意:

  • selectKey标签中的 select LAST_INSERT_ID() 语句就能获取生成的主键
  • selectKey标签中的keyProperty属性就是主键名,MyBatis会自动将获取的主键封装给此属性。

order的值有两种:BEFORE、AFTER

  • BEFORE:先获取主键,然后执行insert; 比如 Oracle数据库。
  • AFTER:先执行insert,然后获取主键; 比如 MySql数据库。

方法二

在select标签中加入useGeneratedKeys=“true” keyProperty=“id”

<insert id="insert2" useGeneratedKeys="true" keyProperty="id">
		insert into t_student(uname,pass,stu_name,gender,birthdate,score)
		values(#{uname},#{pass},#{stu_name},#{gender},#{birthdate},#{score})
	</insert>

在这里插入图片描述

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot利用限速器RateLimiter实现单机限流的示例代码

    SpringBoot利用限速器RateLimiter实现单机限流的示例代码

    本文主要介绍了SpringBoot利用限速器RateLimiter实现单机限流的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 详解java接口(interface)在不同JDK版本中的变化

    详解java接口(interface)在不同JDK版本中的变化

    这篇文章主要介绍了详解java接口(interface)在不同JDK版本中的变化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • SpringBootTest测试时不启动程序的问题

    SpringBootTest测试时不启动程序的问题

    这篇文章主要介绍了SpringBootTest测试时不启动程序的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java多线程编程之从线程返回数据的两种方法

    java多线程编程之从线程返回数据的两种方法

    从线程中返回数据和向线程传递数据类似。也可以通过类成员以及回调函数来返回数据。但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪
    2014-01-01
  • Spring Cloud Feign实例讲解学习

    Spring Cloud Feign实例讲解学习

    这篇文章主要介绍了Spring Cloud Feign实例讲解学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Java实现两个日期相减等于天数

    Java实现两个日期相减等于天数

    这篇文章主要介绍了Java两个日期相减等于天数的实现方式,本文通过两种方式结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java泛型变量如何添加约束

    Java泛型变量如何添加约束

    这篇文章主要介绍了Java泛型变量如何添加约束,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • JAVA CountDownLatch(倒计时计数器)用法实例

    JAVA CountDownLatch(倒计时计数器)用法实例

    这篇文章主要介绍了JAVA CountDownLatch(倒计时计数器)用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java中的IP地址和InetAddress类使用详解

    Java中的IP地址和InetAddress类使用详解

    这篇文章主要介绍了Java中的IP地址和InetAddress类使用详解,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • springboot如何使用thymeleaf模板访问html页面

    springboot如何使用thymeleaf模板访问html页面

    springboot中推荐使用thymeleaf模板,使用html作为页面展示。那么如何通过Controller来访问来访问html页面呢?下面通过本文给大家详细介绍,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-05-05

最新评论