您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Fluent Mybatis中Update语法详解
## 一、Fluent Mybatis简介
### 1.1 什么是Fluent Mybatis
Fluent Mybatis是一个基于Mybatis的增强工具,它通过流畅的API设计让Mybatis的使用更加简单直观。相比传统Mybatis需要编写XML或注解SQL的方式,Fluent Mybatis提供了Java链式调用的语法糖,使得代码更易读、更易维护。
### 1.2 核心特性
- **流畅的API**:通过方法链实现SQL构建
- **类型安全**:编译时检查SQL语法
- **动态SQL**:支持复杂的条件构造
- **代码生成**:自动生成Entity、Mapper等基础代码
- **减少样板代码**:简化CRUD操作
### 1.3 与传统Mybatis对比
| 特性 | 传统Mybatis | Fluent Mybatis |
|---------------------|------------------|---------------------|
| SQL编写方式 | XML/注解 | Java链式调用 |
| 可读性 | 中等 | 高 |
| 类型安全 | 部分支持 | 完全支持 |
| 动态SQL复杂度 | 高 | 低 |
| 学习曲线 | 陡峭 | 平缓 |
## 二、Update语法基础
### 2.1 基本Update操作
Fluent Mybatis提供了`update()`方法开启Update操作:
```java
public int updateBasic() {
return new YourMapper()
.update()
.set(YourEntity.Column.name).is("newName")
.set(YourEntity.Column.age).is(25)
.where(YourEntity.Column.id).eq(1L)
.execute();
}
update()
: 开始构建update语句set()
: 设置要更新的字段is()
: 指定字段的新值where()
: 开始构建where条件eq()
: 等于条件execute()
: 执行操作并返回影响行数可以通过连续调用set()
方法更新多个字段:
public int updateMultiFields() {
return new UserMapper()
.update()
.set(User.Column.userName).is("张三")
.set(User.Column.age).is(30)
.set(User.Column.gmtModified).is(new Date())
.where(User.Column.id).eq(1L)
.execute();
}
Fluent Mybatis支持丰富的条件表达式:
.where(User.Column.age).gt(18) // 大于
.where(User.Column.age).ge(18) // 大于等于
.where(User.Column.age).lt(65) // 小于
.where(User.Column.age).le(65) // 小于等于
.where(User.Column.name).like("%张%") // 模糊查询
.where(User.Column.name).notLike("%李%") // 非模糊匹配
使用and
和or
连接多个条件:
public int updateWithMultiConditions() {
return new UserMapper()
.update()
.set(User.Column.status).is("ACTIVE")
.where(User.Column.age).gt(18)
.and(User.Column.age).lt(65)
.and(User.Column.status).eq("INACTIVE")
.execute();
}
通过apply
方法实现复杂嵌套条件:
public int updateWithNestedConditions() {
return new UserMapper()
.update()
.set(User.Column.remark).is("VIP")
.where(User.Column.vipLevel).gt(3)
.and(
condition -> condition.where(User.Column.regTime).ge(LocalDate.now().minusYears(1))
.or(User.Column.consumption).gt(10000)
)
.execute();
}
使用when
实现条件判断更新:
public int dynamicUpdate(Long id, String newName, Integer newAge) {
return new UserMapper()
.update()
.set(User.Column.userName).is(newName).when(Objects::nonNull)
.set(User.Column.age).is(newAge).when(newAge != null)
.where(User.Column.id).eq(id)
.execute();
}
通过Lambda实现更灵活的条件:
public int updateWithLambda(User user) {
return new UserMapper()
.update()
.set(User.Column.userName).is(user::getUserName).when(user::getUserName)
.set(User.Column.age).is(user::getAge).when(user::getAge)
.where(User.Column.id).eq(user::getId)
.execute();
}
配置全局空值处理:
@Configuration
public class FluentMybatisConfig {
@Bean
public FluentMybatisConfig config() {
return new FluentMybatisConfig()
.setGlobalUpdateIfNull(false); // 默认不更新null值
}
}
更新满足条件的所有记录:
public int batchUpdateByCondition() {
return new UserMapper()
.update()
.set(User.Column.status).is("INACTIVE")
.where(User.Column.lastLoginTime).lt(LocalDateTime.now().minusYears(1))
.execute();
}
使用in
条件批量更新:
public int batchUpdateByIds(List<Long> ids, String newStatus) {
return new UserMapper()
.update()
.set(User.Column.status).is(newStatus)
.where(User.Column.id).in(ids)
.execute();
}
@BatchSize
注解使用数学表达式实现:
public int incrementAge(Long userId) {
return new UserMapper()
.update()
.set(User.Column.age).increase(1) // 年龄+1
.where(User.Column.id).eq(userId)
.execute();
}
更新JSON类型字段:
public int updateJsonField(Long userId, String newExtInfo) {
return new UserMapper()
.update()
.set(User.Column.extInfo).isJson(newExtInfo)
.where(User.Column.id).eq(userId)
.execute();
}
通过版本号实现乐观锁:
public int updateWithOptimisticLock(User user) {
return new UserMapper()
.update()
.set(User.Column.userName).is(user.getUserName())
.set(User.Column.version).increase(1) // 版本号+1
.where(User.Column.id).eq(user.getId())
.and(User.Column.version).eq(user.getVersion()) // 原始版本号条件
.execute();
}
使用join
实现联表更新:
public int updateWithJoin() {
return new UserMapper()
.update()
.set(User.Column.status).is("VIP")
.join(Order.class)
.on(User.Column.id, Order.Column.userId)
.where(Order.Column.amount).gt(10000)
.execute();
}
多表关联更新:
public int multiTableUpdate() {
return new UserMapper()
.update()
.set(User.Column.level).is("GOLD")
.join(Order.class)
.on(User.Column.id, Order.Column.userId)
.join(Product.class)
.on(Order.Column.productId, Product.Column.id)
.where(Product.Column.category).eq("ELECTRONICS")
.and(Order.Column.createTime).ge(LocalDate.now().minusMonths(3))
.execute();
}
获取更新后的实体:
public User updateAndReturn(User user) {
return new UserMapper()
.update()
.set(User.Column.userName).is(user.getUserName())
.set(User.Column.age).is(user.getAge())
.where(User.Column.id).eq(user.getId())
.executeAndFetch();
}
@Transactional
public void updateWithTransaction(User user1, User user2) {
userMapper.updateById(user1);
userMapper.updateById(user2);
// 如果发生异常会自动回滚
}
@UpdateTime
自动记录更新时间explain
分析复杂更新语句配置日志级别:
logging.level.tech.richard.vo.user.mapper=DEBUG
public int batchUpdateUserStatus(List<Long> ids, String newStatus) {
return new UserMapper()
.update()
.set(User.Column.status).is(newStatus)
.set(User.Column.gmtModified).is(new Date())
.where(User.Column.id).in(ids)
.and(User.Column.isDeleted).eq(false)
.execute();
}
public int adjustOrderPrices(String category, BigDecimal ratio) {
return new OrderMapper()
.update()
.set(Order.Column.amount).math("amount * " + ratio)
.join(Product.class)
.on(Order.Column.productId, Product.Column.id)
.where(Product.Column.category).eq(category)
.and(Order.Column.status).eq("UNPD")
.execute();
}
public int updateUserPoints(Long userId, int pointsToAdd) {
return new UserMapper()
.update()
.set(User.Column.points).increase(pointsToAdd)
.set(User.Column.vipLevel).case()
.when(User.Column.points).ge(10000).then(3)
.when(User.Column.points).ge(5000).then(2)
.elseThen(1)
.end()
.where(User.Column.id).eq(userId)
.execute();
}
Fluent Mybatis的Update语法通过流畅的API提供了强大的数据更新能力,从简单的单字段更新到复杂的联表更新都能优雅实现。关键要点包括:
通过本文的全面介绍,相信您已经能够熟练运用Fluent Mybatis进行各种更新操作。建议结合官方文档和实际项目练习来巩固这些知识。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。