mybatisplus向主子表同时插数据
时间: 2023-07-04 08:17:52 浏览: 433
mybatis-plus-join是mybatis plus的一个多表插件
可以通过使用MyBatis-Plus的自动填充功能来实现同时向主子表插入数据。
首先,在主表和子表的实体类中分别添加主键字段和外键字段,并在主表实体类中添加子表实体类的集合字段。
然后,使用MyBatis-Plus的自动填充功能,在主表插入数据时同时向子表插入数据。具体的实现步骤如下:
1. 定义一个实现了MetaObjectHandler接口的类,用于自动填充主表和子表的字段值。
2. 在主表和子表的实体类中使用@TableField注解标注主键字段、外键字段和集合字段。其中,主键字段和外键字段需要使用主键生成策略,集合字段需要使用关联查询注解进行关联查询。
3. 在主表和子表的Mapper接口中定义插入方法,并使用@Insert注解标注。在插入方法中,通过MyBatis-Plus的BaseMapper接口的insert方法插入主表数据,并通过子表实体类的集合字段向子表插入数据。
例如,以下是一个使用MyBatis-Plus向主子表同时插入数据的示例:
```java
// 定义主表实体类
@Data
public class Order {
@TableId(type = IdType.AUTO)
private Long id;
private String orderNo;
private BigDecimal amount;
private Date createTime;
@TableField(exist = false)
private List<OrderItem> items;
}
// 定义子表实体类
@Data
public class OrderItem {
@TableId(type = IdType.AUTO)
private Long id;
private Long orderId;
private String productName;
private BigDecimal price;
}
// 定义主表Mapper接口
public interface OrderMapper extends BaseMapper<Order> {
@Insert("insert into orders(order_no, amount, create_time) values(#{orderNo}, #{amount}, #{createTime})")
int insertOrder(Order order);
}
// 定义子表Mapper接口
public interface OrderItemMapper extends BaseMapper<OrderItem> {
@Insert("insert into order_items(order_id, product_name, price) values(#{orderId}, #{productName}, #{price})")
int insertOrderItem(OrderItem item);
}
// 定义自动填充类
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Date now = new Date();
this.strictInsertFill(metaObject, "createTime", Date.class, now);
this.strictInsertFill(metaObject, "items", List.class, new ArrayList<>());
List<OrderItem> items = (List<OrderItem>) metaObject.getValue("items");
if (items != null) {
for (OrderItem item : items) {
this.strictInsertFill(item, "createTime", Date.class, now);
}
}
}
}
// 在Controller中调用插入方法
@RestController
public class OrderController {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper itemMapper;
@PostMapping("/orders")
public String createOrder(@RequestBody Order order) {
orderMapper.insert(order);
List<OrderItem> items = order.getItems();
if (items != null) {
for (OrderItem item : items) {
item.setOrderId(order.getId());
itemMapper.insert(item);
}
}
return "success";
}
}
```
在上述示例中,主表实体类为Order,子表实体类为OrderItem,主表Mapper接口为OrderMapper,子表Mapper接口为OrderItemMapper。在MyMetaObjectHandler类的insertFill方法中,通过自动填充将主表实体类的createTime和items字段值分别设置为当前时间和空列表,将子表实体类的createTime字段值设置为当前时间。在OrderController中的createOrder方法中,通过调用主表Mapper接口的insert方法插入主表数据,再通过遍历子表实体类的集合字段向子表插入数据。
需要注意的是,本例中的插入方法是手动调用的,实际应用中可以通过使用MyBatis-Plus的Service类的save方法来自动执行插入操作。
阅读全文