springboot, JPA, Mybatis, Hibernate

SpringBoot是MVC框架的starter,用的持久层框架可以选择mybatis,而JPA是一种统一ORM框架的一部分,hinernate遵循JPA(和其他的很多规范)实现了hibernate JPA,所以JPA不可能“选择mybatis”,因为JPA是ORM规范,而mybatis不属于这种

JPA是什么

Java Persistence API, 是这几个概念中唯一一个我没有系统性学过的东西。

JPA本身是一种ORM规范(不是ORM框架,因为JPA没有提供ORM实现,只是制定了规范)。因为JPA是一种规范,所以只提供了一些相关的接口,但是接口并不能直接用。JPA和hibernate,可以理解为JPA是标准接口,hibernate是实现,并不是对标关系。hibernate, TokLink, etc. 等框架实现了JPA(和其他很多)规范

Spring Data JPA

Spring Data是Spring的子项目,用于简化数据库访问,直接RDBMS(JDBC, JPA)和NoSQL(MongoDB:文档数据库, Redis:键值存储, Neo4j:图形数据库, HBase:列族数据库)

为什么用这个?因为这个极大简化了数据库操作;解脱了DAO层操作,所有CRUD都可以依赖这个实现,开发中唯一要做的就是声明持久层的接口, 其他的都给Spring Data JPA完成。实际操作中推荐Spring Data JPA + ORM(e.g. hibernate)完成,这样在切换不同的ORM框架时很方便。

框架如何代替开发实现业务逻辑?e.g. 当有一个UserDao.findUserById()这样一个方法声明的时候,大致能判断是根据给定id查询满足条件的user对象的方法。Spring Data JPA做的就是规范方法的名字,根据符合规范的名字确定方法需要实现什么样的业务逻辑。

Spring Data JPA进行持久层(Dao层)开发步骤:

  1. dependency中引入spring-boot-starter-data-jpa依赖
  2. 声明持久层的接口, 这个接口继承Repository(或Repository子接口)
  3. 接口中写需要的业务方法

@Valid 表单验证

1
2
3
public Girl girlAdd(@Valid Girl girl, BindingResult bindingResult) {
...
} // 表单验证girl对象,验证完成结果返回给bindingResult对象

AOP

  1. 多个地方用AOP: @Pointcut(...), @Before, @After
  2. 代替System.out.println: spring自带org.slf4j.logger:
    1
    2
    private static final Logger logger = LoggerFactory.getLogger(类名.class);
    logger.info(">>print msg<<");