当前使用版本(必填,否则不予处理)
mybatis-plus-boot-starter: 3.4.3.4
演示用的版本
该问题是如何引起的?(确定最新版也有问题再提!!!)
项目中Service层存在大量且散落在各处的Wrapper条件查询,影响代码可读性的同时使Service层和Mapper层的界限变得模糊不清,所以打算对代码进行整理或重构。
整理过程中发现使用JDK 8的接口默认方法可以将Wrapper条件代码下沉到Mapper层,保证Service层只需面向接口即可。
目前程序可正常运行,查询返回结果正确。但考虑到在MyBatis-Plus文档和他人的博客中基本没有介绍过这种写法。因此,想咨询一下使用默认方法来自定义Mapper方法是否合理?是否某些功能可能会出现类似于Spring注解事务中类内部调用事务方法不生效的情况?
重现步骤(如果有就写完整)
此处采用了官网文档快速开始的演示数据
UserMapper.java
public interface UserMapper extends BaseMapper<User> {
/**
* 查询年龄大于20的用户
*/
default List<User> selectUserByAgeGreaterThanTwenty() {
final int ageThreshold = 20;
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge, ageThreshold);
return selectList(wrapper);
}
}
UserService.java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> findUserByAgeGreaterThanTwenty() {
return userMapper.selectUserByAgeGreaterThanTwenty();
}
}
测试用例
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testSelectHasMailUser() {
List<User> users = userService.findUserByAgeGreaterThanTwenty();
Assertions.assertTrue(CollectionUtils.isNotEmpty(users));
for (User user : users) {
System.out.println(user);
}
}
}
用例执行通过,打印结果为:
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)