JPA全称为Java Persistence API ,Java持久化API是Sun公司在javaEE 5规范中提出的Java持久化接口。
JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,同样可以将数据库的结果集自动映射到实体类中。
JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个,应该说无人能出其右。
从功能上来说,JPA就是Hibernate功能的一个子集。
最根本的区别就是不需要我们再去书写原声SQL语句,通过对象来操作数据库,用极简的代码实现了对数据库的访问和操作,包括了增、删、改、查等在内的常用功能.
应为JPA属于持久层技术,此处使用mysql数据库进行演示,SpingBoot+JPA+MYSQL需要添加一下依赖
mysql
mysql-connector-java
runtime
com.alibaba
druid
1.0.29
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/hotel?serverTimezone=UTC
username: root
password: aaaaaa
jpa:
hibernate:
ddl-auto: update # 第一次建表create 后面用update,建完表之后,要改为update,要不然每次重启工程会删除表并新建。
show-sql: true #配置在日志中打印出执行的 SQL 语句信息。
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #在 SrpingBoot 2.0 版本中,Hibernate 创建数据表的时候,默认的数据库存储引擎选择的是 MyISAM (之前好像是 InnoDB,这点比较诡异)。这个参数是在建表的时候,将默认的存储引擎切换为 InnoDB 用的。
jpa.hibernate.ddl-auto:参数的作用主要用于:自动创建、一次性创建、更新、验证数据库表结构,有四个值。
create:每次加载 Hibernate 时都会删除上一次生成的表,然后根据 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载 Hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
update:最常用的属性,第一次加载 Hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),
以后加载 Hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。
要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。如果先创建的数据库表则直接写update就行,免得再次创建覆盖原先的
validate :每次加载 Hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
DROP TABLE IF EXISTS `style`;
CREATE TABLE `style` (
`id` int(100) NOT NULL AUTO_INCREMENT,
`style` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '风格',
`money` double(100, 0) DEFAULT NULL COMMENT '优惠前的单价',
`facilities` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '房间设施描述',
`image` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '封面图片',
`message` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '类型描述',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
@Entity
public class Style {
@Id
@GeneratedValue(strategy=IDENTITY)
private int id;
@Column(length = 32)
private String style;
private Double money;
private String facilities;
private String image;
private String message;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getFacilities() {
return facilities;
}
public void setFacilities(String facilities) {
this.facilities = facilities;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Style{" +
"id=" + id +
", style='" + style + '\'' +
", money='" + money + '\'' +
", facilities='" + facilities + '\'' +
", image='" + image + '\'' +
", message='" + message + '\'' +
'}';
}
}
@Entity(name=“EntityName”) 必须,用来标注一个数据库对应的实体,数据库中创建的表名默认和类名一致。
@Table(name="",catalog="",schema="") 可选,用来标注一个数据库对应的实体,数据库中创建的表名默认和类名一致。通常和 @Entity 配合使用,只能标注在实体的 class 定义处,表示实体对应的数据库表的信息。
@Id 必须,@Id 定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键。
@GeneratedValue(strategy=GenerationType,generator="") 可选,strategy: 表示主键生成策略,有 AUTO、INDENTITY、SEQUENCE 和 TABLE 4 种,generator: 表示主键生成器的名称。
AUTO主键由程序控制, 是默认选项 ,不设置就是这个
IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
@Column(name = “user_code”, nullable = false, length=32) 可选,@Column 描述了数据库表中该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具。name: 表示数据库表中该字段的名称,默认情形属性名称一致,不一致时可指定;nullable: 表示该字段是否允许为 null,默认为 true;unique: 表示该字段是否是唯一标识,默认为 false;length: 表示该字段的大小,仅对 String 类型的字段有效。
@Transient可选,@Transient 表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。
@Enumerated 可选,使用枚举的时候,我们希望数据库中存储的是枚举对应的 String 类型,而不是枚举的索引值,需要在属性上面添加 @Enumerated(EnumType.STRING) 注解。
数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问,其中包含了几本的单表查询的方法,
非常的方便。值得注意的是,这个Account 对象名,而不是具体的表名,另外Interger是主键的类型,一般为Integer或者Long
@Repository
public interface JpaStyleDao extends JpaRepository