本文目录
- 为什么国内流行mybatis,国外反而多用hibernate
- SpringBoot开发使用Mybatis还是Spring Data JPA
- 使用mybatisplus,如何定义service层和dao层
- SpringData JPA也能写sql,为什么还要用mybatis
- 如何优雅的使用mybatis
为什么国内流行mybatis,国外反而多用hibernate
主要是hibernate提倡以面向对象的方式操作数据库,SQL都是自动生成的,有些复杂的查询orm生成的SQL不会命中索引,导致查询性能不高。一切起源于杰克马提出的去ioe运动,根本原因是没钱就疯狂压榨程序员。
SpringBoot开发使用Mybatis还是Spring Data JPA
如果让我来说,我推荐你使用sqltoy-orm,增删改和对象加载简单查询jpa模式,查询则比mybatis强无数倍,更加直观简洁,另外具有缓存翻译大幅提升查询性能,还有很多人不敢想象的分页优化级别(很多仅仅优化了count处理就以为很强了,见了sqltoy的分页优化才属于见到了不可想象的事情)!
github上搜索sagacity-sqltoy!
https://github.com/sagframe/sagacity-sqltoy
gitee地址:
https://gitee.com/sagacity/sagacity-sqltoy
使用mybatisplus,如何定义service层和dao层
根据MyBatis-Plus的设计模式,那些接受条件Conditional或则和Wrapper的参数的方法,Conditional或者Wrapper对象本省就是参数!
你例子中:
userMapper.selectOne(new QueryWrapper《User》().eq(“user_age“, age));
这个Mapper方法算是DAO层的,它接受一个来自Service层传递的对象 QueryWrapper。你思维定势,认为userMapper.selectOne(new QueryWrapper《User》().eq(“user_age“, age)); 才是一个DAO方法整体,不是的!!
所以就算别的Servcie再调用这个
userMapper.selectOne(),你只需要定制创建的Wrapper对象就可以啦。
记住:方法入参就是入参,其他什么也不是。
SpringData JPA也能写sql,为什么还要用mybatis
头条上问这种问题也是醉了。。看到了顺便答一波,瞎扯的人太多。
国内的设计思路是table driven的,简单来说,用数据表定逻辑,用模型做实现,实际这是和面向对象相反的思路。mybatis所谓的灵活性在大多数工程师手里就是不用考虑模型如何设计,“反正我用原生sql都能解决”,模型设计的烂的一逼,全靠sql去修修补补。而jpa是完全object driven的思路,前期设计的缺陷会很制约后续开发,并且不同的数据库可做不同的实现(实际是哪怕是redis也是一样的)。回答几个常见sb问题。
1.jpa表连接行为不确定,难以控制。
你确定你用过spring data jpa?不知道有EntityGraph ?傻瓜到这种程度了还能咋的。
2.jpa子查询不好实现。
我估计你都没用过吧?spring data jpa的子查询既可以单独定义视图,也可以做subquery,甚至直接用jpql。
3.jpa不好优化。
我真不信99%得优化能超过spring data jpa的优化,尤其是一般般的程序员能别把优化放嘴上么,连mysql的锁都搞不清楚,表设计的跟坨屎一样还天天原生sql,觉得自己很牛逼么?jpa是可以把表属性反应到对象的,天然就有运行时优化的底子在,ORM能发展的空间太大了,稍微有点技术认知的都知道ORM会优势越来越大。稍微有些经历的程序员都知道现在是先说好维护才说其他的,能解决性能的方法太多了好么。
最后,难道不知道现在提倡ORM+CQRS么?请问,有啥复杂的解决不了,都不需要native sql介入好么。
如何优雅的使用mybatis
什么东西都是掌握熟了才讲究优雅,所以你第一步先把mybaits学会了,学熟了,当你对一个东西了解的很清楚时,你才会知道这个东西哪些地方不好用,哪些地方用起来麻烦,之后才知道怎么用才能优雅。
要想优雅的使用mybaits,那mybatis-plus就是首选了,mybatis-plus就是为了简化开发而生,对mybaits只做增强,不做改变,关于mybaits的配置在mybatis-plus中全都好用,只做简单配置,就可以快速进行CRUD,节省大量开发时间,热加载、代码生成、分页、性能分析等功能一应俱全。想优雅,就用mybatis-plus吧。