學習ORM思想啟發(fā)
- 1 建立實體類與表中的關系
- 2 建立實體類中屬性和表中字段關系
學習ORM思想
2.1 orm思想
主要目的:操作實體類就相當于操作數據庫表
建立兩個映射關系:
實體類和表的映射關系
實體類中屬性和表中字段的映射關系
不再重點關注:sql語句
實現了ORM思想的框架:mybatis,hibernas'da'fte
hibernate
Hibernate是一個開放源代碼的對象關系映射框架杂曲,它對JDBC進行了非常輕量級的對象封裝,
它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句辐烂,
自動執(zhí)行棍现,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
2.2 hibernate框架介紹
Hibernate是一個開放源代碼的對象關系映射框架五慈,
它對JDBC進行了非常輕量級的對象封裝,
它將POJO與數據庫表建立映射關系主穗,是一個全自動的orm框架
2.3 JPA規(guī)范
jpa規(guī)范泻拦,實現jpa規(guī)范,內部是由接口和抽象類組成
附加 PA與hibernate的關系
JPA規(guī)范本質上就是一種ORM規(guī)范忽媒,注意不是ORM框架——因為JPA并未提供ORM實現争拐,它只是制訂了一些規(guī)范,提供了一些編程的API接口晦雨,但具體實現則由服務廠商來提供實現架曹。
JPA和Hibernate的關系就像JDBC和JDBC驅動的關系,JPA是規(guī)范闹瞧,Hibernate除了作為ORM框架之外绑雄,它也是一種JPA實現。JPA怎么取代Hibernate呢奥邮?JDBC規(guī)范可以驅動底層數據庫嗎万牺?答案是否定的,也就是說洽腺,如果使用JPA規(guī)范進行數據庫操作脚粟,底層需要hibernate作為其實現類完成數據持久化工作。
2.4 jpa的基本操作
2.2.1 創(chuàng)建客戶表 (客戶是一家公司)
cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
cust_name varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
cust_source varchar(32) DEFAULT NULL COMMENT '客戶信息來源',
cust_industry varchar(32) DEFAULT NULL COMMENT '客戶所屬行業(yè)',
cust_level varchar(32) DEFAULT NULL COMMENT '客戶級別',
cust_address varchar(128) DEFAULT NULL COMMENT '客戶聯系地址',
cust_phone varchar(64) DEFAULT NULL COMMENT '客戶聯系電話',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.2.2 環(huán)境搭建過程
1 創(chuàng)建maven工程 導入坐標
2 需要配置jpa核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--需要配置persistence-unit節(jié)點
持久化單元:
name:持久化單元名稱
transaction-type:事務管理的方式
JTA:分布式事務管理
RESOURCE_LOCAL:本地事務管理
-->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--jpa的實現方式 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!--可選配置:配置jpa實現方的配置信息-->
<properties>
<!-- 數據庫信息
用戶名蘸朋,javax.persistence.jdbc.user
密碼核无, javax.persistence.jdbc.password
驅動, javax.persistence.jdbc.driver
數據庫地址 javax.persistence.jdbc.url
-->
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///springssm"/>
<!--配置jpa實現方(hibernate)的配置信息
顯示sql : false|true
自動創(chuàng)建數據庫表 : hibernate.hbm2ddl.auto
create : 程序運行時創(chuàng)建數據庫表(如果有表藕坯,先刪除表再創(chuàng)建)
update :程序運行時創(chuàng)建表(如果有表团南,不會創(chuàng)建表)
none :不會創(chuàng)建表
-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
3 編寫客戶實體類
4 配置客戶實體類和表噪沙,類中屬性和表中字段映射關系
5 保存客戶信息
1.加載配置文件創(chuàng)建實體管理器工廠
Persisitence:靜態(tài)方法(根據持久化單元名稱創(chuàng)建實體管理器工廠)
createEntityMnagerFactory(持久化單元名稱)
作用:創(chuàng)建實體管理器工廠
2.根據實體管理器工廠,創(chuàng)建實體管理器
EntityManagerFactory :獲取EntityManager對象
方法:createEntityManager
* 內部維護的很多的內容
內部維護了數據庫信息已慢,
維護了緩存信息
維護了所有的實體管理器對象
再創(chuàng)建EntityManagerFactory的過程中會根據配置創(chuàng)建數據庫表
* EntityManagerFactory的創(chuàng)建過程比較浪費資源
特點:線程安全的對象
多個線程訪問同一個EntityManagerFactory不會有線程安全問題
* 如何解決EntityManagerFactory的創(chuàng)建過程浪費資源(耗時)的問題曲聂?
思路:創(chuàng)建一個公共的EntityManagerFactory的對象
* 靜態(tài)代碼塊的形式創(chuàng)建EntityManagerFactory
* 解決實體管理器工廠的浪費資源和耗時問題
* 通過靜態(tài)代碼塊的形式,當程序第一次訪問此工具類時佑惠,創(chuàng)建一個公共的實體管理器工廠對象
* 第一次訪問getEntityManager方法:經過靜態(tài)代碼塊創(chuàng)建一個factory對象朋腋,再調用方法創(chuàng)建一個EntityManager對象
* 第二次方法getEntityManager方法:直接通過一個已經創(chuàng)建好的factory對象,創(chuàng)建EntityManager對象
public class JpaUtils {
private static EntityManagerFactory factory;
static {
//1.加載配置文件膜楷,創(chuàng)建entityManagerFactory
factory = Persistence.createEntityManagerFactory("myJpa");
}
/**
* 獲取EntityManager對象
*/
public static EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
3.創(chuàng)建事務對象旭咽,開啟事務
EntityManager對象:實體類管理器
beginTransaction : 創(chuàng)建事務對象
presist : 保存
merge : 更新
remove : 刪除
find/getRefrence : 根據id查詢
Transaction 對象 : 事務
begin:開啟事務
commit:提交事務
rollback:回滾