固定链接 Spring Data JPA的简单入门

Spring Data JPA的简单入门

Spring Data JPA的简单入门

前言

基本工程搭建

其中,spring-boot-starter-web是spring boot框架依赖,spring-boot-starter-data-jpa是Spring Data Jpa依赖,我使用的Mysql数据库,所以引入了mysql-connector-java。 querydsl-jpa和querydsl-apt是在JPA基础上使用querydsl的依赖,可以不引入。最后lombok广泛使用的懒癌工具包。
接下来当然是构建一个数据源,本地需要安装mysql,这部分我就不细说了。数据库安装完成后,创建一个test库,建song表,建表语句:

spring.jpa.hibernate.ddl-auto是最有意思的一个配置,一不小心可能造成删库的悲惨结果。

  • create:每次运行该程序,没有表格会新建表格,表内有数据会清空。
  • create-drop:每次程序结束的时候会清空表。
  • update:每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
  • validate:运行程序会校验数据与数据库的字段类型是否相同,不同会报错

这里的是否有表格是以应用中配置的Entity实体为依据的,这意味着应用能够根据自身的Entity实体来影响表的创建和表的结构。千言万语汇成一句话,千万不要配置为create。
最后需要在应用中配置相应的实体Entity和实体的Repository。项目目录整体文件结构如下:
spring data JPA的简单入门-JpaProjectStructure.png
其中:

  • JpademoApplication.java:spring boot应用入口
  • TestController.java: 测试用controller接口
  • Song.java: 对应song表的实体类Entity
  • SongRepository: 对应实体类Song的Repository接口

Song实体定义:

Jpa实体Entity对应了持久层的表数据,Song实体的定义,就对应了本地mysql数据test库中的song表。而对表数据的增删改查操作,可以通过Repository实现。

SongRepository继承JpaRepository接口,默认实现了诸如save(S entity)、findAll()、count()、delete(T entity)之类的方法,同时也支持子类通过名字拓展自定义新的查询或其他操作数据的方式,比如我在上面定义的find、get、query By id或者 IdAndYear,就是通过id或者year组合查询。虽然这种通过名字来拓展新的操作数据接口的方法看起来比较蠢,但是具体到实现原理还是值得探讨一番的。

基本使用

Repository提供标准Crud接口,也支持按照规范的命名标准自定义接口,这些在上文已经介绍过了。EntityManager方式其实是Repository的底层实现,这种方式提供了创建CriteriaQuery(上例没有展示)、hql 的Query、SQL的Query,通过Query完成最终和数据库的交互。从上例可以看出hql形式和sql比较类似,只是hql在“select s as ss from Song s”语句中,使用了面向对象的封装,这里Song对应的是实体Song,而不表名。原生NativeQuery对应的就是原生Sql查询。
除此之外,Repository也提供非规范命名的接口查询,本质也是使用EntityManager的hql和sql方式。在Repository的接口方法上可以使用@Query注解,并定义相应的hql或者sql的语句,查询条件需要和接口方法的入参一致,查询结果对应接口方法的返回参数。
实际上,spring data jpa提供了一个sql演化的基本思路,即从sql到hql再到结合实体使用的Repository。但是实体很难解决关系型数据库表数据的join问题,在《java数据库持久层框架基础:为什么不是JPA?》这篇文章中,我提到了可以使用querydsl解决联表问题,实际上spring data jpa也有自己的方案,即在单个实体中定义映射集合。简单解释来说,假设一个表对应实体类Person,Person包含一个集合属性Head,Head对应的是另一个表中的数据。Person实体中使用

实现联表。但这种方式存在复杂的级联关系,在更新、插入和删除操作中极其难以处理。

作者:孙新
现在注册滴滴云,得10000元立减红包
8月特惠,1C2G1M云服务器 9.9元/月限时抢
滴滴云使者专属特惠,云服务器低至68元/年
输入大师码【7886】,GPU全线产品9折优惠

您的留言将激励我们越做越好