找回密码
 立即注册
查看: 182|回复: 0

SpringCloud微服务开发与实战之MybatisPlus自定义SQL

[复制链接]

156

主题

5

精华

160

金币

技术维护QQ:515138

积分
345
发表于 2025-12-8 15:23:58 | 显示全部楼层 |阅读模式
SpringCloud微服务开发与实战之mybatisplus自定义SQL
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
需求:将id在指定范围的用户(例如1、2、4 )的余额扣减指定值
实现步骤:
1.jpg
C层:
  1. package com.zidiu.mp;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  5. import com.zidiu.mp.domain.po.User;
  6. import com.zidiu.mp.mapper.UserMapper;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.junit.jupiter.api.Test;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.boot.test.context.SpringBootTest;
  11. import java.util.List;
  12. @Slf4j
  13. @SpringBootTest
  14. public class UserMapperTests {
  15.     @Autowired
  16.     private UserMapper userMapper;
  17.     @Test
  18.     public void testQueryWrapper() {
  19.         // 1,构建查询条件
  20.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  21.                 .select("id", "username", "info","balance")
  22.                 .like("username", "o")
  23.                 .ge("balance", 500);
  24.         // 2,执行查询
  25.         List<User> users = userMapper.selectList(wrapper);
  26.         log.info("users获取的用户信息为:{}", users);
  27. //        System.out.println(users);
  28.           users.forEach(System.out::println);
  29.     }
  30.     // lambda来解决查询条件
  31.     @Test
  32.     public void testLambdaQueryWrapper() {
  33.         LambdaQueryWrapper<User> aa = new LambdaQueryWrapper<User>()
  34.                 .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
  35.                 .like(User::getUsername, "o")
  36.                 .ge(User::getBalance, 500);
  37.         List<User> users = userMapper.selectList(aa);
  38.         log.info("users获取的用户信息:{}", users);
  39.         users.forEach(System.out::println);
  40.     }
  41.     @Test
  42.     public void testUpdateByWrapper() {
  43.         // 1,创建一个User对象
  44.         User user = new User();
  45.         user.setBalance(2000);
  46.         // 2,更新条件
  47.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  48.                 .eq("username", "Jack");
  49.         // 3,执行更新
  50.         userMapper.update(user,wrapper);
  51.     }
  52.     @Test
  53.     void testUpdateWrapper(){
  54.         List<Long> ids = List.of(1L,2L,4L);
  55.         UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<User>()
  56.                 .setSql("balance = balance - 50")
  57.                 .in("id", ids);
  58.         userMapper.update(null, userUpdateWrapper);
  59.     }
  60.     @Test
  61.     void testCustomSqlUpdate(){
  62.         // 1.更新条件
  63.         List<Long> ids = List.of(1L,2L,4L);
  64.         int amount = 50;
  65.         // 2.定义条件
  66.         UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<User>()
  67.                 .in("id", ids);
  68.         userMapper.updateBalanceByIds(userUpdateWrapper, amount);
  69.     }
  70. }
复制代码
M层:
  1. package com.zidiu.mp.mapper;
  2. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.zidiu.mp.domain.po.User;
  5. import org.apache.ibatis.annotations.Mapper;
  6. import org.apache.ibatis.annotations.Param;
  7. import java.util.List;
  8. @Mapper
  9. public interface UserMapper extends BaseMapper<User> {
  10.     void saveUser(User user);
  11.     void deleteUser(Long id);
  12.     void updateUser(User user);
  13.     User queryUserById(@Param("id") Long id);
  14.     List<User> queryUserByIds(@Param("ids") List<Long> ids);
  15.     void updateBalanceByIds(@Param("ew") UpdateWrapper<User> userUpdateWrapper,@Param("amount") int amount);
  16. }
复制代码
XML层:
  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.zidiu.mp.mapper.UserMapper">
  4.     <insert id="saveUser" parameterType="com.zidiu.mp.domain.po.User">
  5.         INSERT INTO `user` (`id`, `username`, `password`, `phone`, `info`, `balance`)
  6.         VALUES
  7.         (#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});
  8.     </insert>
  9.     <update id="updateUser" parameterType="com.zidiu.mp.domain.po.User">
  10.         UPDATE `user`
  11.         <set>
  12.             <if test="username != null">
  13.                 `username`=#{username}
  14.             </if>
  15.             <if test="password != null">
  16.                 `password`=#{password}
  17.             </if>
  18.             <if test="phone != null">
  19.                 `phone`=#{phone}
  20.             </if>
  21.             <if test="info != null">
  22.                 `info`=#{info}
  23.             </if>
  24.             <if test="status != null">
  25.                 `status`=#{status}
  26.             </if>
  27.             <if test="balance != null">
  28.                 `balance`=#{balance}
  29.             </if>
  30.         </set>
  31.         WHERE `id`=#{id};
  32.     </update>
  33.     <update id="updateBalanceByIds">
  34.         UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}
  35.     </update>
  36.     <delete id="deleteUser" parameterType="com.zidiu.mp.domain.po.User">
  37.         DELETE FROM user WHERE id = #{id}
  38.     </delete>
  39.     <select id="queryUserById" resultType="com.zidiu.mp.domain.po.User">
  40.         SELECT *
  41.         FROM user
  42.         WHERE id = #{id}
  43.     </select>
  44.     <select id="queryUserByIds" resultType="com.zidiu.mp.domain.po.User">
  45.         SELECT *
  46.         FROM user
  47.         <if test="ids != null">
  48.             WHERE id IN
  49.             <foreach collection="ids" open="(" close=")" item="id" separator=",">
  50.                 #{id}
  51.             </foreach>
  52.         </if>
  53.         LIMIT 10
  54.     </select>
  55. </mapper>
复制代码

源码+数据库打包:
mp-demo.zip (46.59 KB, 下载次数: 0, 售价: 50 金币)

SpringCloud微服务开发与实战

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

1.jpg
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. package com.itheima.mp;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  5. import com.itheima.mp.domain.po.User;
  6. import com.itheima.mp.mapper.UserMapper;
  7. import org.junit.jupiter.api.Test;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import java.time.LocalDateTime;
  11. import java.util.List;
  12. @SpringBootTest
  13. class MpDemoApplicationTests {
  14.     @Autowired
  15.     private UserMapper userMapper;
  16.     @Test
  17.     void testInsert() {
  18.         User user = new User();
  19.         user.setId(5L);
  20.         user.setUsername("Lucya");
  21.         user.setPassword("123");
  22.         user.setPhone("18688990011");
  23.         user.setBalance(200);
  24.         user.setInfo("{"age": 24, "intro": "英文老师", "gender": "female"}");
  25.         user.setCreateTime(LocalDateTime.now());
  26.         user.setUpdateTime(LocalDateTime.now());
  27.         userMapper.insert(user);
  28.     }
  29.     @Test
  30.     void testSelectById() {
  31.         User user = userMapper.selectById(5L);
  32.         System.out.println("user = " + user);
  33.     }
  34.     @Test
  35.     void testSelectByIds() {
  36.         List<User> users = userMapper.selectByIds(List.of(1L, 2L, 3L, 4L, 5L));
  37.         users.forEach(System.out::println);
  38.     }
  39.     @Test
  40.     void testUpdateById() {
  41.         User user = new User();
  42.         user.setId(5L);
  43.         user.setBalance(20000);
  44.         userMapper.updateById(user);
  45.     }
  46.     @Test
  47.     void testDelete() {
  48.         userMapper.deleteById(5L);
  49.     }
  50.     // 查询:查询出名字中带o的,存款大于等于1000元的人。代码如下:
  51.     @Test
  52.     void testQueryWrapper() {
  53.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  54.                 .select("id", "username", "info", "balance")
  55.                 .like("username", "o")
  56.                 .ge("balance", 1000);
  57.         List<User> users = userMapper.selectList(wrapper);
  58.         users.forEach(System.out::println);
  59.     }
  60.     // 更新用户名为jack的用户的余额为2000
  61.     @Test
  62.     void testUpdateByQueryWrapper() {
  63.         // 1.构建查询条件 where name = "Jack"
  64.         QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "Jack");
  65.         // 2.更新数据,user中非null字段都会作为set语句
  66.         User user = new User();
  67.         user.setBalance(2000);
  68.         userMapper.update(user, wrapper);
  69.     }
  70.     // 更新id为1,2,4的用户的余额,扣200
  71.     @Test
  72.     void testUpdateWrapper() {
  73.         List<Long> ids = List.of(1L, 2L, 4L);
  74.         // 1.生成SQL
  75.         UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
  76.                 .setSql("balance = balance - 200")// SET balance = balance - 200
  77.                 .in("id", ids); // WHERE id in (1, 2, 4)
  78.         // 2.更新,注意第一个参数可以给null,也就是不填更新字段和数据,
  79.         // 而是基于UpdateWrapper中的setSQL来更新
  80.         userMapper.update(null, wrapper);
  81.     }
  82.     // LambdaQueryWrapper方式
  83.     @Test
  84.     void testLambdaQueryWrapper() {
  85.         // 1.构建条件 WHERE username LIKE "%o%" AND balance >= 1000
  86.         LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
  87.                 .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
  88.                 .like(User::getUsername, "o")
  89.                 .ge(User::getBalance, 1000);
  90.         // 2.查询
  91.         List<User> users = userMapper.selectList(wrapper);
  92.         users.forEach(System.out::println);
  93.     }
  94.     // 自定义sql
  95.     @Test
  96.     void testCustomWrapper() {
  97.         // 1.准备自定义查询条件
  98.         List<Long> ids = List.of(1L, 2L, 4L);
  99.         int balance = 200;
  100.         LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
  101.         // 2.调用mapper的自定义方法,直接传递Wrapper
  102.         userMapper.deductBalanceByIds(wrapper,balance);
  103.     }
  104. }
复制代码
  1. package com.itheima.mp.mapper;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5. import com.itheima.mp.domain.po.User;
  6. import org.apache.ibatis.annotations.Mapper;
  7. import org.apache.ibatis.annotations.Param;
  8. import java.util.List;
  9. @Mapper
  10. public interface UserMapper extends BaseMapper<User> {
  11.     void saveUser(User user);
  12.     void deleteUser(Long id);
  13.     void updateUser(User user);
  14.     User queryUserById(@Param("id") Long id);
  15.     List<User> queryUserByIds(@Param("ids") List<Long> ids);
  16.     void deductBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("balance") int balance);
  17. }
复制代码
  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.     <insert id="saveUser" parameterType="com.itheima.mp.domain.po.User">
  5.         INSERT INTO `user` (`id`, `username`, `password`, `phone`, `info`, `balance`)
  6.         VALUES
  7.         (#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});
  8.     </insert>
  9.     <update id="updateUser" parameterType="com.itheima.mp.domain.po.User">
  10.         UPDATE `user`
  11.         <set>
  12.             <if test="username != null">
  13.                 `username`=#{username}
  14.             </if>
  15.             <if test="password != null">
  16.                 `password`=#{password}
  17.             </if>
  18.             <if test="phone != null">
  19.                 `phone`=#{phone}
  20.             </if>
  21.             <if test="info != null">
  22.                 `info`=#{info}
  23.             </if>
  24.             <if test="status != null">
  25.                 `status`=#{status}
  26.             </if>
  27.             <if test="balance != null">
  28.                 `balance`=#{balance}
  29.             </if>
  30.         </set>
  31.         WHERE `id`=#{id};
  32.     </update>
  33.     <update id="deductBalanceByIds">
  34.             UPDATE user
  35.             SET balance = balance - #{balance} ${ew.customSqlSegment}
  36.     </update>
  37.     <delete id="deleteUser" parameterType="com.itheima.mp.domain.po.User">
  38.         DELETE FROM user WHERE id = #{id}
  39.     </delete>
  40.     <select id="queryUserById" resultType="com.itheima.mp.domain.po.User">
  41.         SELECT *
  42.         FROM user
  43.         WHERE id = #{id}
  44.     </select>
  45.     <select id="queryUserByIds" resultType="com.itheima.mp.domain.po.User">
  46.         SELECT *
  47.         FROM user
  48.         <if test="ids != null">
  49.             WHERE id IN
  50.             <foreach collection="ids" open="(" close=")" item="id" separator=",">
  51.                 #{id}
  52.             </foreach>
  53.         </if>
  54.         LIMIT 10
  55.     </select>
  56. </mapper>
复制代码



上一篇:SpringCloud微服务开发与实战之条件构造器wrapper
下一篇:SpringCloud微服务开发与实战之Service接口
网站建设,公众号小程序开发,系统定制,软件App开发,技术维护【联系我们】手机/微信:17817817816 QQ:515138

QQ|Archiver|自丢网 ( 粤ICP备2024252464号-1 )

GMT+8, 2026-1-19 13:16

专注于网站建设,公众号小程序制作,商城小程序,系统定制,软件App开发

【联系我们】手机/微信:17817817816 QQ:515138

快速回复 返回顶部 返回列表