mybatis对mysql进行批量插入,存在则更新教程
在某些场景下,需要将一组数据插入数据库中,如果已存在,则进行更新。如果数据库是mysql,我们可以使用on duplicate key update语句,而不需要分别处理insert和update。
之前看了好多帖子,表结构和实体类要么都是驼峰,要么都是小写,而我的项目里表结构是下划线命名的,导致我一开始用时候,总是搞混,所以我把表结构和DO的结构也贴上来,好做个对比。
一、表结构(下划线)
<pre class="has">
DROP TABLE IF EXISTS planflow;
CREATE TABLE planflow
(
plan_no int DEFAULT 0 NOT NULL ,
flow_no int DEFAULT 0 NOT NULL ,
plan_type char DEFAULT ' ' NOT NULL ,
plan_invest decimal(20,4) DEFAULT 0.0 NOT NULL ,
plan_profit decimal(20,4) DEFAULT 0.0 NOT NULL ,
plan_balance decimal(20,4) DEFAULT 0.0 NOT NULL
);
ALTER TABLE planflow ADD PRIMARY KEY(plan_no,flow_no);
### 二、DO(驼峰)
```java @EqualsAndHashCode @ToString @Table(name="planflow") public class PlanFlowDO { @Id @Column(name = "plan_no") private Integer planNo; @Id @Column(name = "flow_no") private Integer flowNo; @Column(name = "plan_type") private String planType; @Column(name = "plan_invest") private BigDecimal planInvest; @Column(name = "plan_profit") private BigDecimal planProfit; @Column(name = "plan_balance") private BigDecimal planBalance; /** * get()和set()方法省略 */ } ``` ### 三、插入或更新(单条) 注意:on duplicate key update语句后面,等号前后两个值,均使用表字段,例:plan\_type = values(plan\_type) ``````htmlinsert into planflow ( plan_no , flow_no , plan_type , plan_invest , plan_profit , plan_balance ) values ( #{planNo} , #{flowNo} , #{planType} , #{planInvest}, #{planProfit}, #{planBalance} ) on duplicate key update plan_type = values(plan_type) , plan_invest = values(plan_invest) , plan_profit = values(plan_profit) , plan_balance = values(plan_balance) ``` ### 四、插入或更新(批量) 使用生成values()语句即可,同样的,on duplicate key update语句后面,等号前后两个值,均使用表字段,例:plan\_type = values(plan\_type) ``` ```htmlinsert into planflow ( plan_no , flow_no , plan_type , plan_invest , plan_profit , plan_balance ) values ```( #{item.planNo} , #{item.flowNo} , #{item.planType} , #{item.planInvest}, #{item.planProfit}, #{item.planBalance} ) on duplicate key update plan_type = values(plan_type) , plan_invest = values(plan_invest) , plan_profit = values(plan_profit) , plan_balance = values(plan_balance)