一、什么是JPA
二、SpringData-JPA与MybatisPuls的区别
三、项目中使用JPA
JPA常用注解
JPA进阶使用技巧
JPA是 Java Persistence API 的简称,中文名Java持久层API,其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术。
简单地说,JPA就是为POJO(Plain Ordinary Java Object)提供持久化的标准规范,即将Java的普通对象通过对象关系映射(Object-Relational Mapping,ORM)持久化到数据库。由于JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,因而具有易于使用、伸缩性强等优点。
Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,可以在几乎不用写实现的情况下实现对数据库的访问和操作,除了CRUD外,还包括分页和排序等一些常用的功能。Spring Data JPA 还提供了对分页查询、自定义SQL、查询指定N条记录、联表查询等功能的支持JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、TopLink等框架。相反,在采用JPA开发时,我们将仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
JPA和MyBatis Plus是两种不同的ORM框架。
JPA是Java Persistence API的缩写,是Java EE的一部分,提供了一种标准的ORM框架,可以将Java对象映射到关系型数据库中。JPA提供了一些注解和API,可以方便地进行数据库操作,如增删改查等。
MyBatis Plus是MyBatis的增强版,是一种轻量级的ORM框架,也可以将Java对象映射到关系型数据库中。MyBatis Plus提供了一些便捷的API和代码生成器,可以快速地进行数据库操作,同时也支持自定义SQL语句。
两者的区别在于,JPA是一种标准的ORM框架,具有一定的规范性和通用性,但是使用起来相对复杂,需要掌握一些注解和API;而MyBatis Plus是一种轻量级的ORM框架,使用起来相对简单,但是需要手写SQL语句,不够规范化。
备注:
org.springframework.boot
spring-boot-starter-data-jpa
spring:
server:
port: 9000 //启动端口
datasource: //数据库配置
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/库名?useUnicode=true&characterEncoding=utf-8&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
username: root
password: root
jpa:
show-sql: true //日志中显示sql语句
配置JPA相关注解
a.实体对象类
@Entity //实体名称
@Table(name = "usc_user_group_relation", schema = "unified_auth")//数据库+对应的数据表名称
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
public class UscUserGroupRelation {
private Long id;
@ApiModelProperty(value = "用户组id")
private Long uscUserGroupId;
@ApiModelProperty(value = "主用户id")
private Long uscBaseUserId;
@ApiModelProperty(value = "组织id")
private Long uscOrganizationId;
@Id//主键标识
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Basic//属性对应数据库字段映射
@Column(name = "usc_user_group_id")
public Long getUscUserGroupId() {
return uscUserGroupId;
}
public void setUscUserGroupId(Long uscUserGroupId) {
this.uscUserGroupId = uscUserGroupId;
}
@Basic
@Column(name = "usc_base_user_id")
public Long getUscBaseUserId() {
return uscBaseUserId;
}
public void setUscBaseUserId(Long uscBaseUserId) {
this.uscBaseUserId = uscBaseUserId;
}
@Basic
@Column(name = "usc_organization_id")
public Long getUscOrganizationId() {
return uscOrganizationId;
}
public void setUscOrganizationId(Long uscOrganizationId) {
this.uscOrganizationId = uscOrganizationId;
}
@Override
public String toString() {
return "UscUserGroupRelation{" +
"id=" + id +
", uscUserGroupId=" + uscUserGroupId +
", uscBaseUserId=" + uscBaseUserId +
", uscOrganizationId=" + uscOrganizationId +
'}';
}
}
b.数据访问接口XXX.Repositpry(类似Dao的作用类)
public interface UscUserGroupRelationRepository extends JpaRepository {
@Transactional//只需要在执行增、删、改 提交事务的语句中需要加此注解
void deleteAllByUscUserGroupId(Long id);
@Transactional
void deleteAllByUscBaseUserId(Long id);
@Transactional
void deleteAllByUscOrganizationIdAndUscUserGroupId(Long orgId, Long groupId);
List findByUscUserGroupId(Long groupId);
List findByUscBaseUserId(Long userId);
List findByUscUserGroupIdAndUscOrganizationIdOrUscUserGroupIdAndUscOrganizationIdIsNull(Long groupId, Long orgId, Long groupId1);
@Query(value = "select " +
"uug.group_name, uug.group_code, " +
"uug.group_status, uo.org_code, " +
"uo.org_name, uo.org_style, " +
"uo.org_status " +
"from usc_user_group_relation uugr " +
"left join usc_user_group uug on uugr.usc_user_group_id = uug.id " +
"left join usc_organization uo on uugr.usc_organization_id = uo.id " +
"where uugr.usc_base_user_id = ?1 " +
"order by uugr.id asc ",
nativeQuery = true
)
//@Query 负责sql查询,可以用该注解来编写;
//nativeQuery = true,是代表通过绑定变量?1..?n来传参,例如:select id from usc_base_user_id where id = ?1
//nativeQuery = false,默认是使用实体来查询,,例如:select id from UscBaseUserInfo where uscBaseUserId=1;
List
@Entity 声明类为实体或表。
@Table 声明表名。
@Basic 指定非约束明确的各个字段。
@Embedded 指定类或它的值是一个可嵌入的类的实例的实体的属性。
@Id 指定的类的属性,用于识别(一个表中的主键)。
@Transient 指定的属性,它是不持久的,即:该值永远不会存储在数据库中。
@Column 指定持久属性栏属性。
@SequenceGenerator 指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。
@TableGenerator 指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。
@Transactional 只需要在执行增、删、改 提交事务的语句中需要加此注解
@JoinColumn 指定一个实体组织或实体的集合。这是用在多对一和一对多关联。
@ColumnResult 参考使用select子句的SQL查询中的列名。
@ManyToMany 定义了连接表之间的多对多一对多的关系。
@ManyToOne 定义了连接表之间的多对一的关系。
@OneToMany 定义了连接表之间存在一个一对多的关系。
@OneToOne 定义了连接表之间有一个一对一的关系。
@NamedQuery 指定使用静态名称的查询。
Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍_大型项目使用jpa_架构悟道的博客-CSDN博客
相关日常使用遇到问题,持续更新中