SpringBoot 中 JPA 的根本应用
1.Jpa 是什么?
JPA,顾名思义,就是 Java 持久性 API 的意思。JDK 5.0 正文或 XML
形容了对象和关系表之间的映射关系,并在运行时将实体对象保留到数据库中。
2. 劣势
2.1 标准化
JPA 是 JCP 公布的 Java EE
规范之一,所以任何宣称合乎 JPA 规范的框架都遵循雷同的架构,提供雷同的拜访 API,这保障了基于 JPA 开发的企业应用只需稍加批改就能够在不同的 JPA 框架下运行。
2.2 反对容器级个性 JPA 框架
反对容器级的事务,比方大数据集、事务、并发等。,使得 JPA 超过了简略持久性框架的限度,在企业应用中施展更大的作用。
2.3 简略不便
JPA 的次要指标之一是提供一个更简略的编程模型: 在 JPA 框架下创立实体就像创立 Java 类一样简略,没有任何束缚和限度,只须要应用 javax.persistence.Entity
进行正文。JPA 的框架和接口也非常简单,没有太多不同的规定和设计模式,开发者很容易把握。JPA 是基于非侵入性原理设计的,因而能够很容易地与其余框架或容器集成。
2.4 查问能力
JPA 的查询语言是面向对象的,而不是面向数据库的。它用面向对象的天然语法结构查问语句,能够看作是 Hibernate HQL
的等价物。JPA 定义了惟一的 JPQL (Java 持久性查询语言)。JPQL 是 EJB QL 的扩大,它是一种实体查询语言。操作对象是实体,而不是关系数据库的表,能够反对批量更新和批改、JOIN、GROUP BY、HAVING 等高级查问性能。,通常只有 SQL 能够提供。它甚至能够反对子查问。
2.4 高级性能
JPA 能够反对高级的面向对象个性,比方继承、多态和类之间的简单关系。这种反对使开发人员可能最大限度地应用面向对象的模型来设计企业应用程序,而不用解决这些个性在关系数据库自身中的持久性。Spring Boot Jpa
把咱们从 DAO 层的操作中解放出来,基本上所有的 CRUD 都能够通过它来实现。
3. 代码实现。
增加依赖项和配置
pom.xml
springframework.boot
弹簧 - 启动 - 启动器 - 数据 -jpa
关系型数据库
MySQL- 连接器 -java
应用程序. 属性
spring . data source . URL = JDBC:MySQL://localhost:3306/test?server time zone = UTC & use unicode = true & character encoding = utf-8 & use SSL = true
spring.datasource . 用户名 =root
spring . data source . password = root
spring . data source . driver-class-name = com . MySQL . CJ . JDBC . driver
spring . JPA . properties . hibernate . hbm 2 DDL . auto = create
spring . JPA . properties . hibernate . dialect = org . hibernate . dialect . MySQL 5 innodb dialect
#sql\u8F93\u51FA
spring.jpa.show-sql=true
# format \ u4e 00 \ u 4 E0 bsql \ u8FDB \ u884C \ u8f 93 \ u51FA
spring . JPA . properties . hibernate . format _ SQL = true
一. 根本考察
基本上有两种查问:
一是默认状况下曾经实现了 Spring 数据,
一种是依据查询方法主动解析成 SQL。
预生成办法
默认状况下,Spring Boot Jpa 事后生成了一些凝乳的根本办法,如增加、删除、更改等。
1 继承 JpaRepository
公共接口 UserRepository 扩大 JpaRepository {
}
复制代码
应用默认办法。@测试
public void testBaseQuery()引发异样{User User = new User();user repository . find all();user repository . findone(1l);userRepository.save(用户);userRepository.delete(用户);user repository . count();user repository . exists(1l);// ...
}
自定义查问
自定义简略查问是依据办法名主动生成 SQL,的次要语法是 findxxby、readaxxby、queryxxby、countxxby、getxxby,后跟属性名:
用户 findByUserName(字符串用户名);
也用一些加一些关键字 And,or。用户 findByUserNameOrEmail(字符串用户名,字符串电子邮件);
批改、删除和计数是相似的语法。
Long deleteById(长 id);长计数用户名(字符串用户名)
在根本的 SQL 零碎中,能够应用关键字,比方:LIKE、IgnoreCase、OrderBy。
List findByEmailLike(字符串邮件);用户 findByUserNameIgnoreCase(字符串用户名);list findByUserNameOrderByEmailDesc(字符串 email);
具体的关键字、用法和生成 SQL 如下表所示。
关键字 samplejpql snippetandfindbylastname and first name…其中 x.lastname =?1 和 x.firstname =?2OrfindByLastnameOrFirstname…其中 x.lastname =?1 或 x.firstname =?2Is,EqualsfindByFirstnameIs,findByFirstnameEquals…其中 x.firstname =?1 between findbystartdatebetween…其中 x.startDate between?1 和?2 lesssthanhfindbyagelessthan…其中 x.age <?1 lesssaneequalfindbyagelessthan equal…x . age⇐在哪里?1 greaterthanfindbyagegreaterthan…其中 x.age >?1 greaterthanequalfindbyagegreaterthanequal…其中 x.age >=?1AfterfindByStartDateAfter…其中 x.startDate >?1BeforefindByStartDateBefore…其中 x.startDate <?1IsNullfindByAgeIsNull…其中 x.age 为 nullIsNotNull,NotNullfindByAge(Is)NotNull…其中 x.age 不为 nullLikefindByFirstnameLike…其中 x.firstname like?1 notlikefindbyfirst name not like…其中 x.firstname 不喜爱?1 startingwithfindbyfirst name starting with…其中 x.firstname 喜爱?1(参数绑定有追加的 %)EndingWithfindByFirstnameEndingWith…其中 x.firstname like?1(用前缀 % 绑定的参数)蕴含 findbyfirst name 蕴含…其中 x.firstname like?1(参数绑定包装在 % OrderByfindByAgeOrderByLastnameDesc…其中 x.age =?1 order by x.lastname descnotfindbylastname not…其中 x . last name?1InfindByAgeIn(珍藏年龄)x.age 在哪里?1NotInfindByAgeNotIn(珍藏年龄)…其中 x.age 不在?1 ruefindbyactivetrue()…其中 x . active = true false findbyactivefalse()…其中 x . active = false ignorecasefindbyfirstnameignorecase…其中 UPPER(x . first name)= UPPER(?1)
二。简单的查问
在理论开发中,须要应用分页、删除抉择、链接表等查问时,须要非凡的办法或自定义 SQL。
分页查问
分页在理论应用中很常见,Spring Boot Jpa 曾经帮咱们实现了分页性能。在查询方法中,咱们须要传入参数 Pageable。当查问中有多个参数时,倡议将 Pageable 作为最初一个参数。
Page findALL(可分页可分页);
Page findByUserName(字符串用户名,可分页可分页);
复制代码
Pageable 是 Spring 封装的分页实现类。应用时须要传入页数,页数和排序规定。
@测试
public void testPageQuery() 引发异样 {
int page=1,size = 10
排序 sort = 新排序 (方向。DESC,《本我》);
pageable pageable = new page request(页面、大小、排序);
userRepository.findALL(可分页);
user repository . findbysusername(” testName “,可分页);
}
复制代码
受限查问
有时候咱们只须要查问前 N 个元素,或者只取前一个实体。
用户 findFirstByOrderByLastnameAsc();
用户 findTopByOrderByAgeDesc();
page query first 10 by last name(String last name,Pageable Pageable);
List findFirst10ByLastname(字符串姓氏,排序排序);
list find top 10 by lastname(String last name,可分页可分页);
复制代码
自定义 SQL 查问
其实 Spring Data 感觉大部分 SQL 都是能够依照办法名定义来实现的,然而因为某些起因咱们想用自定义 SQL 来查问。
Spring 数据也失去完满反对;
在 SQL 的查询方法上应用 @Query 标注,如波及删除、批改时增加 @ Modifying。还能够增加 @Transactional 对事物的反对,查问超时设置等。依据须要。
@批改
@ Query(” update User u set u . username =?1 其中 u.id =?2″)
int modifyByIdAndUserId(字符串用户名,长 id);
@事务性
@批改
@Query(“ 从 id =?1”)
void deleteByUserId(长 id);
@Transactional(timeout = 10)
@Query(“select u from User u 其中 u.emailAddress =?1”)
用户 findByEmailAddress(字符串 email address);
复制代码
多表查问
Spring Boot Jpa 中实现多表查问有两种形式。第一种形式是应用 Hibernate 的级联查问,第二种形式是创立一个后果集的接口来接管链接表查问的后果。这里次要采纳第二种形式。
首先,您须要定义后果集的接口类。
公共界面酒店摘要{
city get city();
string getName();
double getAverageRating();
默认整数 getAverageRatingRounded() {
return getAverageRating() == null?null:(int)math . round(getAverageRating());
}
}
复制代码
查问的办法返回类型被设置为新创建的接口。
@Query(“select h.city as city,h.name as name,avg(r . rating)as averaging rating “
+” 从酒店 h 左侧内部连贯 h.reviews r,其中 h.city =?1 组按 h”)
Page findByCity(City city,可分页可分页);
@Query(“select h.name as name,avg(r.rating) as averageRating “
+“从酒店 h 左侧内部退出 h.reviews r group by h”)
Page findByCity(可分页可分页);
复制代码
应用
page hotels = this . hotel repository . findbycity(new page request(0,10,方向。ASC,“名称”));
对于 (酒店摘要摘要: 酒店){
system . out . println(” Name “+summay . getname());
}
复制代码
在运行过程中,Spring 会主动为接口产生一个代理类 (HotelSummary) 来接管返回的后果,并以 getXX 的模式取得代码摘要。