Mybatis 参数 useGeneratedKeys="true" keyProperty="id"的用法

Posted 爱笙灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 参数 useGeneratedKeys="true" keyProperty="id"的用法相关的知识,希望对你有一定的参考价值。

应用背景

在开发过程中,可能一次对多个表进行操作。比如现在有两个表:用户表和订单表,主键id都是自增的。

应用场景:一个新用户添加了一个新的订单。

操作过程:

  1. 在用户表中插入一条新纪录,
  2. 获取这个用户的id,
  3. 再在订单表中插入订单的相关信息(比如商品名称、价格……,以及用户的id)。

分成三步,就太浪费与数据库链接的资源了。为什么不直接在插入用户记录后,将新用户的主键与插入的结果一起返回呢?

这个时候,在mapper.xml中加入参数 useGeneratedKeys="true" keyProperty="id",就比较方便了!

 

 

原理

Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

 

 

例子

下面举个简单的小例子:

  • CustomerBean
 
  1.  
    public class CustomerBean implements Serializable
  2.  
    private Long customerId;
  3.  
    private String customerName;
  4.  
    private Long customerPhone;
  5.  
    private String customerAddr;
  6.  
 
  • Mapper.xml
 
  1.  
    <!--useGeneratedKeys默认是false,keyProperty实体类对应主键的属性 ,keyColumn表中的主键 -->
  2.  
    <insert id ="add" parameterType="CustomerBean" useGeneratedKeys="true" keyProperty="customerId" keyColumn="id">
  3.  
    INSERT
  4.  
    INTO customer_table
  5.  
    (customer_name, customer_phone, customer_addr)
  6.  
    VALUES
  7.  
    (#customerName, #customerPhone, #customerAddr)
  8.  
    </insert>
 
  • Dao层
 
  1.  
    @Repository
  2.  
    public interface CustomerDao
  3.  
     
  4.  
    int add(CustomerBean customerBean);
  5.  
 
  • Service层中对应的逻辑
 
  1.  
    int i = CustomerService.add(customerBean);
  2.  
    System.out.println(i);
 

大功告成,基本上就这么一个逻辑。运行service层,插入数据到数据库,然后将新生成的主键返回。


输出就是新的主键。。。。。?!(有些博主语焉不详的,到此截止了。然而事实并不是这样!)

真实的结果,不是1就是0。并不是所谓的主键!

 

 

注意,坑来了:

说好的自动将生成的主键返回呢?

通过调试,发现

 
  1.  
    int i = CustomerService.add(customerBean); //customerBean的customerId 是null
  2.  
    System.out.println(i); //customerBean的customerId 是6789
 

惊不惊喜?

意不意外?

并不奇怪,返回的结果就是插入数据的条数,也即0或1。

<insert>中设置useGeneratedKeys="true" keyProperty="customerId" keyColumn="id",插入返回的主键id是映射回原实体类中的!

 

 

最终结果

所以,如下:

 
  1.  
    int i = customerService.add(customerBean);
  2.  
    System.out.println(i); //1
  3.  
    Long customerId = customerBean.getCustomerId();
  4.  
    System.out.println(customerId); //6790
  5.  
     
  6.  
    // 那么,直接插入订单表
  7.  
    consumeBean.setCustomerId(customerId);
  8.  
    int j = consumeService.add(consumeBean);
 
 

大功告成~~

mybatis如何插入表得到主键 useGeneratedKeyskeyPropertykeyColumn ```xml <insert id=“insertEo“ useGeneratedKe(代码

mybatis如何插入表得到主键 useGeneratedKeys、keyProperty、keyColumn

<insert id="insertEo" useGeneratedKeys="true" keyProperty="eo.id" keyColumn="id">
        INSERT INTO t_table (name,tenant_id,type,create_person,update_person,create_time,update_time) values(#eo.name,#eo.tenantId,#eo.type,'System','System',NOW(),NOW())
    </insert>

使用 useGeneratedKeys="true" keyProperty="eo.id" keyColumn="id"

其实某些字段上是可以省略的,不过都指定上也不会有措。

如果用注解,是这样子

@Insert("<script>" +
            "INSERT INTO t_table (name,tenant_id,type,create_person,update_person,create_time,update_time) values(#eo.name,#eo.tenantId,#eo.type,'System','System',NOW(),NOW())" +
            "</script>")
    @Options(useGeneratedKeys=true, keyProperty = "eo.id", keyColumn = "id")
    int insertEo(@Param("eo") DataGroupEo dataGroupEo);

以上是关于Mybatis 参数 useGeneratedKeys="true" keyProperty="id"的用法的主要内容,如果未能解决你的问题,请参考以下文章

mybatis插入数据后返回自增主键ID详解

mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常

mybatis 怎么获取多个参数

mybatis中怎么传参数可以提高查询效率

mybatis多个参数不加@Param

mybatis中mapper方法怎么传入多个参数值