本文是原创持续连载发布,这篇主要讲解Spring boot整合Spring Data JPA和mybatis-spring-boot-starter框架进行简单尝试使用,后面配置多数据源和使用Druid连接池。如文中有书写或部署问题,请留言指导修正,互相交流,共同进步,本人QQ:417213902。
1、Spring Data JPA理解
从开发以来,本人经历使用从最原始的JDBC,到后来的JDBCtemplate,再者就是ORM(如hibernate等),最后到现在的Spring Data JPA,以上经历不是说本人工作年限很长,只是说使用技术比较落后。对于了解Spring Data 的小伙伴来说,这个技术可能并不是什么新鲜事了,因为它早在2010年就已经诞生了,再者JPA规范,更是早些年就有被定义了。JPA全称是Java Persisterence API ,中文名Java持久层API,是描述对象-关系表的映射并将运行期的实体[对象持久化。而Spring Data就是把各种orm框架的实现都隐藏掉,把查询规则和查询接口统一起来,就是行为即实现,由接口去定义数据库的查询实现,而你更不需要关注你使用的是哪个orm框架,因为查询模型(使用统一接口)和返回模型都是统一的,而orm查询封装这些spring-data通通帮你处理了,这样做的好处就是当你在实体类中新增或修改属性值时,基本不需要动Dao代码。当然以上操作对于简单的单表查询的确已经实现的非常完善,基本不需要写任何SQL,但是据了解因为JPA是一种面向对象的设计理念,所以这对数据库的设计就要相当高的要求,特别是在多表级联查询,表与表之间的主键、外键关系都需要很好的设计,这样在处理一对一、一对多及多对多的情况下能够好的兼容,这个框架本身也提供对于分页、排序等支持。再者网上对于复杂的SQL也有很好的解决方案,采用Spring Data JPA + QueryDSL框架,我尝试着去测试了下,感觉还是不那么方便,比如在增加条件查询的时候需要定义Predicate 等一些对象,其实就是能让程序根据业务自动生成符合条件的SQL。其实Spring Data JPA也是支持使用SQL的方式实现@query,这里JPA最重要一种实现方式,就是根据接口的命名规范代理类JPARepository自动生成想要的SQL,博客后文会给出github源码。
一般可按照以下三类情况使用Spring Data JPA
- 基本的增删改查和调用存储过程通过Spring Data JPA Repository来解决
- 稍微复杂的查询或是批量操作使用QueryDSL或Spring Data Specification的API来解决
- 特别特别复杂的查询操作可以使用Spring Data JPA Repository的注解定义native sql来解决
Spring Data JPA 支持的方式
- 采用直接调用默认的接口方法
- 采用规范的命名规则
- @Query注解
- 使用QueryDSL插件解决复杂SQL
2、mybatis-spring-boot-starter理解
mybatis对于现在的开发者来说,应该并不是一个默认的框架的,基本上现在市面上大部分互联网公司都是采用它,来作为数据层的框架。mybatis相对于hibernate来说,更灵活、方便、小巧、上手容易等特点。但是Spring官方并没有提供对mybatis的集成,相反JPA正符合hibernate的设计理念,当然我们现在使用的集成都是由mybatis公司或者开源社区开发者提供的。那么为什么Spring不主动支持呢?我想应该是在当前的微服务盛行的大环境下,在业务表设计下不建议使用级联查询,那么就是说我们在开发微服务时基本都是单个服务仅指向单张表,对于单张表的查询,那么Spring Data JPA 的确有很好的实现方式,基本不需要写任何的sql。但是在我们使用的mybatis-spring-boot-starter也可以做到相应的功能,也有类似的插件,插件的实现甚至是比JPA实现的更完善,它的名字叫mapper-spring-boot-starter,有了它可以达到对单表操作时基本不需要写SQL,它也有丰富的分页排序插件(pagehelper-spring-boot-starter),逆向工程插件(mybatis-generator-core)等,基本已经囊括了所有Spring Data JPA的能实现的功能(这里不要深究,在目前来看两者基本一致了,甚至说mybatis更强大,当然在技术选型时还是需要结合自己的业务)。
mybatis-spring-boot-starter 支持方式
- 采用直接调用默认的接口方法
- @Select注解手动写SQL
- XML配置SQL
3、Spring boot 配置多数据源
通过注解定义多个datasource,在加载bean时,加载不同的datasource到管理中,然后在相应的接口方法上采用自定义注解定义使用的数据源,最终通过Spring AOP实现数据源的切换。
代码见文末github
4、推荐使用阿里Druid数据源使用
- 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
- 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
- SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
- 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。
- 提供了一套完善的UI界面,方便监控性能及访问等参数。
以上内容为本次进行Spring boot架构中摸索尝试,如在使用中遇到任何问题,欢迎找我讨论。
2018-05-23 23:52:00
网友评论