现在Dao持久层的解决方案中,大部分是采用Spring Data JPA或MyBatis解决方案,并且传统企业多用前者,互联网企业多用后者。

Spring Data JPA 是Spring Data 在JPA(Java持久层规范)和ORM(对象关系映射)框架之间抽象封装层,它不直接代替ORM框架,默认低层使用的ORM框架是Hibernate,但使用它可以灵活的在各种ORM框架之间切换,并且减少ORM框架接入部分重复代码,进而简化代码。

MyBatis是一个持久层框架的,但它设计初衷与Hibernate等全自动、符合JPA规范的ORM框架不同,重点关注关系到对象的(R——》O),而后者不仅是关系到对象的映射,还有对象到关系的映射(O——》R),设计上希望通过面向对象的方式写SQL,可以更好的屏蔽不同数据库之间的差异,抽象程度更高。而前者MyBatis需要自己手动写SQL,更灵活,但受限于开发编写SQL代码水平,可能会出现不兼容不同数据库SQL的情况。

网上也有观点认为ORM是一种反模式,认为从关系数据库到面向对象不完全是一一对应的,强行的要ORM反而会让一些设计变得很奇怪。

总的来说,Spring Data JPA和MyBatis都是很不错且被广泛使用的持久层解决方案,具体用那个可以看团队成员对技术栈熟悉程度以及项目是否对数据持久层方面有特殊需求。相对来说Spring Data JPA/Hibernate用好的话会简单些,不过复杂查询及结果集的返回没有直接用MyBatis灵活方便,可参考如下解决方案:

作者:beamofsoul
链接:https://www.zhihu.com/question/53706909/answer/200878397

使用Spring Data JPA + QueryDSL + Hibernate。
基本的增删改查和调用存储过程通过Spring Data JPA Repository来解决
稍微复杂的查询或是批量操作使用QueryDSL或Spring Data Specification的API来解决
特别特别复杂的查询操作可以使用Spring Data JPA Repository的注解定义native sql来解决
所有持久层底层操作都由Hibernate来支持,且为了保证效率和性能,不需要的包/特性就不需要引入,基本上使用core包就能够解决问题,当然如果有需要可以加上orm

全过程脱离任何格式(.java除外)的配置文件,都使用Java Config的方式进行配置,除了需要抽象出一套自己架构的持久层的API以外,只需要提供一个独立的空内容.java配置文件(如果不需要多数据源配置的话),在类上面配置RepositoryFactoryBean和Repository接口包路径

全使用过程中,除了native sql处以外,全部持久层操作都是类型安全的,特别是使用QueryDSL或Specification后...

从此,mybatis根本就没有存在的必要...

最新文章

  1. Jquery,jquery-cookie.js 做的点击记住用户名和密码!
  2. 让CPU的占有率曲线听我指挥
  3. vc-complex-type.2.3: Element 'filter-mapping' cannot have character [children], because the type's content type is element-only.
  4. (8) 深入理解Java Class文件格式(七)
  5. HTML---6 运算符,类型转换
  6. 用httpPost对JSON发送和接收的例子
  7. VC++2010配置使用MySQL5.6
  8. AndroidStudio旧模板使用方法
  9. mongodb的java客户端的设计思想
  10. d017: 打印某年某月有几天
  11. jQuery读取JSON总结
  12. SDN学习之实现环路通信
  13. 如何使用MFC连接Access数据库
  14. Mysql服务器SQL模式 (官方精译)
  15. css实现连续的图像边框
  16. 机器学习——kNN(2)示例:改进约会网站的配对效果
  17. java--抽象类实例(包含静态内部抽象类)
  18. 用user-selection实现让页面上的内容不能被选中
  19. 分类问题的几个评价指标(Precision、Recall、F1-Score、Micro-F1、Macro-F1
  20. python_flask项目(BBS)_01

热门文章

  1. codeforces #463
  2. 文件重定向,getline()获取一样,屏幕输出流,格式控制符dec,oct,hex,精度控制setprecision(int num),设置填充,cout.width和file(字符),进制输入
  3. [Binary Hacking] ABI and EABI
  4. HDU 2825 Wireless Password (AC自己主动机,DP)
  5. 推断dxf文件的版本号
  6. java开始到熟悉61
  7. PHP读取excel(5)
  8. 鼠标滚轮实现图片的缩放-------Day79
  9. POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
  10. 全志Android SDK编译详解(二)