ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis 获取自增主键 useGeneratedKeys与keyProperty 解答

2022-08-04 20:31:14  阅读:139  来源: 互联网

标签:keyProperty 自增 id 键值 employee 主表 主键


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了

标签:keyProperty,自增,id,键值,employee,主表,主键
来源: https://www.cnblogs.com/tuimao02/p/16552247.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有