SpringCloud微服务开发与实战之mybatisplus自定义SQL
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
需求:将id在指定范围的用户(例如1、2、4 )的余额扣减指定值
实现步骤:
C层:
- package com.zidiu.mp;
-
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
- import com.zidiu.mp.domain.po.User;
- import com.zidiu.mp.mapper.UserMapper;
- import lombok.extern.slf4j.Slf4j;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
-
- import java.util.List;
- @Slf4j
- @SpringBootTest
- public class UserMapperTests {
- @Autowired
- private UserMapper userMapper;
- @Test
- public void testQueryWrapper() {
- // 1,构建查询条件
- QueryWrapper<User> wrapper = new QueryWrapper<User>()
- .select("id", "username", "info","balance")
- .like("username", "o")
- .ge("balance", 500);
- // 2,执行查询
- List<User> users = userMapper.selectList(wrapper);
- log.info("users获取的用户信息为:{}", users);
- // System.out.println(users);
- users.forEach(System.out::println);
- }
-
- // lambda来解决查询条件
- @Test
- public void testLambdaQueryWrapper() {
- LambdaQueryWrapper<User> aa = new LambdaQueryWrapper<User>()
- .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
- .like(User::getUsername, "o")
- .ge(User::getBalance, 500);
- List<User> users = userMapper.selectList(aa);
- log.info("users获取的用户信息:{}", users);
- users.forEach(System.out::println);
- }
- @Test
- public void testUpdateByWrapper() {
- // 1,创建一个User对象
- User user = new User();
- user.setBalance(2000);
- // 2,更新条件
- QueryWrapper<User> wrapper = new QueryWrapper<User>()
- .eq("username", "Jack");
- // 3,执行更新
- userMapper.update(user,wrapper);
- }
- @Test
- void testUpdateWrapper(){
- List<Long> ids = List.of(1L,2L,4L);
- UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<User>()
- .setSql("balance = balance - 50")
- .in("id", ids);
- userMapper.update(null, userUpdateWrapper);
- }
-
- @Test
- void testCustomSqlUpdate(){
- // 1.更新条件
- List<Long> ids = List.of(1L,2L,4L);
- int amount = 50;
- // 2.定义条件
- UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<User>()
- .in("id", ids);
- userMapper.updateBalanceByIds(userUpdateWrapper, amount);
- }
- }
复制代码 M层:
- package com.zidiu.mp.mapper;
-
- import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.zidiu.mp.domain.po.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
-
- import java.util.List;
- @Mapper
- public interface UserMapper extends BaseMapper<User> {
-
- void saveUser(User user);
-
- void deleteUser(Long id);
-
- void updateUser(User user);
-
- User queryUserById(@Param("id") Long id);
-
- List<User> queryUserByIds(@Param("ids") List<Long> ids);
-
- void updateBalanceByIds(@Param("ew") UpdateWrapper<User> userUpdateWrapper,@Param("amount") int amount);
- }
复制代码 XML层:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.zidiu.mp.mapper.UserMapper">
- <insert id="saveUser" parameterType="com.zidiu.mp.domain.po.User">
- INSERT INTO `user` (`id`, `username`, `password`, `phone`, `info`, `balance`)
- VALUES
- (#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});
- </insert>
- <update id="updateUser" parameterType="com.zidiu.mp.domain.po.User">
- UPDATE `user`
- <set>
- <if test="username != null">
- `username`=#{username}
- </if>
- <if test="password != null">
- `password`=#{password}
- </if>
- <if test="phone != null">
- `phone`=#{phone}
- </if>
- <if test="info != null">
- `info`=#{info}
- </if>
- <if test="status != null">
- `status`=#{status}
- </if>
- <if test="balance != null">
- `balance`=#{balance}
- </if>
- </set>
- WHERE `id`=#{id};
- </update>
- <update id="updateBalanceByIds">
- UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}
- </update>
- <delete id="deleteUser" parameterType="com.zidiu.mp.domain.po.User">
- DELETE FROM user WHERE id = #{id}
- </delete>
-
- <select id="queryUserById" resultType="com.zidiu.mp.domain.po.User">
- SELECT *
- FROM user
- WHERE id = #{id}
- </select>
-
- <select id="queryUserByIds" resultType="com.zidiu.mp.domain.po.User">
- SELECT *
- FROM user
- <if test="ids != null">
- WHERE id IN
- <foreach collection="ids" open="(" close=")" item="id" separator=",">
- #{id}
- </foreach>
- </if>
- LIMIT 10
- </select>
-
- </mapper>
复制代码
源码+数据库打包:
mp-demo.zip
(46.59 KB, 下载次数: 0, 售价: 50 金币)
SpringCloud微服务开发与实战
在演示UpdateWrapper的案例中,我们在代码中编写了更新的SQL语句:
2.2.1.基本用法
- @Test
- void testCustomWrapper() {
- // 1.准备自定义查询条件
- List<Long> ids = List.of(1L, 2L, 4L);
- QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);
-
- // 2.调用mapper的自定义方法,直接传递Wrapper
- userMapper.deductBalanceByIds(200, wrapper);
- }
复制代码 然后在UserMapper中自定义SQL:
- package com.itheima.mp.mapper;
-
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.itheima.mp.domain.po.User;
- import org.apache.ibatis.annotations.Param;
- import org.apache.ibatis.annotations.Update;
- import org.apache.ibatis.annotations.Param;
-
- 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);
- }
复制代码
完整案例:
- package com.itheima.mp;
-
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
- import com.itheima.mp.domain.po.User;
- import com.itheima.mp.mapper.UserMapper;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
-
- import java.time.LocalDateTime;
- import java.util.List;
-
- @SpringBootTest
- class MpDemoApplicationTests {
-
- @Autowired
- private UserMapper userMapper;
-
- @Test
- void testInsert() {
- User user = new User();
- user.setId(5L);
- user.setUsername("Lucya");
- user.setPassword("123");
- user.setPhone("18688990011");
- user.setBalance(200);
- user.setInfo("{"age": 24, "intro": "英文老师", "gender": "female"}");
- user.setCreateTime(LocalDateTime.now());
- user.setUpdateTime(LocalDateTime.now());
- userMapper.insert(user);
- }
-
- @Test
- void testSelectById() {
- User user = userMapper.selectById(5L);
- System.out.println("user = " + user);
- }
-
- @Test
- void testSelectByIds() {
- List<User> users = userMapper.selectByIds(List.of(1L, 2L, 3L, 4L, 5L));
- users.forEach(System.out::println);
- }
-
- @Test
- void testUpdateById() {
- User user = new User();
- user.setId(5L);
- user.setBalance(20000);
- userMapper.updateById(user);
- }
-
- @Test
- void testDelete() {
- userMapper.deleteById(5L);
- }
- // 查询:查询出名字中带o的,存款大于等于1000元的人。代码如下:
- @Test
- void testQueryWrapper() {
- QueryWrapper<User> wrapper = new QueryWrapper<User>()
- .select("id", "username", "info", "balance")
- .like("username", "o")
- .ge("balance", 1000);
- List<User> users = userMapper.selectList(wrapper);
- users.forEach(System.out::println);
- }
- // 更新用户名为jack的用户的余额为2000
- @Test
- void testUpdateByQueryWrapper() {
- // 1.构建查询条件 where name = "Jack"
- QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "Jack");
- // 2.更新数据,user中非null字段都会作为set语句
- User user = new User();
- user.setBalance(2000);
- userMapper.update(user, wrapper);
- }
-
- // 更新id为1,2,4的用户的余额,扣200
- @Test
- void testUpdateWrapper() {
- List<Long> ids = List.of(1L, 2L, 4L);
- // 1.生成SQL
- UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
- .setSql("balance = balance - 200")// SET balance = balance - 200
- .in("id", ids); // WHERE id in (1, 2, 4)
- // 2.更新,注意第一个参数可以给null,也就是不填更新字段和数据,
- // 而是基于UpdateWrapper中的setSQL来更新
- userMapper.update(null, wrapper);
- }
-
- // LambdaQueryWrapper方式
- @Test
- void testLambdaQueryWrapper() {
- // 1.构建条件 WHERE username LIKE "%o%" AND balance >= 1000
- LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
- .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
- .like(User::getUsername, "o")
- .ge(User::getBalance, 1000);
- // 2.查询
- List<User> users = userMapper.selectList(wrapper);
- users.forEach(System.out::println);
- }
- // 自定义sql
- @Test
- void testCustomWrapper() {
- // 1.准备自定义查询条件
- List<Long> ids = List.of(1L, 2L, 4L);
- int balance = 200;
- LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
- // 2.调用mapper的自定义方法,直接传递Wrapper
- userMapper.deductBalanceByIds(wrapper,balance);
- }
- }
复制代码
- package com.itheima.mp.mapper;
-
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.itheima.mp.domain.po.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
-
- import java.util.List;
- @Mapper
- public interface UserMapper extends BaseMapper<User> {
-
- void saveUser(User user);
-
- void deleteUser(Long id);
-
- void updateUser(User user);
-
- User queryUserById(@Param("id") Long id);
-
- List<User> queryUserByIds(@Param("ids") List<Long> ids);
-
- void deductBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("balance") int balance);
- }
复制代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.itheima.mp.mapper.UserMapper">
- <insert id="saveUser" parameterType="com.itheima.mp.domain.po.User">
- INSERT INTO `user` (`id`, `username`, `password`, `phone`, `info`, `balance`)
- VALUES
- (#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});
- </insert>
- <update id="updateUser" parameterType="com.itheima.mp.domain.po.User">
- UPDATE `user`
- <set>
- <if test="username != null">
- `username`=#{username}
- </if>
- <if test="password != null">
- `password`=#{password}
- </if>
- <if test="phone != null">
- `phone`=#{phone}
- </if>
- <if test="info != null">
- `info`=#{info}
- </if>
- <if test="status != null">
- `status`=#{status}
- </if>
- <if test="balance != null">
- `balance`=#{balance}
- </if>
- </set>
- WHERE `id`=#{id};
- </update>
- <update id="deductBalanceByIds">
- UPDATE user
- SET balance = balance - #{balance} ${ew.customSqlSegment}
- </update>
- <delete id="deleteUser" parameterType="com.itheima.mp.domain.po.User">
- DELETE FROM user WHERE id = #{id}
- </delete>
-
- <select id="queryUserById" resultType="com.itheima.mp.domain.po.User">
- SELECT *
- FROM user
- WHERE id = #{id}
- </select>
-
- <select id="queryUserByIds" resultType="com.itheima.mp.domain.po.User">
- SELECT *
- FROM user
- <if test="ids != null">
- WHERE id IN
- <foreach collection="ids" open="(" close=")" item="id" separator=",">
- #{id}
- </foreach>
- </if>
- LIMIT 10
- </select>
-
- </mapper>
复制代码
|