• MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口


    在Java的Web开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多实用的功能,极大地简化了数据库操作的开发过程。下面,我们将详细探讨MyBatis-Plus的三大核心功能:条件构造器、自定义SQL以及Service接口。

    一、条件构造器

    条件构造器(Wrapper)是MyBatis-Plus中的一个重要功能,它使得我们能够以面向对象的方式构建SQL查询条件,而无需手动拼接SQL语句。这不仅提高了代码的可读性和可维护性,还降低了出错的可能性。

    MyBatis-Plus的条件构造器主要包括Wrapper、QueryWrapper和UpdateWrapper三个类。其中,Wrapper是一个抽象类,QueryWrapper和UpdateWrapper分别是它的两个实现类。QueryWrapper用于构建查询条件,而UpdateWrapper则用于构建更新条件。

    在QueryWrapper中,我们可以使用各种方法来添加查询条件,如eq(等于)、ne(不等于)、gt(大于)、lt(小于)等。这些方法都接受两个参数:字段名和字段值。通过这些方法,我们可以轻松地构建出各种复杂的查询条件。

    此外,QueryWrapper还支持使用lambda表达式来构建查询条件。这可以进一步简化代码,并提高代码的可读性。例如,我们可以使用lambda表达式来指定字段名,而无需手动拼写字段名的字符串。

    条件构造器(Wrapper)允许我们以面向对象的方式构建SQL查询条件。以下是一个使用QueryWrapper的示例:

    1. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    2. import com.example.demo.entity.User;
    3. import com.example.demo.mapper.UserMapper;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. import java.util.List;
    7. @Service
    8. public class UserService {
    9. @Autowired
    10. private UserMapper userMapper;
    11. public List selectUsersByNameAndAge(String name, Integer age) {
    12. QueryWrapper queryWrapper = new QueryWrapper<>();
    13. if (name != null) {
    14. queryWrapper.eq("name", name);
    15. }
    16. if (age != null) {
    17. queryWrapper.eq("age", age);
    18. }
    19. return userMapper.selectList(queryWrapper);
    20. }
    21. // 使用Lambda表达式的方式
    22. public List selectUsersByLambda(String name, Integer age) {
    23. QueryWrapper lambdaQueryWrapper = new QueryWrapper().lambda();
    24. if (name != null) {
    25. lambdaQueryWrapper.eq(User::getName, name);
    26. }
    27. if (age != null) {
    28. lambdaQueryWrapper.eq(User::getAge, age);
    29. }
    30. return userMapper.selectList(lambdaQueryWrapper);
    31. }
    32. }

    在上面的示例中,我们定义了一个UserService类,并在其中注入了UserMapper。selectUsersByNameAndAge方法使用传统的字段名字符串来构建查询条件,而selectUsersByLambda方法则使用Lambda表达式来指定字段,这种方式更加类型安全且易于阅读。

    案例

    (1)基于QueryWrapper的查询

    1. @Test
    2. void testQueryWrapper() {
    3. //1.构造查询条件
    4. QueryWrapper wrapper = new QueryWrapper()
    5. .select("id", "username", "info", "balance")
    6. .like("username", "o")
    7. .ge("balance", 1000);
    8. //2.查询
    9. List users = userMapper.selectList(wrapper);
    10. users.forEach(System.out::println);
    11. }

    1. @Test
    2. void testUpdateByQueryWrapper() {
    3. //1.要更新的数据
    4. User user = new User();
    5. user.setBalance(2000);
    6. //2.更新的条件
    7. QueryWrapper wrapper = new QueryWrapper().eq("username","jack");
    8. //3.执行更新
    9. userMapper.update(user,wrapper);
    10. }

    (2)基于UpdateWrapper的更新

    1. @Test
    2. void testUpdateWrapper() {
    3. List ids = List.of(1L,2L,4L);
    4. UpdateWrapper wrapper = new UpdateWrapper()
    5. .setSql("balance = blance - 200")
    6. .in("id",ids);
    7. userMapper.update(null,wrapper);
    8. }

    (3)基于Lambda的格式

    1. @Test
    2. void testLambdaQueryWrapper() {
    3. //1.构造查询条件
    4. LambdaQueryWrapper wrapper = new QueryWrapper().lambda()
    5. .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
    6. .like(User::getUsername, "o")
    7. .ge(User::getBalance, 1000);
    8. //2.查询
    9. List users = userMapper.selectList(wrapper);
    10. users.forEach(System.out::println);
    11. }

    二、自定义SQL

    虽然MyBatis-Plus提供了丰富的CRUD操作功能,但在某些特殊场景下,我们仍然需要编写自定义的SQL语句。MyBatis-Plus允许我们在Mapper接口中直接编写自定义的SQL语句,并通过注解或XML文件的方式指定。

    在Mapper接口中,我们可以使用MyBatis提供的注解来定义SQL语句,如@Select、@Insert、@Update和@Delete等。这些注解可以接受一个SQL语句作为参数,该SQL语句将被直接执行。通过这种方式,我们可以轻松地实现自定义的数据库操作。

    除了使用注解外,我们还可以使用XML文件来定义SQL语句。在XML文件中,我们可以编写完整的SQL语句,并通过命名空间(namespace)和ID来标识不同的SQL语句。然后,在Mapper接口中,我们可以使用@Mapper注解来指定XML文件的位置,并通过方法名来引用XML文件中的SQL语句。

    案例:

    自定义SQL

    ① 基于Wrapper构建Where条件

    1. @Test
    2. void testCustomSqlUpdate() {
    3. //1.更新条件
    4. List ids = List.of(1L,2L,4L);
    5. int amount = 200;
    6. //2.定义条件
    7. LambdaQueryWrapper wrapper = new QueryWrapper().lambda()
    8. .in(User::getId,ids);
    9. //3.调用自定义SQL方法
    10. userMapper.updateBalanceByIds(wrapper,amount);
    11. }

    ② 在mppper方法参数中用Param注解声明的wrapper变量名称,必须是ew

    1. public interface UserMapper extends BaseMapper {
    2. void updateBalanceByIds(@Param("ew") LambdaQueryWrapper wrapper, @Param("amount") int amount);
    3. }

    ③ 自定义SQL,并使用Wrapper条件

    1. <update id="updateBalanceByIds">
    2. update user
    3. set balance = balance - #{amount} ${ew.customSqlSegment}
    4. update>

    三、Service接口

    Service接口是MyBatis-Plus中用于封装业务逻辑的接口。在Service接口中,我们可以定义与业务相关的方法,并调用Mapper接口中的方法来执行数据库操作。通过Service接口,我们可以将业务逻辑与数据访问逻辑进行分离,使得代码更加清晰和易于维护。

    在MyBatis-Plus中,我们通常会创建一个与Mapper接口相对应的Service接口,并在Service接口中实现具体的业务逻辑。Service接口的实现类需要继承MyBatis-Plus提供的ServiceImpl类,并注入Mapper接口的实例。通过这种方式,我们可以轻松地访问Mapper接口中的方法,并执行相应的数据库操作。

    除了基本的CRUD操作外,Service接口还可以实现更加复杂的业务逻辑,如数据校验、事务控制等。这些业务逻辑可以在Service接口的实现类中进行编写和封装,以便于在其他地方进行调用和使用。

    IService是MyBatis-Plus提供的一个通用Service接口,它包含了基本的CRUD操作。例如:

    1. @Service
    2. public interface UserService extends IService {
    3. }

    实现类

    1. public class UserServiceImpl extends ServiceImpl implements UserService {
    2. }

    在上述代码中,IUserService接口继承了IService接口,表示它是一个通用的User业务处理接口。除了继承自IService的CRUD方法外,我们还可以根据业务需求在UserService接口中添加自定义的业务方法。

    IService接口的实现类(如UserServiceImpl)通常由MyBatis-Plus自动生成,我们只需要继承它并实现自定义的业务方法即可。

    测试

    1. @SpringBootTest
    2. public class IUserServiceTest {
    3. @Autowired
    4. private UserService userService;
    5. @Test
    6. void testSaveUser(){
    7. User user = new User();
    8. user.setId(6L);
    9. user.setUsername("Lucy");
    10. user.setPassword("123");
    11. user.setPhone("18688990011");
    12. user.setBalance(200);
    13. user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
    14. user.setCreateTime(LocalDateTime.now());
    15. user.setUpdateTime(LocalDateTime.now());
    16. userService.save(user);
    17. }
    18. }

    MyBatis-Plus作为MyBatis的增强工具,提供了丰富的核心功能,包括条件构造器、自定义SQL以及Service接口等。这些功能使得我们在进行Java持久层开发时更加高效和便捷。通过合理地使用这些功能,我们可以提高开发效率,减少错误率,并提升代码的可维护性和可扩展性。

  • 相关阅读:
    【李宏毅】深度学习-CNN(影像辨识为例)
    python爬虫+django新闻推荐系统可视化分析
    [typescript] 引入js说找不到模块或其相应的类型声明
    视频号爆款数据在哪里获取?
    纯js实现在线文字识别,从图片中提取文本信息
    回调地狱与Promise对象、以及async函数和await函数
    【每日一题】2300. 咒语和药水的成功对数
    值得学习的Linux内核锁(一)
    产品宣传制作电子宣传册十分可行!
    六零导航页SQL注入漏洞复现(CVE-2023-45951)
  • 原文地址:https://blog.csdn.net/moyustart/article/details/138538387