1. JPA入门
1.1 什么是JPA
JPA是对象关系映射(ORM) 规范
它是做持久层,操作数据库的
1.2 为什么需要JPA
- 使用JDBC,在对象和数据库数据之间转换比较麻烦
- 它可以以面向对象的思想来操作数据库数据
1.3 JPA和Hibernate的关系
- Hibernate是一个开源的对象关系映射框架(轻量级)
- JPA是对象关系映射规范
- JPA是持久化规范,而Hibernate是其实现
1.4 JPA和JDBC的优缺点
JDBC优点:
操作数据库最底层,性能最高(但必须是数据库大神)
JDBC缺点:
(1)转换的时候特别麻烦,对象需要进行封装和取值,重复性代码多
(2)移植数据库比较麻烦
(3)自身没有缓存,如果性能上面需要控制,就需要写缓存代码
(4)不是面向对象的思想来操作
JPA优点:
(1)面向对象的思想来操作
(2) 移植数据比较方便
(3)有缓存
JPA缺点:
(1)不能干预sql的生成
(2)有些优化 jpa做不了,不适合处理特别大数据量的数据
(3)如果一个项目里面,对sql要求比较高,就不适合jpa
(4)JPA一般适用于中小型项目
2. JPA的使用
2.1 导入Jar包
<dependencies>
<!-- hibernate的包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- hibernate对于jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- junit的测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>pss</finalName>
<plugins>
<plugin>
<!-- Maven的编译插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2.2 核心配置文件persistence.xml
需要放在src/main/resources/META-INF中
配置中修改连接数据库属性,以及persistence-unit name属性等
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="com.cctv.jpa" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 必须配置4个连接数据库属性 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="admin" />
<!-- 必须配置1个方言属性 -->
<!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!-- 可选配置 -->
<!-- 是否自动生成表 -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- 是否显示sql -->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化sql -->
<!-- <property name="hibernate.format_sql" value="true" /> -->
</properties>
</persistence-unit>
</persistence>
2.3 使用JPA完成CRUD
步骤:
- 生成实体管理工厂
- 获取EntityManager对象
- 获取事务,开启事务
- CRUD
新增 persist() 修改 merge() 删除remove() 查询 find() 查询所有 使用jpql语句 - 提交事务
- 关闭资源
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("配置文件中设置的persistence-unit name属性");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 添加
entityManager.persist(user);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
2.4 建表策略
- create-drop:先删除表,再建表,再删除表
- create:先删除表,再建表
- update:如果没表就创建表,如果存在,就不会创建,
如果表里面已经有这个属性,再修改属性的长度,不会更新到表里面,需要更新这个列先删除表或者删除这个属性对应的列名
如果表里面没有属性,映射信息存在,会增加这个列 - validate 验证策略:当前实体配置和数据库的配置进行对比验证
如果有对应实体,但是没有对应的数据库表 报错
如果数据库多字段,验证通过
如果数据库少字段,验证不通过
3. 核心API简介
3.1 EntityManagerFactory
EntityManagerFactory中应保存了对应的persistence unit中的数据库配置信息和所有实体及关系以及预定义的JPQL语句。同时,EntityManagerFactory还负责维护二级缓存。
EntityManagerFactory对象的创建会有较大的开销,而且EntityManagerFactory对象采取了线程安全的设计方式,因此在实际中EntityManagerFactory对象可以尽量的共享,
在大多数情况下,一个应用中针对一个持久化单元可以共享一个EntityManagerFactory实例。
一个应用程序对应一个EntityManagerFactory对应一个数据库
3.2 EntityManager
- EntityManager对象:轻量级的对象
- 创建与销毁不怎么费性能(可以随时创建与销毁)
- 提供了相应的CRUD(线程不安全)
- 一个EntityManager对象只可以由一个线程使用
- 一个请求,一个响应
- 它里面还装了一个一级缓存
3.3 EntityTransaction
- javax.persistence.EntityTransaction
只能控制相同一个数据库不同表的事务管理,大多数情况都使用这种 - javax.transaction.Transaction JTA事务
处理不同数据库不同表的事务管理