​​​​​​​1. JPA简介

JPA 可以通过实体类生成数据库的表,同时自带很多增删改查方法,大部分sql语句不需要我们自己写,配置完成后直接调用方法即可,很方便。

概念:

JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

优势:

  • 标准化

JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。

  • 容器级特性的支持

JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

  • 简单方便

JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。

  • 查询能力

JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。

  • 高级特性

JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

2. spring-data-jpa

JPA本身就是一套标准,就和jdbc一样,不同的上场都是可以来进行实现。目前使用的比较多的都是hibernate的实现。 然而在SpringBoot中我们可以无缝的集成Spring-data-jpa, 简答介绍一个Spring-data. 他也是属于Spring家族的一个产品,主要就是用来封装各种中间件的操作,比如Spring-data-jdbc,就是我们浅浅讲到的jdbcTemplate, 还有spring-data-jpa用来实现JPA, Spring-data-redis封装操作redis的api, 还有spring-data-mongodb, spring-data-elasticsearch,等等。

SpringData所包含的项目如下:

由于产品本身都是spring的,所以和spring的集成有着得天独厚的优势。并且也直接为springBoot提供了相应的starter,我们引入后就可以直接操作,非常方便。

3. JPA、hibernate、SpringDataJpa关系

JPA仅仅是一种规范,也就是说它仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

SpringDataJpa是Spring提供的一套简化JPA开发的框架,按照约定好的方法命名规则来创建DAO层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。并且提供了一些常用的增删改查等方法的直接操作。 SpringDataJpa可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的Jpa技术实现。

4. 集成步骤

我们还是先拉取一个feature/jpa的分支,防止和前面的mybatis冲突。这个分支里只负责集成JPA的操作。

4.1 引入SpringDataJpa所需依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency><!-- MySQL连接 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

通过观察依赖包,我们也能够发现其实他还是使用了hibernate:

4.2 配置数据库连接

在spring的配置文件application.yml中配置数据库相关信息:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot_learning?serverTimezone=Asia/Shanghai&characterEncoding=utf-8username: rootpassword: rootjpa:show-sql: true # 默认false,在日志里显示执行的sql语句database: mysqldatabase-platform: org.hibernate.dialect.MySQL5Dialecthibernate:ddl-auto: update #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会 新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建naming:#指定jpa的自动表生成策略,驼峰自动映射为下划线格式7implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl#physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

4.3 实体的编写

在Jpa中,有自己独立风格的实体,一般来讲就是有一些独特的注解来定义实体。 Jpa是一个比较完全式的ORM框架,就是可以完全通过实体映射数据库,甚至我们可以根据实体去生成数据库。

我们先来看实体的案例,还是以User为例。

/*** @className: User* @description:* @author: sh.Liu* @date: 2022-01-14 16:35*/
@Data
@Entity
@Table(name = "t_user")
public class User {/*** 主键生成策略: 自增*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;private Integer age;private String address;private Date createTime;private Date updateTime;}

这里有这么几个特殊的注解。

@Entity: 标识这是一个实体类

@Table: 标识与之映射的表名

@Id: 标识数据库主键

@GeneratedValue: 标识主键生成策略,这里是自增。

4.4 Dao层开发

Dao层主要处理和数据库的交互,这里我们可以使用JPA为我们提供的基类:JpaRepository,里面包含了大部分常用操作。只需集成即可。

package com.lsqingfeng.springboot.dao;import com.lsqingfeng.springboot.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;import java.io.Serializable;public interface UserDao extends JpaRepository<User,Integer>, Serializable {
}

接下来就可以在Service中直接调用Dao层,完成常用功能的开发,然后在Controller层中调用Service,将整个流程串起来。

package com.lsqingfeng.springboot.service.impl;import com.lsqingfeng.springboot.dao.UserDao;
import com.lsqingfeng.springboot.entity.User;
import com.lsqingfeng.springboot.service.UserService;
import org.springframework.stereotype.Service;import java.util.List;/*** @className: UserServiceImpl* @description:* @author: sh.Liu* @date: 2022-01-17 13:56*/
@Service
public class UserServiceImpl implements UserService {private final UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}@Overridepublic User getUserById(Integer id) {return userDao.getById(id);}@Overridepublic List<User> listUser() {return userDao.findAll();}@Overridepublic int save(User user) {userDao.save(user);return user.getId();}@Overridepublic int update(Integer id, User user) {// 有id则更新,无id则新增user.setId(id);userDao.save(user);return id;}@Overridepublic int delete(Integer id) {User user = new User();user.setId(id);userDao.delete(user);return id;}
}

4.5 测试

通过postman调用相关接口进行测试。

查看数据库:

时间值没有,因为我们没有在新增的时候设置当前时间。

再试试修改和查询

查询

4.6 自定义SQL的执行

现在我们的DAO层用的是JPA自带的通过继承一个基类的常用操作来实现的。那如果说我们有一个需求需要我们自己写一些sql应该如何实现呢。我们来实现一个根据名字查询的接口。

首先在DAO层定义一个接口。

public interface UserDao extends JpaRepository<User,Integer>, Serializable {/**** @param name* @return*/@Query("select u from User u where u.name = ?1")User getByName(String name);}

然后在Service层和Controller层调用这个方法。查看效果。

    @GetMapping("getByName")public Result getByName(String name){return Result.success(userService.getByName(name));}
复制代码

修改下数据库数据。

查询结果:

这里要注意的是: 我们在Query注解上写的是HQL语句,也就是默认操作的是对象。所以是from User, 也就是用对象去操作数据库,如果我们想要写原生sql,那么写法如下:

@Query("select u from t_user u where u.name = ?1",nativeQuery = true)User getByName(String name);

5. 总结

关于JPA的简单集成大概就介绍这么多,JPA的思想主要是通过对象操作数据库,相比于mybatis更加ORM, 所以相比之下,也有人把mybatis比作是一个半ORM的框架,主要原因就是sql和HQL的区别,这个如果使用的hibernate的同学应该更有感触。

关于JPA和Mybatis的选择问题,这个之一在网络上争论不断,这个其实也没有什么好坏之分,是要能实现我们的目的,选择那种框架只不过是其中的一种手段罢了。而像我确实还是用mybatis-Plus比较多。可能用的多了,也就感觉它更方便一些,下一篇文章咱们讲讲mybatis的升级版,mybatisPlus的用法。

另: 配套项目代码已托管中gitCode: gitcode.net/lsqingfeng/…

Jpa使用详解(Hibernate)相关推荐

  1. JPA EntityManager详解

    JPA EntityManager详解 1.   持久化上下文(Persistence Context) Ø 一个持久化单元(Persistence Unit)就是关于一组Entity类的命名配置.持 ...

  2. JPA+MySQL详解

    JPA+MySQL详解 首先明确两个端的关联关系,在java实体类定义中,含有mappedBy属性的时关系被维护端,含有关联字段的是关系维护端. 一.OneToOne关联关系 假设有实体People和 ...

  3. java中的cascade,详解Hibernate cascade级联属性的CascadeType的用法

    详解hibernate cascade级联属性的cascadetype的用法 cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新.若 ...

  4. jpa 定义中间表实体_Spring Data JPA实体详解

    1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...

  5. spring data jpa使用详解(推荐)

    使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下. 前言: Spring data简介: Spring Data是一个用于简化数据库 ...

  6. spring data jpa使用详解

    Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spr ...

  7. Spring Data JPA用法详解

    Spring Data JPA: JPA(Java Persistence API)即java持久化API,它的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate.TopLink. ...

  8. Spring data JPA使用详解(超详细)

    目录 Jpa 元模型 Criteria查询 CriteriaBuilder 安全查询创建工厂 CriteriaQuery 安全查询主语句 Root Predicate 过滤条件 Predicate 多 ...

  9. Hibernate配置文件与映射文件详解

    Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...

最新文章

  1. 对象是否要被回收(引用计数和可达性分析算法)
  2. Nginx反向代理缓冲区优化
  3. maven 在 mac中的配置
  4. 超经典动态规划题:最大子序和
  5. 使用Jest测试JavaScript (入门篇)
  6. numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)
  7. 相关疑惑解决,java线程虚假唤醒等等问题
  8. Android之FLAG_ACTIVITY_SINGLE_TOP
  9. javascript耐人寻味
  10. 2007年8月25日华为的几个面试题
  11. 面试题——股票利益最大化
  12. 运用工具Postman快速导出python接口测试脚本
  13. 汉明码---存储器校验(简单易懂详解)
  14. 液压系统原理动画_3大类12种液压阀工作原理,直观动画演示一看就懂
  15. 减少 JPG 文件大小
  16. PLM基础概述(解决方案架构师认证:PLM基础) | 达索系统百世慧
  17. 利用Python实现人脸识别,制作天网系统
  18. 财富管理技术服务商NewBanker完成千万级美元 Pre-C 轮融资
  19. LightGBM(LGB)
  20. Android应用源码仿微信凡信聊天项目源码

热门文章

  1. Android单元测试学习总结
  2. 微信订阅号关联服务号,通过获取共同unionid,来获取用户信息(关联账号)
  3. SpringBoot利用@Async注解实现异步调用
  4. 99. 激光炸弹 java 题解 (前缀和)
  5. Android AC97驱动杂记
  6. win7游戏全屏时任务栏不消失
  7. Linux 文件系统(VFS、EXT、proc)
  8. 笔记本连接惠普打印机
  9. 数码产品交易微信小程序的设计与实现
  10. 无限乱斗机器人ap出装_2019英雄联盟无限火力ap机器人出装攻略 英雄联盟无限火力ap机器人玩法一览...