【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

相关内容

热门资讯

云米科技CEO给员工奖励小米Y... 【CNMO科技消息】据CNMO了解,云米科技创始人兼CEO陈小平在社交平台上宣布,在近日的公司年会上...
上证180ETF指数基金(53... 截至2026年1月23日 15:00,上证180指数(000010)下跌0.31%。成分股方面涨跌互...
央行连续14月增持黄金,机构:... 1月26日早盘,金银价格再创历史新纪录:现货黄金首次突破5000美元/盎司整数关口,距离现货金首次突...
重庆川仪自动化股份有限公司 2... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
突破5000美元大关!现货黄金... 现货黄金价格站上5000美元/盎司。 1月26日,现货黄金首次站上5000美元/盎司,再创历史新高,...
原创 口... 曾与古井贡酒、迎驾贡酒、金种子酒并称“徽酒四朵金花” 的口子窖,正遭遇严峻的业绩滑铁卢。归母净利润预...
东鹏饮料今起招股,卡塔尔投资局... 来源:独角兽早知道 东鹏饮料(09980.HK)发布公告,公司拟全球发售4088.99万股H股,中...
1月26日国际晨讯丨现货黄金首... 现货黄金首次突破5000美元/盎司;美联储即将举行2026年首次议息会议;特斯拉、苹果、微软 、Me...
俄健身市场迎来“温和”式增长 【环球时报综合报道】今年俄罗斯健身服务市场将继续扩大,但增速下降。据FitnessData公司分析师...
洛阳钼业巴西金矿完成交割 将秉... 2026年开年,洛阳钼业海外并购再传捷报——公司以最高10.15亿美元收购的巴西金矿资产于1月23日...
离谱!美军飞行秀竟致日本教师无... 这是2023年11月25日在日本冲绳美军普天间基地驻留的“鱼鹰”运输机。新华社记者冯武勇摄 美军调查...
量质齐升 国产CPU龙头业绩大... 本报记者 贺王娟 1月23日晚间,国产CPU(中央处理器)龙头企业龙芯中科技术股份有限公司(以下简称...
原创 想... 辞掉工作,全职炒股。 这是很多股民的梦想——不用看老板脸色,靠自己的判断赚钱。但现实是,多数人没等到...
商业航天热度不减 产业链公司频... 转自:证券日报     本报记者 张文湘     见习记者 占健宇     开年以来,商业航天赛道持...
西兰花和花椰菜,怎么选更健康? 无论是护肝、增强免疫力,还是降低某些癌症风险,十字花科蔬菜都常被推荐。其中,西兰花和花椰菜最常被拿来...
原创 马... 马克龙在达沃斯一开口,全世界都竖起了耳朵。 不是因为他讲了什么新奇话,而是他居然当着全球政商精英的面...
降本加量扩围 结构性货币政策增... ● 本报记者 彭扬 欧阳剑环 “1.5亿元的贷款不仅解决了企业技改资金的燃眉之急,更让我们对推进智能...
高盛喊涨黄金至5400美元!富... 黄金价格新拐点:从央行主导到全民抢金 2026年1月,全球顶级投行高盛抛出重磅预测,将黄金目标价从4...