1. 程式人生 > >JPA--java操作數據庫框架

JPA--java操作數據庫框架

5.4 true tlist pid mysqld tab word 一個數 style

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不會管理這個屬性)

[email protected]時間設置

年月日,時分秒

年月日

時分秒

JPA--java操作數據庫框架