自定义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);

最后更新于

这有帮助吗?