前言 Preface
本文的编写根据此视频参考:应该是非常好理解的JPA了
https://www.bilibili.com/video/BV1hE411s72B
小提示:【不想听概念直接上手从P8开始听】
什么是JPA?
全称 Java Persistence API,即Java持久化API,
是Sun公司推出的一套基于ORM的规范,内部是一系列的接口和抽象类
JPA通过JDK1.5注解描述ORM映射关系,将运行期的实体类对象持久化到数据库
JPA的特点:
EE标准:
JCP组织发布的JavaEE标准之一
因此任何声称符合JPA标准的框架都能遵循同样的架构,提供相同的访问API
这保证基于JPA开发的企业应用能够经过少量的修改就能在不同的JPA架构下运行
容器特性支持
JPA框架支持大数据集、事务、并发等容器及事务
使得JPA超越了简单持久化框架的局限,在企业级应用发挥更大的作用
简单方便
非侵入式原则设计,可以和其他框架集成使用
提供简单的编程模型,完全按照OOP思想开发
演示案例:
客户表:
CREATE TABLE `cst_customer` ( `cust_id` bigint 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 '客户联系地址', `cuts_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话', PRIMARY KEY (`cust_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Maven依赖坐标:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>5.4.15.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.4.15.Final</version> </dependency> </dependencies>
JPA核心配置文件
这个文件需要配置到类路径下的META-INF目录下
名称必须是这样的
persistence.xml
涨知识了,原来XML配置还提供了模板
复制模板就行了【哭了,再也不用百度去搜了】
编写配置信息
在JPA这里,被称为是一个持久化单元
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <!-- 持久化单元 name 持久化单元名称 transaction-type 事务管理的类型 JTA:分布式事务管理 【多表分布在多个库中,超过1个以上的连接访问】 RESOURCE_LOCAL:本地事务管理 【所有的表都在同一个数据库中,只有一个连接】 --> <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL"> <!-- JPA的实现方式 provider 供应商,也就是JPA规范的实现者 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <!-- 连接参数 --> <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa?serverTimezone=Asia/Shanghai"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="123456"/> <!-- 其他 【JPA实现者的配置】 hibernate 的主要两个配置 显示的输出SQL语句 自动实现数据库表的创建 creat、【如果DB存在了表,则删除重新创建】 update、【程序运行时创建表,有表则不创建】 none、【不做】 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
创建客户实体类:
public class entity { private Long custId; private String custName; private String custSource; private String custLevel; private String custIndustry; private String custPhone; private String custAddress; } // 省略toString & getter setter
类 & 表 的映射绑定
主键的映射绑定
其他无约束的字段
【话说这些注解的错误提示可以无视】
开始测试JPA
public class JpaTest { @Test public void test01Save(){ // 1、加载配置, 创建工厂对象 // 2、工厂生产实体管理者 // 3、管理者开启事务 // 4、完成业务逻辑 CRUD // 5、事务提交 或者 回滚 // 6、资源释放 } }
加载JPA配置
// 加载配置, 创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
这个配置的参数字符串就是我们在配置文件中的那个单元名称
工厂生产实体管理者的实例
// 工厂生产实体管理者 EntityManager myJpaEntityManager = myJpa.createEntityManager();
获取事务的实例,并开启
// 管理者开启事务 EntityTransaction transaction = myJpaEntityManager.getTransaction(); transaction.begin();
完成CRUD的逻辑
// 完成业务逻辑 CRUD Customer customer = new Customer(); customer.setCustName("BKY"); customer.setCustIndustry("传播智慧"); // 传入实体管理者 myJpaEntityManager.persist(customer);
事务的操作【因为是简单的演示,就不异常处理回滚了】
// 事务提交 或者 回滚 transaction.commit();
资源释放
// 资源释放 myJpaEntityManager.close(); myJpa.close();
测试结果
【在Hibernate这个SQL输出还可以再格式化排版一下的,其次是SQL方言的设置】
再看看我们的数据库