1. 初識Hibernate
基本概念
-
ORM:(object relation mapping)
ORM示意圖1
ORM示意圖2 - 阻抗不匹配:對象和關系型數據庫不匹配
- 沒有侵入性:代碼中不用去繼承hibernate提供的借口
- Hibernate是一個ORM輕量級框架;解決持久化操作,使得程序員可以從便攜反復的JDBC工作中解放出來,專注于業(yè)務。提高程序員的開發(fā)效率。Hibernate是一個全功能ORM框架
- 移植性:方言HQL:hibernate query language。根據配置轉換成對應數據庫的sql。
配置文件:
- hibernate.cfg.xml:主配置文件,跟數據庫打交道,
- *.hbm.xml:和對象匹配
2. 入門demo
- hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- 配置數據庫連接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 數據庫方言 --><!-- hibernate4以上可以直接使用MySQL5Dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
</session-factory>
</hibernate-configuration>
- 建庫和pojo對象
public class User {
private Integer id;
private String name;
private String pwd;
}
- 編寫*.hbm.xml
<hibernate-mapping>
<class name="com.yxxy.pojo.User" table="user">
<id>
<!-- 主鍵生成策略 -->
<generator class="native"></generator>
</id>
<!-- 實體類的屬性 -->
<property name="name"></property>
<property name="pwd"></property>
</class>
</hibernate-mapping>
- 添加該hbm.xml到hibernate.cfg.xml中
<mapping resource="com/yxxy/pojo/User.hbm.xml"/>
- 測試功能
public class HibernateTest {
public static void main(String[] args) {
// 1、新建Configuration對象
Configuration cfg = new Configuration().configure();
// 2、通過Configuration對象創(chuàng)建SessionFactory
//在hibernate3.x中是這樣寫
//SessionFactory sf = cfg.buildSessionFactory();
// hibernate4.3
ServiceRegistry sr = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
SessionFactory sf = cfg.buildSessionFactory(sr);
// 3、通過SessionFactory得到Session
Session session = sf.openSession();
// 4、通過Session對象得到Transaction對象
Transaction tx = session.beginTransaction();
// 5、保存數據
User user = new User();
user.setName("張三");
user.setPwd("111");
session.save(user);
// 6、提交事務
tx.commit();
// 7、關閉session
session.close();
}
}
3. Hibernate詳解
- Configuration管理讀取配置文件
// 1、新建Configuration對象
Configuration cfg = new Configuration().configure();
// 讀取src下hibernate.properties,不推薦使用
//Configuration cfg1 = new Configuration();
// 默認讀取是src下的hibernate.cfg.xml
// 如果hibernate的核心配置文件不叫hibernate.cfg.xml
// Configuration cfg2 = new Configuration().configure("hb.cfg.xml");
// 可編程式,不需要配置文件
// cfg2.addProperties(extraProperties);
// cfg2.addResource(resourceName);
- SessionFactory對象
// 2、通過Configuration對象創(chuàng)建SessionFactory
//在hibernate3.x中是這樣寫
//SessionFactory sf = cfg.buildSessionFactory();
// hibernate4.3
ServiceRegistry sr = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
SessionFactory sf = cfg.buildSessionFactory(sr);
- Session對象
Hibernate對數據庫crud操作,主要使用session。Session可以理解為對Connection對象的一個包裝。Session是一個線程不安全的對象,生命周期非常短暫,一般和事務一一對應。使用完馬上關閉就是為了放置線程不安全問題。Session又成為hibernate的一級緩存。 - Transaction對象
事務管理對象,通過session來獲取該對象。
// 第一種
Transaction tx = session.beginTransaction();
// 第二種
Transaction getTx = session.getTransaction();
getTx.begin();
- 事務和異常處理
public class TestException {
public static void main(String[] args) {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction tx = null;
try {
// 1、新建Configuration對象
cfg = new Configuration().configure();
// 2、通過Configuration對象創(chuàng)建SessionFactory
ServiceRegistry sr = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
sf = cfg.buildSessionFactory(sr);
// 3、通過SessionFactory得到Session
session = sf.openSession();
// 4、通過Session對象得到Transaction對象
tx = session.beginTransaction();
// 5、操作數據
User u = (User) session.get(User.class, 2);
System.out.println(u);
// 6、提交事務
tx.commit();
} catch (Exception e) {
e.printStackTrace();
// 回滾事務
tx.rollback();
} finally {
// 7、關閉session
if(session != null && session.isOpen())
session.close();
}
}
}
- Query對象--后續(xù)再說
4. Hibernate log和配置文件詳解
-
log
確定要使用日志的實現——log4j
log4j的jar包
編寫log4j.properties
- hibernate.cfg.xml講解
<hibernate-configuration>
<session-factory>
<!-- 配置數據庫連接信息 -->
<!-- 數據庫驅動 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- hibernate可選項信息 -->
<!-- 數據庫方言 --><!-- hibernate4以上可以直接使用MySQL5Dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 是否打印sql語句 -->
<property name="show_sql">true</property>
<!-- 格式化sql語句 -->
<property name="format_sql">true</property>
<!--
數據庫更新方式
create:每次執(zhí)行都先把原有數據表刪除,然后創(chuàng)建該表
create-drop:關閉SessionFactory時,將刪除掉數據庫表
validate:檢測
update:如果表不存在則直接創(chuàng)建表,有就不用創(chuàng)建
-->
<property name="hbm2ddl.auto">update</property>
<!-- 映射文件信息 -->
<mapping resource="com/yxxy/pojo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- *.hbm.xml
<!--
package聲明pojo類所在的包,如果不寫那么在class中需要指明pojo類所在的包
-->
<hibernate-mapping package="com.yxxy.pojo">
<!--
class指一個pojo類
name表示pojo類名
table表示pojo類對應數據庫中的表名;如果不寫默認是類名
-->
<class name="User">
<!--
id表示實體類的標識
對應數據庫表中的主鍵
name指實體類的標識屬性名
column表示對應數據庫表的列名;如果不寫則數據庫中列名和屬性名一致
length表示數據庫表中對應數據類型的長度,如果不寫用默認值
type表示類型,如果不寫hibernate可以找到對應pojo類的屬性的類型
-->
<id name="id">
<!--
主鍵生成策略
uuid:UUID被編碼為一個32位16進制數字的字符串
native:根據底層數據庫的能力選擇identity、sequence、hilo中的一個去自增
assigned:自己指定主鍵
-->
<generator class="native"></generator>
</id>
<!--
實體類的屬性
name:指pojo類屬性名稱(區(qū)分大小寫)
column:兩種寫法效果一致
-->
<property name="name" column="name"></property>
<property name="pwd">
<column name="pwd"></column>
</property>
</class>
</hibernate-mapping>


