当前位置:   article > 正文

MybatisPlus----- 核心功能 自定义SQL_mybatisplus自定义sql

mybatisplus自定义sql

在演示UpdateWrapper的案例中,我们在代码中编写了更新的SQL语句

这种写法在某些企业也是不允许的,因为SQL语句最好都维护在持久层,而不是业务层。就当前案例来说,由于条件是in语句,只能将SQL写在Mapper.xml文件,利用foreach来生成动态SQL。 这实在是太麻烦了。假如查询条件更复杂,动态SQL的编写也会更加复杂。

所以,MybatisPlus提供了自定义SQL功能,可以让我们利用Wrapper生成查询条件,再结合Mapper.xml编写SQL

2.2.1.基本用法

以当前案例来说,我们可以这样写:

  1. @Test
  2. void testCustomWrapper() {
  3. // 1.准备自定义查询条件
  4. List<Long> ids = List.of(1L, 2L, 4L);
  5. QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);
  6. // 2.调用mapper的自定义方法,直接传递Wrapper
  7. userMapper.deductBalanceByIds(200, wrapper);
  8. }

 然后在UserMapper中自定义SQL:

  1. package com.itheima.mp.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.itheima.mp.domain.po.User;
  4. import org.apache.ibatis.annotations.Param;
  5. import org.apache.ibatis.annotations.Update;
  6. import org.apache.ibatis.annotations.Param;
  7. public interface UserMapper extends BaseMapper<User> {
  8. @Select("UPDATE user SET balance = balance - #{money} ${ew.customSqlSegment}")
  9. void deductBalanceByIds(@Param("money") int money, @Param("ew") QueryWrapper<User> wrapper);
  10. }

这样就省去了编写复杂查询条件的烦恼了。

视频写法

  1. /**
  2. * 更新
  3. * CustomSqlUpdate:自定义更新SQL
  4. */
  5. @Test
  6. public void testCustomSqlUpdate(){
  7. //更新条件
  8. // 1.准备自定义查询条件
  9. List<Long> ids = List.of(1L, 2L, 4L);
  10. int amount = 200;
  11. // 定义条件
  12. QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);
  13. // 调用mapper的自定义方法,直接传递Wrapper
  14. //3.调用自定义SQL方法
  15. userMapper.updateBalanceByIds(wrapper,amount);
  16. }

  1. public interface UserMapper extends BaseMapper<User> {
  2. // void updateBalanceByIds(@Param("ew") QueryWrapper<User> wrapper,@Param("amount") int amount);
  3. /**
  4. * 更新
  5. * @param wrapper
  6. * @param amount
  7. */
  8. void updateBalanceByIds(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper,@Param("amount") int amount);
  9. }

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.itheima.mp.mapper.UserMapper">
  4. <update id="updateBalanceByIds">
  5. update tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
  6. </update>
  7. </mapper>

2.2.2.多表关联

理论上来讲MyBatisPlus是不支持多表查询的,不过我们可以利用Wrapper中自定义条件结合自定义SQL来实现多表查询的效果。 例如,我们要查询出所有收货地址在北京的并且用户id在1、2、4之中的用户 要是自己基于mybatis实现SQL,大概是这样的:

  1. <select id="queryUserByIdAndAddr" resultType="com.itheima.mp.domain.po.User">
  2. SELECT *
  3. FROM user u
  4. INNER JOIN address a ON u.id = a.user_id
  5. WHERE u.id
  6. <foreach collection="ids" separator="," item="id" open="IN (" close=")">
  7. #{id}
  8. </foreach>
  9. AND a.city = #{city}
  10. </select>

可以看出其中最复杂的就是WHERE条件的编写,如果业务复杂一些,这里的SQL会更变态。

但是基于自定义SQL结合Wrapper的玩法,我们就可以利用Wrapper来构建查询条件,然后手写SELECT及FROM部分,实现多表查询。

查询条件这样来构建:

  1. @Test
  2. void testCustomJoinWrapper() {
  3. // 1.准备自定义查询条件
  4. QueryWrapper<User> wrapper = new QueryWrapper<User>()
  5. .in("u.id", List.of(1L, 2L, 4L))
  6. .eq("a.city", "北京");
  7. // 2.调用mapper的自定义方法
  8. List<User> users = userMapper.queryUserByWrapper(wrapper);
  9. users.forEach(System.out::println);
  10. }

然后在UserMapper中自定义方法:

  1. @Select("SELECT u.* FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}")
  2. List<User> queryUserByWrapper(@Param("ew")QueryWrapper<User> wrapper);

当然,也可以在UserMapper.xml中写SQL:

  1. <select id="queryUserByIdAndAddr" resultType="com.itheima.mp.domain.po.User">
  2. SELECT * FROM user u INNER JOIN address a ON u.id = a.user_id ${ew.customSqlSegment}
  3. </select>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/877290
推荐阅读
相关标签
  

闽ICP备14008679号