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的示例:

java 复制代码
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;  
 import com.example.demo.entity.User;  
 import com.example.demo.mapper.UserMapper;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.stereotype.Service;  
 ​
 import java.util.List;  
 ​
 @Service  
 public class UserService {  
 @Autowired  
 private UserMapper userMapper;  
   
 public List<User> selectUsersByNameAndAge(String name, Integer age) {  
     QueryWrapper<User> queryWrapper = new QueryWrapper<>();  
     if (name != null) {  
         queryWrapper.eq("name", name);  
     }  
     if (age != null) {  
         queryWrapper.eq("age", age);  
     }  
     return userMapper.selectList(queryWrapper);  
 }  
   
 // 使用Lambda表达式的方式  
 public List<User> selectUsersByLambda(String name, Integer age) {  
     QueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();  
     if (name != null) {  
         lambdaQueryWrapper.eq(User::getName, name);  
     }  
     if (age != null) {  
         lambdaQueryWrapper.eq(User::getAge, age);  
     }  
     return userMapper.selectList(lambdaQueryWrapper);  
 }  
 }    

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

案例

(1)基于QueryWrapper的查询

java 复制代码
 @Test
 void testQueryWrapper() {
     //1.构造查询条件
     QueryWrapper<User> wrapper = new QueryWrapper<User>()
             .select("id", "username", "info", "balance")
             .like("username", "o")
             .ge("balance", 1000);
     //2.查询
     List<User> users = userMapper.selectList(wrapper);
     users.forEach(System.out::println);
 }
java 复制代码
 @Test
 void testUpdateByQueryWrapper() {
     //1.要更新的数据
     User user = new User();
     user.setBalance(2000);
     //2.更新的条件
     QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");
     //3.执行更新
     userMapper.update(user,wrapper);
 }

(2)基于UpdateWrapper的更新

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

(3)基于Lambda的格式

java 复制代码
 @Test
 void testLambdaQueryWrapper() {
     //1.构造查询条件
     LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda()
             .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

虽然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条件

java 复制代码
 @Test
 void testCustomSqlUpdate() {
     //1.更新条件
     List<Long> ids = List.of(1L,2L,4L);
     int amount = 200;
     //2.定义条件
     LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda()
                     .in(User::getId,ids);
     //3.调用自定义SQL方法
     userMapper.updateBalanceByIds(wrapper,amount);
 }

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

java 复制代码
 public interface UserMapper extends BaseMapper<User> {
     void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
 ​
 }

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

XML 复制代码
 <update id="updateBalanceByIds">
     update user
     set balance = balance - #{amount} ${ew.customSqlSegment}
 </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操作。例如:

java 复制代码
 @Service
 public interface UserService extends IService<User> {
 }

实现类

java 复制代码
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
 }

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

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

测试

java 复制代码
 @SpringBootTest
 public class IUserServiceTest {
     @Autowired
     private UserService userService;
     @Test
     void testSaveUser(){
         User user = new User();
         user.setId(6L);
         user.setUsername("Lucy");
         user.setPassword("123");
         user.setPhone("18688990011");
         user.setBalance(200);
         user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
         user.setCreateTime(LocalDateTime.now());
         user.setUpdateTime(LocalDateTime.now());
 ​
         userService.save(user);
     }
 ​
 }

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

相关推荐
落落落sss5 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
大鲤余35 分钟前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust
她说彩礼65万43 分钟前
Asp.NET Core Mvc中一个视图怎么设置多个强数据类型
后端·asp.net·mvc
陈随易1 小时前
农村程序员-关于小孩教育的思考
前端·后端·程序员
_江南一点雨1 小时前
SpringBoot 3.3.5 试用CRaC,启动速度提升3到10倍
java·spring boot·后端
酸奶代码1 小时前
Spring AOP技术
java·后端·spring
代码小鑫1 小时前
A034-基于Spring Boot的供应商管理系统的设计与实现
java·开发语言·spring boot·后端·spring·毕业设计
paopaokaka_luck2 小时前
基于Spring Boot+Vue的多媒体素材管理系统的设计与实现
java·数据库·vue.js·spring boot·后端·算法
莳光.2 小时前
122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
java·mybatis
程序猿麦小七2 小时前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区