文章目录
  1. 1. 前言
  2. 2. 使用
    1. 2.1. set 属性更新
    2. 2.2. set 对象更新
  3. 3. 小结

项目地址: mybatis-dynamic-query

前言

主要这次更新是针对 UpdateQuery的一个增强 – 对象更新, 一直以来大家都在用 updateByDynamicQuery 或者 updateSelectiveByDynamicQuery, 先简单介绍一下

  • updateByDynamicQuery / updateByPrimaryKey 更新所有字段
  • updateSelectiveDynamicQuery / updateSeletiveByPrimaryKey 更新字段不为 null 的字段

但是有个情况上面两个方法是不好处理的,比如我又想更新某个字段为 null, 又想忽略对 create_time 和 update_time 赋值(mysql 中 create_time 和 update_time 是想让数据库赋值), 这样其实是不好用的。为了解决这个问题,我们新做了一个 UpdateQuery 让我们可以更具有自定义性。

使用

set 属性更新

这个就和我们写普通的 SQL 差不多, 就是对每个属性赋值。

1
2
3
4
5
6
UpdateQuery<Bug> updateQuery = UpdateQuery.createQuery(Bug.class)
.set(Bug::getAssignTo, "Marry")
// 可以加上判断让这个set 是否生效
.set(i % 2 == 0, Bug::getTitle, "title2")
// 筛选条件
.and(Bug::getId, isEqual(10000 + i));

set 对象更新

我们甚至可以直接把一个对象放进去全部更新, 并且可以通过配置选择(select)更新那些字段或者忽略(ignore)那些字段, (注意 select 优先级比 ignore 高,有 select 就会忽略 ignore)

  • select 选择属性更新
1
2
3
4
5
6
7
8
9
10
11
int id = 10000;
Bug updateBug = new Bug();
updateBug.setAssignTo("frankUpdate");
updateBug.setTitle("titleUpdate");

UpdateQuery<Bug> query = UpdateQuery.createQuery(Bug.class)
.set(updateBug,
// c 就是config 配置对象,只对assginTo 更新
c -> c.select(Bug::getAssignTo))
.and(Bug::getId, isEqual(id));
bugDao.updateByUpdateQuery(query);

我们看一下最终结果,确实只更新了 assignTo

1
2
3
4
5
JDBC Connection [HikariProxyConnection@1724399560 wrapping conn0: url=jdbc:h2:mem:default user=SA] will not be managed by Spring
==> Preparing: UPDATE bug SET assignTo=? WHERE (id = ?)
==> Parameters: frankUpdate(String), 10000(Integer)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5e268ce6]
  • ignore 忽略属性更新
1
2
3
4
5
6
7
8
9
10
11
int id = 10000;
Bug updateBug = new Bug();
updateBug.setAssignTo("frankUpdate");
updateBug.setTitle("titleUpdate");

UpdateQuery<Bug> query = UpdateQuery.createQuery(Bug.class)
.set(updateBug,
// c 就是config 配置对象,我们这里忽略对 Id, 和title 的更新
c -> c.ignore(Bug::getId, Bug::getTitle))
.and(Bug::getId, isEqual(id));
bugDao.updateByUpdateQuery(query);

我们看一下最终结果,确实只更新了 assignTo, 一般推荐对 id, create_time, update_time 这三个字段做忽略,让数据库自己赋值

1
2
3
4
5
JDBC Connection [HikariProxyConnection@1198158701 wrapping conn0: url=jdbc:h2:mem:default user=SA] will not be managed by Spring
==> Preparing: UPDATE bug SET assignTo=? WHERE (id = ?)
==> Parameters: frankUpdate(String), 10000(Integer)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2b4786dd]

小结

UpdateQuery 已经可以完全弥补 UpdateSeletive 或者 Update 这两个方法不足的地方。

文章目录
  1. 1. 前言
  2. 2. 使用
    1. 2.1. set 属性更新
    2. 2.2. set 对象更新
  3. 3. 小结