动力节点-始于2009年,口口相传的Java黄埔军校 400-8080-105

免费学前测评 领取最新教程资料

查看家门口的动力节点
当前位置: 首页 > 行业快讯 > 让我们深入的了解下mybatis返回主键id

让我们深入的了解下mybatis返回主键id

来源: 动力节点 时间:2023-04-23 08:43:00

  • 免费预约测评,鉴定适合再学
  • 4大方法+专家考评团把关
  • 预约成功即送15天零基础面授课

今日已有237人预约测评

  • 张同学137****9950预约成功
  • 欧阳同学186****9232预约成功
  • 赵同学132****3458预约成功
  • 李同学137****4580预约成功
  • 赵同学180****1218预约成功
  • 蔡同学186****2232预约成功

添加单一记录时返回主键ID

添加一条记录时返回主键值,在xml映射器和接口映射器中都可以实现。

在映射器中配置获取记录主键值

xml映射器

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


	
	
		insert into test(name,descr,url,create_time,update_time) 
		values(#{name},#{descr},#{url},now(),now())
	

接口映射器

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

// 返回主键字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);

获取新添加记录主键字段值

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

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

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

如果希望执行批量添加并返回各记录主键字段值,只能在xml映射器中实现,在接口映射器中无法做到。



	INSERT INTO test(name,descr,url,create_time,update_time) VALUES
		
		(#{t.name},#{t.descr},#{t.url},now(),now())
		

可以看到,执行批量添加并返回记录主键值的xml映射器配置,跟添加单条记录时是一致的。不同的地方仅仅是使用了foreach元素构建批量添加语句。

获取主键ID实现原理

需要注意的是,不论在xml映射器还是在接口映射器中,添加记录的主键值并非添加操作的返回值。实际上,在MyBatis中执行添加操作时只会返回当前添加的记录数。

package org.apache.ibatis.executor.statement;
public class PreparedStatementHandler extends BaseStatementHandler {
	@Override
    public int update(Statement statement) throws SQLException {
        PreparedStatement ps = (PreparedStatement) statement;
        // 真正执行添加操作的SQL语句
        ps.execute();
        int rows = ps.getUpdateCount();
        Object parameterObject = boundSql.getParameterObject();
        KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
        // 在执行添加操作完毕之后,再处理记录主键字段值
        keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
        // 添加记录时返回的是记录数,而并非记录的主键字段值
        return rows;
    }
}

顺便看一下MyBatis添加操作的时序图:

跟踪时序图执行步骤可以看到,MyBatis最终是通过MySQL驱动程序获取到了新添加的记录主键值。

以上就是动力节点小编介绍的"让我们深入的了解下mybatis返回主键id",希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为您务。

南京Java培训讲师师资团队 >更多

杜老师 Linux专家 大厂技术顾问专家 被誉为“Java教父”

孙老师 知名IT作家 原复旦大学教授 国内首批架构师骨干

Cat老师 资深架构师 亿级交易架构保障专家 擅长高并发高性能高可用

郭老师 高级软件工程师 曾任技术总监 擅长大型金融/银行支付业务

秦老师 原阿里高级工程师 资深系统架构师 精通云计算物联网底层技术

王老师 高级软件工程师 擅长零基础实战教学 被誉为“Java启蒙天后”

杨老师 资深软件工程师 北京奥运场馆人脸信息采集项目负责人

王老师 曾任某上市公司系统架构师 分布式,微服务实战应用专家

崔老师 特派海归软件工程师 曾任百度资深架构师

南京开班

>更多

Java实验班 2024-12-27 即将报满

Java实验班 2025-02-10 即将报满

Java实验班 2025-03-13 即将报满

Java就业班 2025-01-11 即将报满

Java就业班 2025-02-25 即将报满

Java就业班 2025-03-28 即将报满

热搜标签

Java培训班学费 Java培训班毕业找工作 零基础学Java好找工作吗 Java程序员好找工作吗 自学Java好找工作吗 学Java能做什么工作 Java就业前景 学Java要学多久 零基础学Java难吗 培训班学Java怎么样 什么样的人适合学Java Java培训多少钱 Java培训班靠谱吗
400-8080-105 在线咨询3秒即回
官方微信 随时了解最新动态
扫一扫进入 动力节点手机站

运营主体北京动力节点教育科技有限公司,属具备计算机技术培训资质的教育培训机构