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层)开发步骤:
- dependency中引入spring-boot-starter-data-jpa依赖
- 声明持久层的接口, 这个接口继承Repository(或Repository子接口)
- 接口中写需要的业务方法
@Valid 表单验证
1 | public Girl girlAdd(@Valid Girl girl, BindingResult bindingResult) { |
AOP
- 多个地方用AOP:
@Pointcut(...)
,@Before
,@After
- 代替System.out.println: spring自带
org.slf4j.logger
:1
2private static final Logger logger = LoggerFactory.getLogger(类名.class);
logger.info(">>print msg<<");