MybatisPlus 核心功能

MybatisPlus 核心功能

1. 条件构造器

当涉及到查询或修改语句时,MybatisPlus需要使用条件构造器来进行条件判断,它提供了以下条件构造器:

在这里插入图片描述

  • QueryWrapperLambdaQueryWrapper:用来构建select、delete、update的where条件部分
  • UpdateWrapperLambdaUpdateWrapper:通常只有在set语句比较特殊的时候才使用

1.1 QueryWrapper

QueryWrapper下有许多方法可以使用,用来充当指定where条件部分:

  • select:指定需要查询的字段
  • eq:和指定内容相等的数据
  • like:进行模糊查询
  • ge:比指定数大的数据
  • le:比指定数小的数据

代码示例

①查询出名字中带o的,存款小于等于1000元的人的id、username、info、balance字段:

@Test
void testQueryWrapper() {
    // 1. 构建查询条件
    QueryWrapper<User> wrapper = new QueryWrapper<User>()
            .select("id", "username", "info", "balance")
            .like("username", "o")
            .le("balance", 1000);
    // 2. 查询
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

②更新用户名为jack的用户的余额为2500:

@Test
void testUpdateByQueryWrapper1() {
    // 1. 要更新的数据
    User user = new User();
    user.setBalance(2500);
    // 2. 更新的条件
    QueryWrapper<User> wrapper = new QueryWrapper<User>()
            .eq("username", "jack");
    // 3. 更新数据
    userMapper.update(user, wrapper);
}

在这里插入图片描述

③删除名为Thomas的数据:

@Test
void testDeleteByQueryWrapper() {

    // 1. 删除的条件
    QueryWrapper<User> wrapper = new QueryWrapper<User>()
            .eq("username", "Thomas");
    // 2. 删除数据
    userMapper.delete(wrapper);
}

在这里插入图片描述

1.2 LambdaQueryWrapper(推荐)

LambdaQueryWrapper的具体作用与QueryWrapper一样,用来构建select、delete、update的where条件部分,但它与QueryWrapper的不同在于,LambdaQueryWrapper更能防止硬编码,因此更推荐使用LambdaQueryWrapper

LambdaQueryWrapper在操作上和的不同点便是使用了类名::方法的方式来填充数据,而不是将查询条件“写死”。

代码示例

①查询出名字中带o的,存款小于等于1000元的人的id、username、info、balance字段:

@Test
void testLambdaQueryWrapper() {
    // 1.构建查询条件
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
            .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
            .like(User::getUsername, "o")
            .le(User::getBalance, 1000);
    // 2.查询
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

②更新用户名为jack的用户的余额为5000:

@Test
void testUpdateByLambdaQueryWrapper() {
    // 1. 要更新的数据
    User user = new User();
    user.setBalance(5000);
    // 2. 更新的条件
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
            .eq(User::getUsername, "XiaoMi");
    // 3.更新数据
    userMapper.update(user, wrapper);
}

相较于QueryWrapper更推荐使用LambdaQueryWrapper来作为条件构造器!!

1.3 UpdateWrapper

set语句比较特殊时可以使用UpdateWrapper来进行条件构造,如加减数据:

代码示例

更新id为1,2,4的用户的余额,扣200:

@Test
void testUpdateWrapper1() {
    List<Long> ids = List.of(1L, 2L,4L);
    UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
            .setSql("balance = balance - 200")
            .in("id", ids);
    userMapper.update(null, wrapper);
}

在这里插入图片描述

1.4 LambdaUpdateWrapper

使用方式与UpdateWrapper基本相同,只是将指定字段修改为可变字段:

代码示例

更新id为1,2,4的用户的余额,扣200:

@Test
void testLambdaUpdateWrapper() {
    List<Long> ids = List.of(1L, 2L,4L);
    LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<User>()
            .setSql("balance = balance - 200")
            .in(User::getId, ids); // 这里与`UpdateWrapper`不同
    userMapper.update(null, wrapper);
}

在这里插入图片描述

2. 自定义SQL

MyBatisPlus中,当我们需要使用复杂的sql语句进行操作时,往往是通过自定义SQL+条件构造器的方式来解决问题的!即通过条件构造器来构建复杂的Where的条件,剩余部分则通过自定义sql解决:

代码示例

更新id为1,2,3的用户的余额,扣指定金额:

  1. 基于Wrapper构建Where条件

    @Test
    void testCustomSqlUpdate1() {
        // 1. 更新条件
        List<Long> ids = List.of(1L, 2L, 3L);
        int amount = 200;
        // 2. 定义条件
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                .in(User::getId, ids);
        // 3. 调用自定义SQL方法
        userMapper.updateBalanceByLBIds(wrapper, amount);
    }
    
  2. 在Mapper方法参数中通过Param注解声明wrapper变量名称, 必须写ew

    public interface UserMapper extends BaseMapper<User> {
        void updateBalanceByLBIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
    }
    
  3. 编写自定义sql,并使用Wrapper充当条件

    <update id="updateBalanceByLBIds">
        update tb_user set balance = balance - #{amount} ${ew.customSqlSegment}
    </update>
    

    在这里插入图片描述

3. Service接口

MybatisPlus除了给我们提供快速实现CURD的功能外,也为我们提供了可直接使用的Service接口:

在这里插入图片描述

IService接口为我们提供了一系列可以封装好的接口,而我们需要做的就是继承然后使用它:

在这里插入图片描述

使用流程

  1. 自定义Service接口并继承IService接口

    public interface MUserService extends IService<User> {
        // 注意需要给上述泛型提供实体类
    }
    
  2. 自定义Service实现类,实现自定义接口并继承ServiceImpl接口

    @Service
    public class MUserServiceImpl extends ServiceImpl<UserMapper, User> implements MUserService {
        // 注意需要给上述泛型提供Mapper接口和实体类
    }
    

测试一下

@SpringBootTest
class MUserServiceImplTest {

    @Autowired
    private MUserService mUserService;

    @Test
    void testQuery() {
        List<User> users = mUserService.listByIds(List.of(1L,2L,3L));
        users.forEach(System.out::println);
    }

    @Test
    void testInsert() {
        User user = new User();
        user.setUsername("XiaoTian");
        user.setPassword("11111");
        user.setPhone("10085");
        user.setBalance(200);
        user.setInfo(UserInfo.of(25, "体育老师", "man"));
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());

        mUserService.save(user);
    }

}

在这里插入图片描述

在这里插入图片描述以上便是MybatisPlus提供的一些核心功能了!!

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值