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

应用背景

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

应用场景:

        一个新用户添加了一个新的订单。

操作过程:

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

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

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


原理


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

例子


下面举个简单的小例子:

CustomerBean

public class CustomerBean implements Serializable {
    private Long customerId;
    private String customerName;
    private Long customerPhone;
    private String customerAddr;
}


Mapper.xml

<!--useGeneratedKeys默认是false,keyProperty实体类对应主键的属性 ,keyColumn表中的主键 -->
<insert id ="add" parameterType="CustomerBean" useGeneratedKeys="true" keyProperty="customerId" keyColumn="id">
        INSERT 
        INTO customer_table
        (customer_name, customer_phone, customer_addr)
        VALUES
        (#{customerName}, #{customerPhone}, #{customerAddr})
    </insert>


Dao层

@Repository
public interface CustomerDao {
 
    int add(CustomerBean customerBean);
}


Service层中对应的逻辑
   

    int i = CustomerService.add(customerBean);
    System.out.println(i);


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

那么输出就是新的主键?然而事实并不是这样!

真实的结果:

不是1就是0(插入数据的条数)。并不是所谓的主键!

注意,坑:


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

调试:

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

发现返回的结果就是插入数据的条数,也即0或1。

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

 
 
最终结果

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

参考文章:

Mybatis 参数 useGeneratedKeys="true" keyProperty="id"的用法-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/du939/article/details/100014905

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值