5.5 mybatis之useGeneratedKeys作用

文章目录

  • [1. 开启支持全局自增主键](#1. 开启支持全局自增主键)
  • [2. 只开启局部自增主键](#2. 只开启局部自增主键)

官方解释 useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。
其实就是useGeneratedKeys参数控制用数据库自增的主键作为数据库插入的主键,并且在应用中可以获取自增的主键。

useGeneratedKeys有2个取值:true和false。取值true时表示开启支持自动生成主键;取值false时关闭支持自增主键,但如果关闭了支持自增主键,也可以对局部的SQL设置使用自增主键。默认取值false

下面通过具体的例子演示下具体使用情况。

1. 开启支持全局自增主键

假设数据库中有个PERSON表,如下所示,其中persion_id字段为自增主键。

对应的java中Person类为

java 复制代码
public class Person {
    private int id;
    private String name;
    private int age;
    //省略get/set/toString方法
}    

下面修改mybatis的配置,开启useGeneratedKeys参数

xml 复制代码
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="useGeneratedKeys" value="true"/>
</settings>

在mapper中定义插入的SQL如下所示

xml 复制代码
<insert id="insert" parameterType="com.lzj.bean.Person" keyProperty="id" keyColumn="person_id">
    insert into PERSON(person_name, person_age) values(#{name},#{age});
</insert>

执行下面测试案例

java 复制代码
public void sqlSessionTest4(){
    SqlSessionFactory factory = mybatisUtil.getFactory();
    SqlSession sqlSession = factory.openSession(true);  //true表示自动提交
    Person person = new Person();
    person.setAge(40);
    person.setName("Dobu");
    sqlSession.insert("com.lzj.dao.PersonDao.insert", person);
    System.out.println("自增逐渐为:" + person.getId());
}

输出结果如下所示,发现数据库生成了自增主键8

java 复制代码
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 240959474.
==>  Preparing: insert into PERSON(person_name, person_age) values(?,?); 
==> Parameters: Dobu(String), 40(Integer)
<==    Updates: 1
自增逐渐为:8

那继续查询数据库验证是不是插入了自增主键为8的一条数据,执行成功。

2. 只开启局部自增主键

有时候并不想通过settings下的useGeneratedKeys参数设置所有的表的SQL都开启自增主键,只是想对指定的表或者指定的SQL开启自增主键,该如何操作?

和上面的例子一样,但首先关闭全局自增主键,修改mybatis的配置文件如下所示

xml 复制代码
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="useGeneratedKeys" value="false"/>
</settings>

然后修改mapper中SQL如下所示,对局部SQL设置了 useGeneratedKeys="true"

xml 复制代码
<insert id="insert" parameterType="com.lzj.bean.Person" useGeneratedKeys="true" keyProperty="id" keyColumn="person_id">
    insert into PERSON(person_name, person_age) values(#{name},#{age});
</insert>

执行下面的插入测试案例

java 复制代码
/*插入一条数据*/
public void sqlSessionTest4(){
    SqlSessionFactory factory = mybatisUtil.getFactory();
    SqlSession sqlSession = factory.openSession(true);  //true表示自动提交
    Person person = new Person();
    person.setAge(33);
    person.setName("Lee");
    sqlSession.insert("com.lzj.dao.PersonDao.insert", person);
    System.out.println("自增逐渐为:" + person.getId());
}

执行结果如下所示,发现又获取了自增的主键9

java 复制代码
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 640161448.
==>  Preparing: insert into PERSON(person_name, person_age) values(?,?); 
==> Parameters: Lee(String), 33(Integer)
<==    Updates: 1
自增逐渐为:9

继续查询数据库验证下,说明上述全局和局部两种方式都可以支持数据库自增主键行为。

注意:自增主键只对insert类型的SQL起作用。

相关推荐
代码什么用3 天前
使用javassist生成类 && MyBatis中接口代理机制及使用
mybatis
paopaokaka_luck3 天前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
韩曙亮4 天前
【JavaEE】MyBatis 基本用法 ⑤ ( 单条件查询 | 多条件查询 | 多条件动态查询 | 单条件动态查询 )
java·sql·java-ee·mybatis·mapper·sql映射
x-Achan4 天前
Redis实现方案:更新策略、穿透、雪崩、击穿、工具封装
java·spring boot·redis·spring·bootstrap·mybatis
shuoshuohaohao5 天前
MyBatis 小知识点
java·spring·mybatis
CarIise6 天前
MyBatis动态SQL:从条件拼接到底层原理实战
mybatis
CarIise7 天前
Spring Boot图片展示与统一返回格式:从资源映射到泛型封装实战
mybatis
钝挫力PROGRAMER7 天前
开发踩坑记:MyBatis selectKey、空 SQL
数据库·sql·mybatis
自强的小白7 天前
核心功能(Service接口)
java·mybatis
自强的小白7 天前
mybatis-plus 的扩展功能
mybatis·mybatis_plus