06. MyBatis 总结

mybatis 传递参数的 7 种方法

mybatis 传递参数的 7 种方法_独钓寒江雪~的博客-CSDN 博客_mybatis 传入对象参数
https://blog.csdn.net/bdqx_007/article/details/94836637

MySQL_插入更新 ON DUPLICATE KEY UPDATE

平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.
此时 插入数据的时候 ,经常会有这样的情况:
我们想向数据库插入一条记录:
若数据表中存在以相同主键的记录,我们就更新该条记录。
否则就插入一条新的记录。

1
2
3
4
5
6
7
$result = mysql_query('select * from xxx where id = 1');
$row = mysql_fetch_assoc($result);
if ($row) {
mysql_query('update ...');
} else {
mysql_query('insert ...');
}

但是这样写有两个问题

1、效率太差,每次执行都要执行2个sql
2、高并发的情况下数据会出问题,不能保证原子性

还好 MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE  达到以上目的, 且能保证操作的原子性和数据的完整性。

ON DUPLICATE KEY UPDATE 可以达到以下目的:

向数据库中插入一条记录:

若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。

否则插入一条新的记录。
示例:Step1 . 创建表,插入测试数据

1
2
3
4
5
6
7
8
9
10
11
DROP TABLE IF EXISTS `mRowUpdate`;
CREATE TABLE `mRowUpdate` (
`id` int(11) ,
`value` varchar(50),
sid char(10),
PRIMARY KEY (`id`)
);

INSERT INTO `mRowUpdate` VALUES ('1', 'aaa', 'aaabbb');
INSERT INTO `mRowUpdate` VALUES ('2', 'ccc', NULL);
INSERT INTO `mRowUpdate` VALUES ('3', 'eee', 'fff');

Step2 .测试 ON DUPLICATE KEY UPDATE 的使用方法:

1
2
INSERT INTO mRowUpdate(id,`value`) VALUES(3, 'SuperMan') ON DUPLICATE KEY UPDATE `value`='SuperMan';

使用 ON DUPLICATE KEY UPDATE 时,如果将行作为新行插入,则每行受影响的行数值为1; 如果更新了现有行数值,则为2; 如果将现有行数值设置为当前值,则为0。
Tips: VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL。
如果a = 1或 b = 2 匹配多行,则只更新一行。 通常,您应该尽量避免在具有多个唯一索引的表上使用 ondulicate KEY UPDATE 子句。

高效插入

使用 foreach 这种方法效率最高。

1
2
3
4
5
6
7
8
<insert id="insertBatch">
INSERT INTO t_user
(id, name, del_flag)
VALUES
<foreach collection ="list" item="user" separator =",">
(#{user.id}, #{user.name}, #{user.delFlag})
</foreach >
</insert>

参考

MySQL_插入更新 ON DUPLICATE KEY UPDATE
https://blog.csdn.net/u010003835/article/details/54381080