mybatis(单个与批量)插入存在则更新

使用场景:config 表中增加相关配置信息,如果存在则更新,如果不存在则新增。在 MySQL 中也可以实现这样的操作。即 ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATE 依赖于主键或唯一索引。

示例

如下 SQL 语句(假定字段[config_key] unique index):

1
INSERT INTO  (config_key, config_value) VALUES ('phone', '123456789')  ON DUPLICATE KEY UPDATE config_value=values(config_value); 

若 phone 不存在等价于:

1
INSERT INTO  (config_key, config_value) VALUES ('phone', '123456789') ; 

若 phone 存在等价于:

1
UPDATE config SET config_value = '123456789' WHERE config_key = 'phone';

代码示例

引入依赖:

1
2
3
4
5
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>

Config 表结构:

1
2
3
4
5
6
7
8
CREATE TABLE `config` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`config_key` varchar(32) DEFAULT NULL COMMENT '键',
`config_value` varchar(32) DEFAULT NULL COMMENT '值',
`descr` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `key_name` (`config_key`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

Config.java:

1
2
3
4
5
6
7
8

@Setter
public class Config {
private Integer id;
private String configKey;
private String configValue;
private String descr;
}

ConfigDao.java:

1
2
3
4
5
6
7
8
9
10
11
 
* 多个
* @param configList
*/
void addList(@Param("configList") List<Config> configList);


* 单个
* @param config
*/
void add(Config config);

ConfigDao.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.guavacash.dao.ConfigDao">

<insert id="addList" parameterType="java.util.List">
insert into (config_key, config_value, descr) values
<foreach collection="configList" item="item" index="index" separator=",">
(
#{item.configKey},
#{item.configValue},
#{item.descr}
)
</foreach>
ON DUPLICATE KEY UPDATE config_value = values(config_value)
</insert>

<insert id="add" parameterType="com.guavacash.bean.Config">
insert into (config_key, config_value, descr) values (
#{configKey},
#{configValue},
#{descr}
)
ON DUPLICATE KEY UPDATE config_value = values(config_value)
</insert>

</mapper>