JPA是JPAJPA開發效率高,運行效率低php
(2)JDBC開發效率低,運行效率高(更接近底層,代碼繁瑣)java
(3)JPA兼容各類數據庫(方便移植)mysql
(4)JPA有內置緩存(性能在必定程度上有所優化)sql
(5)JPA直接面向持久對象操做數據庫
(6)JPA不能干涉SQL的生成緩存
Object Relational Mapping, 對象關係映射安全
ORM 就是經過將Java對象映射到數據庫表,經過操做Java對象,就能夠完成對數據表的操做app
<?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>
/** * @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略 }
(1)獲取EntityManagerFactory實體化管理工廠對象(傳入持久化單元名)dom
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");
(2)經過EntityManagerFactory對象獲取實體管理對象
EntityManager entityManager = entityManagerFactory.createEntityManager();
(3)增刪改須要提交事務
// 執行CRUD
// 提交事務
entityManager.getTransaction().commit();分佈式
// 事物提交失敗,回滾 entityManager.getTransaction().rollback();
(4)關閉資源(實體管理對象)
// 關閉實體管理對象 entityManager.close();
// 執行新增操做
entityManager.persist(employee);
// 若是數據庫有數據
if (employee != null) {
// 執行刪除操做
entityManager.remove(employee);
}
// 執行查詢操做
return entityManager.find(Employee.class, id);
// 執行查詢操做 // 須要寫一個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();
employeeDao.update(employee);
// 執行修改操做
entityManager.merge(employee);
線程安全對象,重量級對象
一個應用程序對應一個EntityManagerFactory:一個數據庫(1:1:1)
(1)數據庫配置信息它裏面有一個鏈接池(自己就重,建立與銷燬太費時間)
(2)二級緩存(查詢緩存,...)
(3)預約義的JPQL語句(JPQL,SQL)
(3)全部實體及關係
(1)輕量級對象
(2)線程不安全
(3)提供CRUD
(4)內置一級緩存
一級緩存命中:同一個EntityManagerFactory,同一個EntityManager,同一個OID
// 在表中列名爲pid
private Long id;
大文本,能夠裝不少數據
臨時屬性(JPA不會管理這個屬性)
年月日,時分秒
年月日
時分秒