Mybatis 获取自增主键 useGeneratedKeys与keyProperty 解答
2022/8/4 23:27:06
本文主要是介绍Mybatis 获取自增主键 useGeneratedKeys与keyProperty 解答,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Mybatis 获取自增主键
今天开发的时候遇到一个疑惑,业务场景是这样的, 但是百度好久没有找到合适的解答,于是自己向同事了解,感觉还不错,因此写上了这个文章 有一个表A和一个表B A就是一个主表,B就是一个明细表 两表之间的关联关系是 A.ID = B.BusinessId 其中A.ID 是一个自增的字段 B.BusinessId非自增的字段
先不讲业务解答,先初步了解一下useGeneratedKeys 与keyProperty
若数据库支持自动生成主键(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键值后,将这个值封装给 JavaBean 的哪个属性。
前提就是你的数据库的的那个字段必须是自增的字段 然后你的mybatis 才可以设置这个字段是一个自增的字段
<insert id="addEmp" databaseId="mysql" parameterType="employee" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employee (id, last_name, email, gender) values (#{id}, #{lastName}, #{email}, #{gender}); </insert>
获取自增主键值:
@Test public void test04() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); try{ EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = new Employee(); employee.setLastName("wangwu"); employee.setEmail("wangwu@123.com"); employee.setGender("1"); boolean addEmp = mapper.addEmp(employee); System.out.println(addEmp); // 直接通过 getId() 方法来获取自增主键值 System.out.println(employee.getId()); sqlSession.commit(); } finally { sqlSession.close(); } }
[main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] ==> Preparing: insert into tbl_employee (id, last_name, email, gender) values (?, ?, ?, ?); [main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] ==> Parameters: null, wangwu(String), wangwu@123.com(String), 1(String) [main] [com.example.mapper.EmployeeMapper.addEmp]-[DEBUG] <== Updates: 1 true 9
好了,了解完了,就来开始讲讲我今天碰到的BUG
我在给主表自增的时候,我忘记设useGeneratedKeys与keyProperty 因为我当时寻思着的id是自增的,设不设置问题不大,反正数据库的字段会自增,
然后再给子表写xml的时候是这样的
我以为子表的id 有值,可是控制台给我报错,我的BusinessId是一个空指针
当我重新给主表设置useGeneratedKeys与keyProperty 后,我的BusinessId就有值了
具体是因为什么?
是因为useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键值后,将这个值封装给 JavaBean 的哪个属性。
我的业务场景有个前提:就是插入的类型,都是主表的类 给子表插入数据,也是主类
举个例子,我主表数据库里面的字段未增加数据之前,我的id为1,当我增加完主表之后,我的id就为2了,myabtis会把2传递给我实体类的id 这个字段上,当我再次给我的子表赋值,就是为2了
这篇关于Mybatis 获取自增主键 useGeneratedKeys与keyProperty 解答的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23JAVA语音识别项目入门教程
- 2024-11-23Java云原生学习:从入门到实践
- 2024-11-22Java创业学习:初学者的全面指南
- 2024-11-22JAVA创业学习:零基础入门到实战应用教程
- 2024-11-22Java创业学习:从零开始的Java编程入门教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22JAVA对接阿里云智能语音服务学习教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22Java副业学习:零基础入门到实战项目
- 2024-11-22Java副业学习:零基础入门指南