JPA--java操作數據庫框架


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時間設置

年月日,時分秒

年月日

時分秒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM