SSH框架學習之Hibernate day01
阿新 • • 發佈:2019-01-27
什麼是SSH、SSM
SSH: Struts2 做控制器, spring管理各層的元件,hibernate負責持久化層
SSM: SpringMVC做控制器,Spring管理各層元件,Mybatis做持久化層
一、認識Hibernate
1.1什麼是ORM
Object Relation Mapping 物件關係對映。 在JDBC中,是通過手工完成的,例如查操作,查一些資料,儲存為一個JavaBean。(實體類)
Hibernate的出現就是減少了ORM操作,其他框架還有TOPLink、OJB框架
1.2 SSH實現ORM的兩大原則
- 實體類和表一一對應
- 不需要直接操作表,操作實體類
二、配置檔案
2.1 建立實體,讓實體間互相表示
公司類中,由於有多個聯絡人,因此用set表示
聯絡人類中,僅對應一個公司,因此用物件表示
2.2、建立對映配置檔案
目的是配置表和實體對應,實體屬性和表字段對應。hibernate無需自己建立表,會自動生成
1、名稱和位置無所謂
2、對映配置檔案中,標籤name屬性寫實體類相關內容
(1)class標籤name屬性值是實體類的全路徑(包名+類名)
(2)id標籤和property標籤name屬性值,體現實體屬性和表字段一一對應
3、id和property中,對應的colum可以省略,預設等於name
注意:建立的xml第一步是引入約束
實體:公司的配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 1、class標籤 配置實體類和表對應 name 實體類 table 表 --> <class name="com.lin.entity.Company" table="t_company"> <!-- 2 id標籤 配置實體類id 和 表id 一一對應 要求指定唯一的實體主鍵,表主鍵 - <!-- id 標籤--> <id name="cid" column="cid"> <!-- 設定欄位在表裡的增長策略 例如主鍵 native --> <generator class="native"></generator> </id> <property name="name" column="name"></property> <!--配置一對多,先指明name=""在Class中的成員--> <set name="setLinkMan"> <!--指明外來鍵--> <key column="cid"></key> <!--指明多的路徑--> <one-to-many class="com.lin.entity.LinkMan"/> </set> </class> </hibernate-mapping>
實體:聯絡人的配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 1、class標籤 配置實體類和表對應 name 實體類 table 表 --> <class name="com.lin.entity.LinkMan" table="t_linkman"> <!-- 2 id標籤 配置實體類id 和 表id 一一對應 要求指定唯一的實體主鍵,表主鍵 --> <!-- id 標籤--> <id name="lid" column="lid"> <!-- 設定欄位在表裡的增長策略 例如主鍵 native --> <generator class="native"></generator> </id> <property name="name" column="name"></property> <property name="phone" column="phone"></property> <!--配置多對一中的一--> <many-to-one name="company" class="com.lin.entity.Company" column="cid"></many-to-one> </class> </hibernate-mapping>
2.3、引入hibernate.cfg.xml 核心配置檔案
hibnernate只會載入核心配置檔案,其他檔案不會載入
必須在src下
必須叫這個名字
具體配置分三步:
- 配置資料庫資訊
- 配置hibernate資訊(這裡大有學問,可以通過配置豐富資料庫)
- 把對映加到這裡面來
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--第一部分:配置資料庫資訊,必須的-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///my_db</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--第二部分: 配置hibernate資訊, 可選-->
<!--
hibernate會自動建立表,需要配置這行
update: 如果有 則更新 沒有就建立
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
識別不同資料庫語言的方言。也就是特有的語句
例如: mysql分頁 limit, oracle rownum
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--輸出底層sql語句-->
<property name="hibernate.show_sql">true</property>
<!--格式化輸出sql語句-->
<property name="hibernate.format_sql">true</property>
<!--第三部分:把對映檔案引入配置檔案,必須的-->
<mapping resource="com/lin/entity/LinkMan.hbm.xml"/>
<mapping resource="com/lin/entity/Company.hbm.xml"/>
</session-factory>
</hibernate-configuration>
三、程式碼實現
第一步:封裝一個Utils類HibernateUtils
作用是載入配置,載入完成,表也已經建立完成
package com.lin.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
// 靜態程式碼快,保證一個專案只執行一次工廠建立
static {
// 載入核心配置檔案
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
第二步:測試程式碼實現,這裡對資料庫進行插入操作
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
// 得到工廠
sessionFactory = HibernateUtils.getSessionFactory();
// 得到session
session = sessionFactory.openSession();
// 開啟事務
tx = session.beginTransaction();
// 執行事務,新增操作
User user = new User();
user.setUsername("James");
user.setPassword("root");
user.setAddress("China");
session.save(user);
// 提交事務
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
複習時間:
事務的四個特性
- 原子性:一組操作,要麼都成功,要麼都失敗
- 一致性:操作之前之後,總量不能改變
- 隔離性:多個事務操作一個記錄,不會互相影響
- 永續性:commit提交後必須永久儲存在磁碟中