Hibernate的概述
是一個(gè)標(biāo)準(zhǔn)ORM框架
操作對(duì)象就相當(dāng)于操作表結(jié)構(gòu)
通過(guò)映射文件吧對(duì)象與表關(guān)聯(lián)到一起
對(duì)jdbc的一個(gè)封裝
優(yōu)點(diǎn):簡(jiǎn)化了jdbc的繁瑣代碼
對(duì)面向?qū)ο筇匦缘牧己弥С?/p>
缺點(diǎn):不支持動(dòng)態(tài)sql套硼,靈活性較低
不適合大規(guī)模的數(shù)據(jù)處理
Hibernate 開(kāi)發(fā)環(huán)境搭建
1.導(dǎo)入jar包 lib下required包下的所有jar包诅愚,還有l(wèi)og4j.jar及數(shù)據(jù)庫(kù)連接
project-etc下找約束
配置映射文件User.hbm.xml
a.列名子標(biāo)簽形式存在
b.列名可以不寫(xiě)缀磕,默認(rèn)和實(shí)體類(lèi)名字段一樣
c.type可以不寫(xiě)情龄,默認(rèn)和實(shí)體字段屬性一致
主鍵生成策略:native(根據(jù)本地?cái)?shù)據(jù)支持主鍵生成方式)
uuid(根據(jù)uuid算法生成一個(gè)32位16進(jìn)制的字符串,推薦使用徐紧,使用此算法悔耘,主鍵必須為字符串)
<?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>
<class name="com.hemi.bean.User" table="tb_user">
<id name="id" column="id">
<generator class="native"></generator></id>
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
主配置文件hibernate.cfg.xml
<?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:///bank</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<!-- 配置方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 選配 -->
<!-- 自動(dòng)生成表 -->
<property name="hbm2ddl.auto">update</property>
<!--顯示hibernate執(zhí)行的sql語(yǔ)句 -->
<property name="show_sql">true</property>
<!-- 格式化sql輸出 -->
<property name="format_sql">true</property>
<!-- 引入映射文件 -->
<mapping resource="com/hemi/bean/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
測(cè)試類(lèi)
Configuration con=new Configuration();
con.configure();//加載配置文件
SessionFactory factory = con.buildSessionFactory();//得到 SessionFactory對(duì)象
System.out.println(factory);
crud操作
a.得到工廠對(duì)象
b.打開(kāi)session
c.開(kāi)啟事物
d.crud操作
e.提交事務(wù)
f.關(guān)閉資源
快照機(jī)制
從數(shù)據(jù)庫(kù)查詢出的額數(shù)據(jù)會(huì)在緩存和快照區(qū)各一個(gè) 當(dāng)調(diào)用flush或者close方法刷新緩存暇矫,來(lái)和快照區(qū)數(shù)據(jù)比對(duì),有更新就推入數(shù)據(jù)庫(kù)
對(duì)象的三種狀態(tài)
a.瞬時(shí)態(tài) (1)new出來(lái)的颂鸿,不和 Session 實(shí)例關(guān)聯(lián)(2) 在數(shù)據(jù)庫(kù)中沒(méi)有和瞬時(shí)對(duì)象關(guān)聯(lián)的記錄
b.持久態(tài) 瞬時(shí)對(duì)象轉(zhuǎn)為持久對(duì)象:
(1) 通過(guò) Session 的 save() 和 saveOrUpdate() 方法把一個(gè)瞬時(shí)對(duì)象與數(shù)據(jù)庫(kù)相關(guān)聯(lián)促绵,這個(gè)瞬時(shí)對(duì)象就成為持久化對(duì)象。
(2) 使用get(),load() 待方法查詢到的數(shù)據(jù)對(duì)象嘴纺,將成為持久化對(duì)象败晴。
持久化對(duì)象的特點(diǎn):
(1) 和 Session 實(shí)例關(guān)聯(lián)
(2) 在數(shù)據(jù)庫(kù)中有和持久對(duì)象關(guān)聯(lián)的記錄
c.游離態(tài):數(shù)據(jù)庫(kù)有記錄,但是脫離了session,緩存中沒(méi)有
- 本質(zhì)上和瞬時(shí)對(duì)象相同
(2) 只是比瞬時(shí)對(duì)象多了一個(gè)數(shù)據(jù)庫(kù)記錄標(biāo)識(shí)值 id.
持久對(duì)象轉(zhuǎn)為游離對(duì)象:
當(dāng)執(zhí)行 close() 或 clear(),evict() 之后栽渴,持久對(duì)象會(huì)變?yōu)橛坞x對(duì)象尖坤。
瞬時(shí)對(duì)象轉(zhuǎn)為持久對(duì)象:
通過(guò) Session 的 update(),saveOrUpdate() 和 lock() 等方法,把游離對(duì)象變?yōu)槌志脤?duì)象熔萧。
要先查后改
修改方法:
1.update
2.saveOrUpdate
當(dāng)沒(méi)設(shè)置存入數(shù)據(jù)的主鍵時(shí)執(zhí)行save
設(shè)置了就執(zhí)行update糖驴,主鍵在數(shù)據(jù)庫(kù)找不到時(shí),就會(huì)報(bào)狀態(tài)異常
3.merge
當(dāng)沒(méi)有主鍵時(shí)佛致,執(zhí)行插入贮缕,當(dāng)有主鍵時(shí),先查詢俺榆,判斷是否存在感昼,存在就修改,不存在就執(zhí)行插入
瞬時(shí)態(tài)的數(shù)據(jù)被merge操作后變成游離態(tài)罐脊,返回的數(shù)據(jù)為持久態(tài)
查詢方法
Session session = HibernateUtil.getsession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setAge(208);
user.setName("ewjj");
User user2 = session.get(User.class, 5);
//一發(fā)送就執(zhí)行sql語(yǔ)句
User load = session.load(User.class, 1);
//使用結(jié)果時(shí)定嗓,才執(zhí)行sql語(yǔ)句,推薦
session.saveOrUpdate(user);
transaction.commit();
session.close();
Configuration con = new Configuration();
con.configure();// 加載配置文件
SessionFactory factory = con.buildSessionFactory();// 得到
// SessionFactory對(duì)象
System.out.println(factory);
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
try {
user.setAge(20);
user.setName("ew");
session.save(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
} finally {
session.close();
}
工具類(lèi)
private HibernateUtil() {
}
static SessionFactory factory;
static {
Configuration con = new Configuration();
factory = con.configure().buildSessionFactory();
}
public static Session getsession(){
return factory.openSession();
}
```