在开发过程中,可能一次对多个表进行操作。比如现在有两个表:用户表和订单表,主键id都是自增的。
应用场景:一个新用户添加了一个新的订单。
操作过程:
分成三步,就太浪费与数据库链接的资源了。为什么不直接在插入用户记录后,将新用户的主键与插入的结果一起返回呢?
这个时候,在mapper.xml中加入参数 useGeneratedKeys="true" keyProperty="id",就比较方便了!
Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。
下面举个简单的小例子:
public class CustomerBean implements Serializable {
private Long customerId;
private String customerName;
private Long customerPhone;
private String customerAddr;
}
<!--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>
@Repository
public interface CustomerDao {
int add(CustomerBean customerBean);
}
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 是67
惊不惊喜?
意不意外?
并不奇怪,返回的结果就是插入数据的条数,也即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);
大功告成~~
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务