SpringDataJpa(一) JPA概述
1.orm思想
ORM(Object-Relational Mapping) 对象关系映射
主要目的: 实体类与数据库表建立关联,操作实体类就相当于操作数据库,不再重点关注sql语句,使得java程序员可以用面向对象的思维随心所欲的操纵数据库
- 实体与数据库表的映射
- 实体类中属性与表中字段的映射关系
实现了ORM思想的框架: Hibernate, Mybatis…
2.JPA 概述
JPA(Java Persistence API) java 持久化API, 是SUN公司推出的基于ORM思想的规范,内部有一些列接口和抽象类,没有实现类是一套规范
- 市面上实现ORM思想的框架有很多,程序员要用哪个框架就要先学习框架的使用,太过麻烦,SUN公司为了统一,推出了JPA规范,Hibernate也是实现JPA规范的一个框架
JPA和Hibernate 的关系就像 JDBC 和JDBC 驱动的关系, JPA是接口,Hibernate是实现
3.JPA 入门CRUD
3_v1_搭建环境
- 创建maven工程,导入依赖
- 配置JPA 核心配置文件
- 创建实体类
- 配置实体类和表的映射
- 测试CRUD 操作
3_v2_创建maven工程,导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.hibernate.version>5.0.7.Final</project.hibernate.version>
</properties>
<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- hibernate对jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${project.hibernate.version}</version>
</dependency>
<!-- log日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Mysql and MariaDB -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies
3_v3_配置jpa核心配置文件
- 位置: 类路径下META-INF 文件夹下
- 命名: persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
persistence-unit: 持久化单元
name:持久化单元名称(自定义)
transaction-type:事务管理的方式
JTA: 分布式事务管理(表不在同一张数据库中)
RESOURCE_LOCAL: 本地事务管理
-->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--1.jpa 实现方式-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!--
2.数据库信息配置
驱动:javax.persistence.jdbc.driver
url: javax.persistence.jdbc.url
用户名:javax.persistence.jdbc.user
密码:javax.persistence.jdbc.password
characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
-->
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa?characterEncoding=utf8&useSSL=false&serverTimezone=UTC"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="123456"/>
<!--
3.可选配置,jpa实现方(本案例为hibernate)配置
打印sql语句: hibernate_show_sql true|false
自动建表:hibernate.hbm2ddl.auto
create: 程序运行时创建表(如果表存在,先删除表,再重新创建表)
update: 程序运行时创建表(如果表存在,不创建)
none: 不创建表
-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
3_v4 编写实体类以及建立与表的映射
数据库表结构
CREATE TABLE cst_customer (
cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
cust_name varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
cust_source varchar(32) DEFAULT NULL COMMENT '客户信息来源',
cust_industry varchar(32) DEFAULT NULL COMMENT '客户所属行业',
cust_level varchar(32) DEFAULT NULL COMMENT '客户级别',
cust_address varchar(128) DEFAULT NULL COMMENT '客户联系地址',
cust_phone varchar(64) DEFAULT NULL COMMENT '客户联系电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Customer 实体类
1.实体类与表的映射
- @Entity: 指定当前类是实体类。
- @Table:指定实体类和表之间的对应关系。
- name: 指定要关联的数据库表的名称
2.实体类中属性与表中字段的映射
- @Id: 指定当前字段是主键。
- @GeneratedValue: 指定主键的生成方式
- strategy: 生成策略
- GenerationType.IDENTITY: 自增
- 底层数据库必须支持自动增长 mysql
- GenerationType.SEQUENCE: 序列
- 底层数据库必须支持序列 oracle
- GenerationType.TABLE: jpa提供的一种机制,通过维护一张数据表的形式帮助我们完成主键自增
- GenerationType.AUTO: 由程序自动的帮助我们选择主键生成策略
- @Column: 指定实体类属性和数据库表字段之间的对应关系
- name: 指定数据库表的字段名称。
- unique: 是否唯一
- nullable: 是否可以为空
- inserttable: 是否可以插入
- updateable: 是否可以更新
- columnDefinition: 定义建表时创建此列的DDL
- secondaryTable: 从表名。
/**
* 1.实体类与表的映射
* @Entity: 声明实体类
* @Table: 配置实体类与表的映射关系
* name:表的名称
* 2. 实体类中属性与表字段的映射
*
*/
@Entity
@Table(name = "cst_customer")
public class Customer {
/**
* 配置主键映射
* @id: 声明该属性与表中的主键对应
* @GeneratedValue: 主键生成策略
* @Column: 与表中的哪个字段对应
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cust_id")
private Long custId; //客户编号
@Column(name = "cust_name")
private String custName; //客户名称
@Column(name = "cust_source")
private String custSource; //客户来源
@Column(name = "custIndustry")
private String custIndustry; //客户所属行业
@Column(name = "cust_level")
private String custLevel; //客户级别
@Column(name = "cust_phone")
private String custPhone; //客户联系电话
@Column(name = "cust_address")
private String custAddress; //客户地址
}
3_v5 测试CRUD
jpa 操作步骤:
1.加载JPA核心配置文件,创建实体管理器工厂对象
2.通过实体管理器工厂,创建实体管理器
3.获取事务对象,开启事务
4.完成增删改查操作
5.提交事务(回滚事务)
6.关闭资源
save 操作测试
/**
* jpa 操作步骤:
* 1.加载JPA核心配置文件,创建实体管理器工厂对象
* 2.通过实体管理器工厂,创建实体管理器
* 3.获取事务对象,开启事务
* 4.完成增删改查操作
* 5.提交事务(回滚事务)
* 6.关闭资源
*/
public class JpaTest {
@Test
public void test_save(){
//1.通过jpa 持久化名称加载配置类,创建实体管理器工厂对象
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myJpa");
//2.通过实体管理器工厂创建实体管理器
EntityManager entityManager = entityManagerFactory.createEntityManager();
//3.获取事务对象,开启事务
EntityTransaction tx = entityManager.getTransaction(); //获取事务对象
tx.begin();//开启事务
//4.进行操作
Customer customer = new Customer();
customer.setCustName("haha");
customer.setCustAddress("北京");
//将对象数据保存到 数据库中
entityManager.persist(customer);
//5.提交事务
tx.commit();
//6.关闭资源
entityManager.close(); //先关闭管理器
entityManagerFactory.close(); //再关闭工厂
}
}