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不會管理這個屬性)
[email protected]時間設置
年月日,時分秒
年月日
時分秒
JPA--java操作數據庫框架