自定义SQL
在条件构造器章节中,最后我们使用UpdateWrapper
提供的Setsql
方法实现了复杂的更新。但是在SetSql
中写死 SQL 语句并不是一个好的方案,因为 SQL 语句最好都是维护在持久层,而不是业务层。
就当前案例来说,由于条件语句是in
语句,只能将 SQL 写在Mapper.xml
文件,利用foreach
来生产动态 SQL。这样有些麻烦,随着条件的增多,动态 SQL 也会更加复杂。所以我们可以借助Mybatisplus 提供的自定义 SQL 的功能,利用Wrapper
来生成查询条件。
@Test
void testCustomWrapper() {
// 1.准备条件
List<Long> ids = List.of(1L, 2L, 4L);
QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);
// 2. 调用mapper中的自定义方法
userMapper.deductBalanceByIds(200, wrapper);
}
然后再UserMapper中自定义SQL:
public interface UserMapper extends BaseMapper<User> {
@Select("UPDATE user SET balance = balance - #{money} ${ew.customSqlSegment}")
void deductBalanceByIds(@Param("money") int money, @Param("ew") QueryWrapper<User> wrapper);
}
多表关联
MybatisPlus 并不支持多表查询,不过我们可以利用Wrapper
中自定义条件结合自定义SQL来实现多表查询的效果。
@Test
void testCustomJoinWrapper() {
// 1.准备自定义查询条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.in("u.id", List.of(1L, 2L, 4L))
.eq("a.city", "北京");
// 2.调用mapper的自定义方法
List<User> users = userMapper.queryUserByWrapper(wrapper);
users.forEach(System.out::println);
}
@Select("SELECT u.* FROjavaM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}")
List<User> queryUserByWrapper(@Param("ew")QueryWrapper<User> wrapper);
MybatisPlus提供了一些常量供我们使用,因此这里我们可以这样写:
@Select("SELECT u.* FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}")
List<User> queryUserByWrapper(@Param(CONSTANCT.WHERE)QueryWrapper<User> wrapper);
最后更新于
这有帮助吗?