Open conchincradle opened 2 years ago
JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。 Java persistence specification 现在几个主要的JPA实现技术有Hibernate、EclipseLink、OpenJPA等。 Hibernate与MyBatis都是流行的持久层开发框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架。 Hibernate可以自动生成SQL语句、自动执行,从而使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 object relation mapping
在Hibernate中使用的注解就是JPA注解,Hibernate实现了JPA规范。 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷, 并支持map-reduce框架和云计算数据服务。此外,它还支持基于关系型数据库的数据服务,如Oracle RAC等。
你可以理解为JPA和Mybatis是起相同作用的,都是持久层的框架,但是由于现在Mybatis的广泛应用,现在了解和使用JPA的人较少. jpa:hibernate:ddl-auto: update是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。 create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。 update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。 validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
@Data
注解在 类 上;提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString 方法。 @AllArgsConstructor
注解在 类 上;为类提供一个全参的构造方法,加了这个注解后,类中不提供默认构造方法了。 @NoArgsConstructor
注解在 类 上;为类提供一个无参的构造方法。
POJO = "Plain Old Java Object",是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者SessionBean。 POJO不担当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB,JDBC等等。 JPA之@Entity、@Table、@Column、@Id
Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。 这些普通Java对象被称作Entity Bean。 除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。 事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。
注意:在Hibernate中也有@Entity和Table这两个注解,但是其中@Entity注解已经废弃,所以本文只分析JPA下的注解
@GeneratorValue注解----JPA通用策略生成器
@GenericGenerator注解----自定义主键生成策略
@Id注释指定表的主键,它可以有多种生成方式: 1)TABLE:容器指定用底层的数据表确保唯一; 2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID); 3)IDENTITY:使用数据库的IDENTITY列莱保证唯一; 4)AUTO:由容器挑选一个合适的方式来保证唯一; 5)NONE:容器不负责主键的生成,由程序来完成。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(
name = "posts", uniqueConstraints = {@UniqueConstraint(columnNames = {"title"})}
)
public class Post {
@Id
@GeneratedValue(
strategy = GenerationType.IDENTITY
)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "description", nullable = false)
private String description;
@Column(name = "content", nullable = false)
private String content;
}
CREATE TABLE `posts` (
`id` bigint NOT NULL AUTO_INCREMENT,
`content` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UKmchce1gm7f6otpphxd6ixsdps` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
不同标准:jdbc是数据库的统一接口标准;jpa是orm框架的统一接口标准。 用法区别:jdbc更注重数据库,orm则更注重于java代码,但是实际上jpa实现的框架底层还是用jdbc去和数据库打交道。
Entity Entity(实体)包中的类和数据库中的表时一一对应关系,包括字段名称、数据类型。 Model 一般地,Model(模型)存的是实体(Entity)类的模型。为了给前端提供实际使用的数据,一般在Model会对某些字段等进行处理,如表里存的性别字段,gender,保存的是f/m,但是提供给前端的时候需要把f/m替换成女/男。还可以添加新的字段,如把省province、市city、区district、地址address合并成新的字段detailed_address:省+市+区+地址。 Domain Domain(领域)一般是多个Model的组合,如查看一个订单详情,除了订单编码、商品名称等订单相关的信息,可能还需要把用户信息、发货地址、支付信息等展示出来,这时就可以按Domain返回数据。 Repository Repository(仓库)主要是针对数据进行操作,包括对不同类型数据库(如mysqsl、redis、mongodb等)中的数据进行整合。业务层应该直接和Repository打交道。
DAO DAO(DataAccessObject) 数据访问层,直接操作数据库表,进行增删改查等操作。
Data Data(数据层),用于缓存数据写入和读取、配置参数数据的读取等。
Logic Logic(逻辑层)主要负责数据校验、业务流程处理等。
Service Service层主要负责业务模块的逻辑应用设计。作用如下:
封装通用的业务逻辑,操作。如一些数据的检验,可以通用处理。 与数据层的交互。 其他请求:如远程服务获取数据,如第三方api等。 Controller Controller(控制器)层主要处理外部请求,一般在此层调用Serice层的接口来控制业务流程,根据业务情况返回相关数据。
View View(视图层)与控制层结合比较紧密,一般地,View主要负责展示应用的前端页面。
Action 同Controller,Java中使用。
POJO 同Entity,Java中使用。
since extends other repository, no need to write annotation @Repository
Spring Boot 配置DataSource