1.JPA
1.1.什么是JPA
JPA是JPAJPA開發效率高,運行效率低
(2)JDBC開發效率低,運行效率高(更接近底層,代碼繁瑣)
(3)JPA兼容各種數據庫(方便移植)
(4)JPA有內置緩存(性能在一定程度上有所優化)
(5)JPA直接面向持久對象操作
(6)JPA不能干涉SQL的生成
1.4.ORM概念
Object Relational Mapping, 對象關系映射
ORM 就是通過將Java對象映射到數據庫表,通過操作Java對象,就可以完成對數據表的操作
2.JPA程序搭建
2.1.創建一個普通Maven項目
2.2.在pom.xml中配置需要的jar包
2.3.引入persisten.xml文件
2.4.配置persisten.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <!-- 持久化單元,可以有多個 RESOURCE_LOCAL:本地的事物 JTA:分布式系統要使用的事物 --> <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <properties> <!--四個連接數據庫的屬性--> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3307/jpa"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="zy214214~"/> <!--方言屬性:要操作的數據庫,根據不同的方言拼接不同的SQL--> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <!--可選屬性--> <!--自動生成表 create-drop:刪 → 建 → 執行CRUD → 刪 create:刪 → 建 → 執行CRUD update:沒有表則建表 有表則在原來表的基礎上修改表結構(只加不減,不該類型) validate:驗證(只驗證domain中已有的數據) none:什么都不做 --> <property name="hibernate.hbm2ddl.auto" value="create"/> <!--是否在控制台顯示sql--> <property name="hibernate.show_sql" value="true"/> <!--格式化sql:sql在控制台顯示的格式--> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence>
2.5.domain配置
/** * @Entity 表示由一個jpa管理的持久對象,對應數據庫中的一張表 * @Table 設置表名 */ @Entity @Table(name = "t_employee") public class Employee { /** * @Id 表示主鍵 * @GeneratedValue 表示主鍵自動遞增 */ @Id @GeneratedValue private Long id; private String name; private String password; // getter/setter略 }
3.CRUD
3.1.基本操作流程
(1)獲取EntityManagerFactory實體化管理工廠對象(傳入持久化單元名)
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");
(2)通過EntityManagerFactory對象獲取實體管理對象
EntityManager entityManager = entityManagerFactory.createEntityManager();
(3)增刪改需要提交事務
// 執行CRUD
// 提交事務
entityManager.getTransaction().commit();
// 事物提交失敗,回滾 entityManager.getTransaction().rollback();
(4)關閉資源(實體管理對象)
// 關閉實體管理對象 entityManager.close();
3.2.新增
// 執行新增操作
entityManager.persist(employee);
3.3.刪除
// 如果數據庫有數據
if (employee != null) {
// 執行刪除操作
entityManager.remove(employee);
}
3.4.查找單條數據
// 執行查詢操作
return entityManager.find(Employee.class, id);
3.5.查找所有數據
// 執行查詢操作 // 需要寫一個jpql語句 // 簡寫1 // String jpql = "select o from Employee o"; // 簡寫2 // String jpql = "from Employee"; // (推薦寫法) String jpql = "select x from cn.meco.jpa.domain.Employee x"; // 獲取query對象 Query query = entityManager.createQuery(jpql); // 獲取List集合 return query.getResultList();
3.6.修改
employeeDao.update(employee);
// 執行修改操作
entityManager.merge(employee);
4.重要API
4.1.Persisten
- 解析相應的核心配置文件
- 創建EntityManagerFactory對象
4.2.EntityManagerFactory
線程安全對象,重量級對象
一個應用程序對應一個EntityManagerFactory:一個數據庫(1:1:1)
(1)數據庫配置信息它里面有一個連接池(本身就重,創建與銷毀太費時間)
(2)二級緩存(查詢緩存,...)
(3)預定義的JPQL語句(JPQL,SQL)
(3)所有實體及關系
4.3 EntityManager
(1)輕量級對象
(2)線程不安全
(3)提供CRUD
(4)內置一級緩存
一級緩存命中:同一個EntityManagerFactory,同一個EntityManager,同一個OID
4.4. EntityTransaction
- EntityManager只有這一個事務
- 如果多個系統/多個數據庫 使用JTA
5.映射細節
5.1 .@Column
// 在表中列名為pid
private Long id;
5.2.@Lob
大文本,可以裝很多數據
5.3.@Transient
臨時屬性(JPA不會管理這個屬性)
5.4.@Temporal時間設置
年月日,時分秒
年月日
時分秒