【SpringBoot】整合Spring Data JPA操作数据
创始人
2025-05-31 09:22:58
0

一、 Sping Data JPA 简介

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 JPA 技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!

二、 将Spring Data JPA集成到Spring Boot

第一步:引入maven依赖包,包括Spring Data JPA和Mysql的驱动

org.springframework.bootspring-boot-starter-data-jpa
mysqlmysql-connector-java

第二步:修改application.yml,配置好数据库连接和jpa的相关配置

spring:datasource:url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverjpa:hibernate:ddl-auto: updatedatabase: mysqlshow-sql: true

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动根据实体类的定义创建、更新、验证数据库表结构。该参数的几种配置如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

三、 基础核心用法

我们来实现一个简单的使用JPA操作数据库的例子。

3.1.实体Model类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name="article")
public class Article {@Id@GeneratedValueprivate Long id;@Column(nullable = false,length = 32)private String author;@Column(nullable = false, unique = true,length = 32)private String title;@Column(length = 512)private String content;private Date createTime;
}
  • @Entity 表示这个类是一个实体类,接受JPA控制管理,对应数据库中的一个表
  • @Table 指定这个类对应数据库中的表名。如果这个类名和数据库表名符合驼峰及下划线规则,可以省略这个注解。如FlowType类名对应表名flow_type。
  • @Id 指定这个字段为表的主键
  • @GeneratedValue(strategy=GenerationType.IDENTITY) 指定主键的生成方式,一般主键为自增的话,就采用GenerationType.IDENTITY的生成方式
  • @Column 注解针对一个字段,对应表中的一列。nullable = false表示数据库字段不能为空, unique = true表示数据库字段不能有重复值,length = 32表示数据库字段最大程度为32.

关于更多注解的详细用法,请参考:# Hibernate Annotations 参考文档

3.2.数据操作接口

public interface ArticleRepository extends JpaRepository {
}

XxxRepository继承 JpaRepository为我们提供了各种针对单表的数据操作方法:增删改查。只要你不是完全英语小白,通过调用接口的方法名称就能知道方法是做什么操作的。

3.3.service层接口:

public interface ArticleRestService {ArticleVO saveArticle(ArticleVO article);void deleteArticle(Long id);void updateArticle(ArticleVO article);ArticleVO getArticle(Long id);List getAll();
}

3.4.service层接口实现

@Service
public class ArticleJPARestService implements  ArticleRestService  {//将JPA仓库对象注入@Resourceprivate ArticleRepository articleRepository;@Resourceprivate Mapper dozerMapper;public ArticleVO saveArticle( ArticleVO article) {Article articlePO = dozerMapper.map(article,Article.class);articleRepository.save(articlePO);    //保存一个对象到数据库,insertreturn  article;}@Overridepublic void deleteArticle(Long id) {articleRepository.deleteById(id);   //根据id删除1条数据库记录}@Overridepublic void updateArticle(ArticleVO article) {Article articlePO = dozerMapper.map(article,Article.class);articleRepository.save(articlePO);   //更新一个对象到数据库,仍然使用save方法}@Overridepublic ArticleVO getArticle(Long id) {Optional
article = articleRepository.findById(id); //根据id查找一条数据return dozerMapper.map(article.get(),ArticleVO.class);}@Overridepublic List getAll() {List
articleLis = articleRepository.findAll(); //查询article表的所有数据return DozerUtils.mapList(articleLis,ArticleVO.class);} }

注意:虽然新增和修改都是使用的save方法,但是完成的功能是不一样的。当保存的对象有主键id的时候,save方法会根据id更新记录;当保存的对象没有主键id的时候,save方法会向数据库里面insert一条记录。

四、关键字查询接口

除了上文中JpaRepository为我们提供的增删改查的方法。我们还可以自定义方法,非常简单。把下面的方法名放到ArticleRepository 里面,它就自动为我们实现了通过author字段查找article表的所有数据。也就是说,我们使用了find(查找)关键字,JPA就自动将方法名为我们解析成数据库操作,太智能了。

    //注意这个方法的名称,jPA会根据方法名自动生成SQL执行Article findByAuthor(String author);

其他具体的关键字,使用方法和生产成 SQL 如下表所示

KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age ⇐ ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection age)… where x.age not in ?1
TRUEfindByActiveTrue()… where x.active = true
FALSEfindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

可以看到我们这里没有任何类SQL语句就完成了两个条件查询方法。这就是Spring-data-jpa的一大特性:通过解析方法名创建查询。针对单表的数据查询简单到令人发指,怎么可以这么简单,照这个趋势发展,程序员早晚失业。

五、测试关键字查询

@RunWith(SpringRunner.class)
@SpringBootTest
public class JPAKeyWordTest {@Resourceprivate ArticleRepository articleRepository;@Testpublic void userTest() {Article article = articleRepository.findByAuthor("krislin");System.out.println(article);}}

五、其他

Spring-data-jpa的能力远不止本文提到的这些,由于本文主要以整合介绍为主,对于Spring-data-jpa的使用只是介绍了常见的使用方式。本教程作为spring boot系列教程,并不能将spring data jpa的方方面面讲到,本文只会去讲最重要的部分,如果想更加深入的学习Spring data jpa。其实,本文已经介绍了JPA最常用的用法中的80%,笔者不建议使用Query、NamedQuery、Specification、QueryDSL等,如果你用这些东西,还不如自己写SQL。 当然,JPA的深度用户,也许会不同意我的说法,那么请参考下方文档进行更深入的学习:

建议参考: Spring Data JPA 官方文档
JPA像Mybatis一样写SQL

相关内容

热门资讯

无需预约、提供插座,星巴克回应... 华声在线7月22日讯(全媒体记者 仝若楠 通讯员 万家忻)近日,有网友在社交媒体上发帖表示,广东部分...
黑天鹅突袭!7个跌停! 【导读】*ST苏吴控股孙公司独家经销权将被撤销,拟撤销方被爱美客接手不久 中国基金报记者 闻言 7月...
鲍威尔:美联储须专注于确保大型... 来源:智通财经网 美联储主席鲍威尔周二表示,美联储的监管实践“必须集中在决定安全与稳健的关键领域”。...
香港黄金交易所优势加持,金荣中... 香港作为国际金融中心,凭借高度开放的金融市场、成熟完善的监管体系以及与国际接轨的投资环境,成为亚洲及...
股市必读:惠泰医疗(68861... 截至2025年7月22日收盘,惠泰医疗(688617)报收于295.66元,下跌0.2%,换手率0....
独家|外汇展业改革参与银行增至... 新媒体编辑 | 实习生 宋语菡 7月22日,国新办举行新闻发布会,国家外汇局副局长、新闻发言人李斌,...
今年以来12大类家电以旧换新销... 商务部7月22日消息,商务部流通发展司负责人表示,上半年,我国以旧换新成效显著,国货“潮品”深受欢迎...
AI英语教育站上风口 “伴鱼阅... 本报讯 (记者贾丽)国内在线教育企业北京读我科技有限公司(以下简称“伴鱼”)旗下核心产品“伴鱼阅读营...
罕见一幕!六大期货品种集体涨停... 在“反内卷”政策的刺激下,工业品期货全线大涨! 7月22日,商品期货午后大爆发,焦煤、焦炭、多晶硅、...
Club Med换帅落定:法国... Club Med换帅风波终落定。7月21日夜,复星旅文旗下核心资产Club Med正式任命法国籍高管...
金价又“疯”了!克价1021元... #热点新知#家人们谁懂啊!一觉醒来,金饰克价直接蹦回1021元 !咱楼下金店那电子屏,数字跳得比我工...
读懂IPO|穿透明略科技盈利表... 来源丨时代商业研究院 作者丨陈丽娜 编辑丨郑琳 当前人工智能行业普遍面临盈利难题,例如,素有中国人工...
大摩高管“抄底”香港楼市,一次... 据媒体报道,摩根士丹利董事总经理戴维·约翰·赖特(David John Wraight)以1.473...
山西打造“专精特新”专板 首批... “‘专精特新’企业是培育新质生产力的核心引擎,山西‘专精特新’专板建设是打通金融活水精准灌溉的关键通...
【数据发布】2025年上半年辽... 根据辽宁省地区生产总值统一核算结果,2025年上半年全市实现地区生产总值457.0亿元,按不变价格计...
赴港上市潮起,半导体企业为何扎... 【大河财立方 记者 王磊彬】2025年以来,港股IPO市场迎来新一轮半导体企业上市热潮。 据不完全统...
煤炭板块异动拉升,多只资源主题... 7月22日,市场全天震荡走高,三大指数盘中均创年内新高。板块方面,超级水电、工程机械、煤炭、水泥等板...
中国太平李可东“履新”,兼任2... 中国太平总经理李可东“履新”,兼任旗下两家子公司董事长。 7月21日,太平财险公告称,经国家金融监管...
胜宏科技回应赴港二次IPO,受... 瑞财经 吴文婷7月22日,据媒体报道,胜宏科技证券部工作人员回应筹划港股IPO一事,称公司主要基于资...
洪灏:港股如约创新高,向上空间... 洪灏系莲华资产管理公司管理合伙人&CIO,中国首席经济学家论坛理事 知名经济学家、 莲花投资公司合伙...