JPA基礎學習
1.什麼是JPA
JPA是一種ORM規範
ORM:物件(java)關係(資料庫)對映
JPA優缺點:開發效率高,資料庫相容,但是效能低。
2.Hibernate
Hibernate是一個開放原始碼的物件關係對映(ORM)框架。
優缺點:開發效率不高(只是相對而言,大神還是可以做到的很好),效能高,相容性強,有快取機制
3.使用JPA完成基礎的CRUD(增刪改查)
3.1導包
<!-- hibernate的包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.8.Final</version> </dependency> <!-- hibernate對於jpa的支援包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.3.8.Final</version> </dependency> <!-- mysql的驅動包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- junit的測試包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <finalName>pss</finalName> <plugins> <plugin> <!-- Maven的編譯外掛--> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
3.2Domain:使用註解建立表
@Entity//建表 @Table(name="xx")//給表一個名字 public class Product{ @Id//一個類必需要加主鍵 @GeneratedValue//自動給值 private Long id; public void setId(Long id){ this.id=id } public Long getId(){ return id; } }
3.3.程式碼完成
1.獲取EntityManager 物件
EntityManagerFactory f =Persistence.createEntityManagerFactory();
EntityManager eg = f.createEntityManager();
2.開啟事務(同生共死,要麼都成功,要麼都失敗)
entityManager.getTransaction().begin();
3.提交事務
entityManager.getTransaction().commit();
4.關閉事務
entityManager.close();
entityManagerFactory.close();
5.增刪改需要新增事務
save:persist();
edit:merge();
delect:先查在刪 remove()
查詢不要事務的:
queryOne:find()
queryAll: creatQuery() 然後 getResultList();
3.4.WEN-INF/persistence.xml
<property name="hibernate.<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
persistence-unit:持久化單元(一個數據庫對應一個持久化單元)
name="" :為持久化單取個名字
transaction-type:事務型別
RESOURCE_LOCAL:本地(資料庫自帶)
JTA:用於分散式系統
我要操作資料庫->最少配置基本屬性:driven,url,username,password
自帶連線池
-->
<persistence-unit name="cn.itsource.jap" transaction-type="RESOURCE_LOCAL">
<!--
properties:屬性配置
全部可以在: \hibernate-release-4.3.8.Final\project\etc\hibernate.properties
-->
<properties>
<!-- 操作資料庫的四個基本屬性 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<!-- 配置方言:根據不同資料庫的特性去生成SQL -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!--
建立表
ddl:建庫建表建約束
-->
hbm2ddl.auto" value="update" />
<!-- 顯示SQL -->
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
4.建表策略
create-drop -> 刪 - 建 -刪(儲存關閉EntityManagerFactory)
create -> 刪 -建
update -> 修改(如果沒有表會建立)【只增不減】
validate -> 驗證 【只驗證domain中有的資料】
5.四大物件
1.Persistence:
工具類,建立EntityManagerFactory(解析xml)
2.EntityManagerFactory:
重(連線池,sql,二級快取,domain關係等)
執行緒安全
一個應用程式對應一個EntityManagerFactory:一個數據庫 1:1:1
建立EntityManager
3.EntityManager:
輕(連線,一級快取)
執行緒不安全的
一個請求(執行緒)一個EntityManager
一級快取命中:同一個EntityManagerFactory,同一個EntityManager,同一個OID
OID:物件的全限定名#id的值
4.Transaction:
EntityManager拿到的事務是同一個:
3.提交事務
entityManager.getTransaction().commit();
4.關閉事務
entityManager.close();
entityManagerFactory.close();