springboot使用mybatis plus总会涉及手写mapper,这么难用为啥还这么多人用?
作者:卡卷网发布时间:2025-01-18 19:01浏览数量:87次评论数量:0次
从CRUD工程师到工程师 - MyBatis Plus背后的辛酸史
作为一个从hibernate到mybatis,又到mybatis-plus的菜鸟,我也时常抱怨:为什么"难用"的技术反而大行其道。
先说大实话
没错!!MyBatis Plus确实没有Django ORM那么优雅:
# Django的写法,优雅如诗
User.objects.filter(age__gt=18).order_by('-create_time')
// MyBatis Plus的写法,像在写SQL
@Select("SELECT * FROM user WHERE age > #{age} ORDER BY create_time DESC")
List<User> getAdultUsers(@Param("age") Integer age);
为什么还是这么多人用?
Java生态从SSM框架一路发展而来,很多项目就是在老项目基础上迭代。这就像是一个有30年房龄的老小区,虽然新小区设施好,但搬家成本太高。
它对性能掌控还是很精准的
// 自定义SQL,性能自己说了算
@Select("SELECT id, name FROM user WHERE age > #{age} AND city = #{city}")
List<User> getUsers(Integer age, String city);
而Django ORM虽然方便,但有时候生成的SQL会让你怀疑人生:
SELECT ... FROM ... LEFT JOIN ... LEFT JOIN ...
-- 明明只想要两个字段,结果查了整张表
它有很多企业级特性
多数据源动态切换、分页插件全自动配置、乐观锁插件、多租户 这些在企业应用中常见的需求,MyBatis Plus都有现成的解决方案等等......很多情况下这些我们用不着。
SQL掌控度
在复杂业务场景下,有时候真的需要写原生SQL:
// 复杂统计场景
@Select("""
SELECT dept_id, COUNT(*) as count,
AVG(salary) as avg_salary
FROM employee e
LEFT JOIN department d ON e.dept_id = d.id
WHERE e.status = 1
GROUP BY dept_id
HAVING COUNT(*) > 10
""")
List<DeptStats> getDeptStats();
仔细想想的话吧,其实没那么难
MyBatis Plus已经帮我们做了很多:
// 增删改查都不用写了
public interface UserMapper extends BaseMapper<User> {
}
// 一行代码搞定复杂查询
userMapper.selectList(
new QueryWrapper<User>()
.gt("age", 18)
.like("name", "张")
.orderByDesc("create_time")
);
什么时候用什么?很简单——看复杂度
简单CRUD:直接用BaseMapper
// 不用写任何SQL
userMapper.insert(user);
userMapper.deleteById(1L);
中等复杂度:用QueryWrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "age") // 指定字段
.gt("age", 18)
.orderByDesc("create_time");
复杂查询:自定义SQL
@Select("你的复杂SQL")
List<DTO> getComplexData();
MyBatis Plus之所以流行,不是因为它最好用,而是因为它最适合企业级Java应用的实际需求。
如果觉得对你有帮助,点个赞吧!我是旷野,探索无尽技术!
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
相关推荐

你 发表评论:
欢迎