极悦-始于2009年,口口相传的Java黄埔军校 444-1124-454
来源: 极悦 时间:2023-04-23 08:43:00
添加单一记录时返回主键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,你有没有下面这些困惑呢?对Java了解不深,学完不知道能做什么?想转行,又害怕辞职培训就业没保障?专业不对口,怕学完不好就业?觉得学费贵,经济压力大?没编程经验,担心不适合这个职业?想自学,又怕学的不牢靠找不到工作,浪费时间?详情>>
2023-07-28 10:05:44极悦成立14年,目前设有10个分校,同时在校的学生人数众多,怎样实现统一管理?口口相传的Java黄埔军校,严格的教学管理服务制度怎样被“复制”到各个校区呢?学员高薪就业,高就业率又是怎样在各校区得以延续?详情>>
2023-07-28 09:55:432023年,随着互联网产业的蓬勃发展,程序员作为一个自带“高薪多金”标签的热门群体,被越来越多的人所关注。详情>>
2023-07-20 16:14:40