使用技巧之——MyBatis如何返回插入主键

 

 

优点

  • mybatis是一种持久层框架,也属于ORM映射。前身是ibatis。
  • 相比于hibernatehibernate为全自动化,配置文件书写之后不需要书写sql语句,但是欠缺灵活,很多时候需要优化;
  • mybatis为半自动化,需要自己书写sql语句,需要自己定义映射。增加了程序员的一些操作,但是带来了设计上的灵活,并且也是支持hibernate的一些特性,如延迟加载,缓存和映射等;对数据库的兼容性比hibernate差。移植性不好,但是可编写灵活和高性能的sql语句。
  • 简单易学
  • 灵活

提醒:本文主要讲述一下使用MyBatis对MySQL数据库添加记录后获取主键ID的方法,不涉及MS Server或者Oracle,敬请注意。

MyBatis添加记录后获取主键ID,这是一个很常见的需求。这个需求有分为两种情况:(1)添加单条记录时获取主键值;(2)获取批量添加记录时各记录的主键值。

备注:MyBatis从3.3.1版本开始支持批量添加记录并返回各记录主键字段值。

1、添加单一记录时返回主键ID(方法一)

此种方法主要思路是:使用<insert>标签或者@Insert注解的属性:useGeneratedKeys、keyProperty、keyColumn。下面分别以xml映射器和注解映射器分别详细阐述一下。

1.1、xml映射器

在定义xml映射器时设置属性useGeneratedKeys值为true,并分别指定属性keyProperty和keyColumn为对应的数据库记录主键字段与Java对象的主键属性。

<mapper namespace="cn.mybatis.mydemo.mapper">
    <!-- 插入数据:返回记录主键id值 -->
    <insert id="insertPerson" parameterType="cn.mybatis.mydemo.domain.Person" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
        insert into t_person(name,sex,age,create_time,update_time) 
        values(#{name},#{sex},#{age},now(),now())
    </insert>
</mapper>

1.2 接口映射器

在接口映射器中通过注解@Options分别设置参数useGeneratedKeys,keyProperty,keyColumn值

// 返回主键字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into t_person(name,sex,age,create_time,update_time) values(#{name},#{sex},#{age},now(),now())")
Integer insertPerson(Person person);

需要注意的是,在MyBatis中添加操作返回的是记录数并非记录主键id。因此,如果需要获取新添加记录的主键值,需要在执行添加操作之后,直接读取Java对象的主键属性。

Integer rows = sqlSession.getMapper(PersonMapper.class).insertPerson(person);
System.out.println("rows = " + rows); // 添加操作返回记录数
System.out.println("id = " + person.getId()); // 执行添加操作之后通过Java对象获取主键属性值

添加单一记录时返回主键ID(方法二)

在上面方法一中,如何获取自增的id呢,估计很多人还有点疑惑,其实原理很简单:当插入数据之后,mybatis再次查询mysql数据库,获得了注解id,然后填充到person对象的id属性的。

这个获取主键的过程,可以通过selectKey看得更清楚:

<insert id="insertPerson" parameterType="cn.mybatis.mydemo.domain.Person">
    <selectKey resultType="INTEGER" order="AFTER" keyProperty="id">
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into t_person(name,sex,age,create_time,update_time) 
    values(#{name},#{sex},#{age},now(),now())
  </insert>

代码说明:

(1)SELECT LAST_INSERT_ID(): 获取刚刚插入的主键;(2)keyProperty:表示将返回的值设置到某一列,此处为id;(3)order:表明此代码相对于insert语句的执行顺序,BEFORE(适用于Oralce等取序列的数据库)/ARTER(适用于MySQL等支持自增长的数据库);(4)resultType:返回的类型;

备注:参考MyBatis @SelectKey注解用法介绍

批量增加记录时返回主键ID

与单条记录插入类似,只不过要注意:parameterType="java.util.List",原理类似,只不过批量插入是针对每个插入对象Person

<mapper namespace="cn.mybatis.mydemo.mapper">
    <!-- 插入数据:返回记录主键id值 -->
    <insert id="insertPerson" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
        insert into t_person(name,sex,age,create_time,update_time) 
        values
        <foreach collection="list" item="item" index="index" separator="," >
            (
            #{item.name},
            #{item.sex},
            #{item.age},
            now(),
            now()    
            )
        </foreach>
    </insert>
</mapper>

最后

小编码字不易,各位大佬转发+关注一手再走好吗。

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
01-12 20:31
东北大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务