類擬框架:Apache OJB,JDO,Toplink,EJB(CMP)JPA,IBatis
適合查詢及單個(gè)對(duì)象的編輯,適合于對(duì)象之間有清晰的關(guān)系,不適用于批量修改,關(guān)系復(fù)雜的對(duì)象及特定的sql功能
第一個(gè)項(xiàng)目
1 新建java項(xiàng)目
2 創(chuàng)建User Library,加入如下jar
* hibernate_home/hibernate3.jar
* hibernate_home/lib/*.jar
* MySql jdbc驗(yàn)動(dòng)
3 創(chuàng)建hibernate配置文件hibernate.cfg.xml,為了便于調(diào)試最好加入log4j配置文件
<hibernate-configuration>
<session-factory >
<!-- 連接串 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate1</property>
<!-- 驅(qū)動(dòng)類 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 用戶名 -->
<property name="hibernate.connection.username">root</property>
<!-- 密碼 -->
<property name="hibernate.connection.password">root</property>
<!-- 適配器(反譯) -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<!-- 顯示sql語(yǔ)句 -->
<property name="hibernate.show_sql">true</property>
<!-- 可以防表被重新建立 -->
<property name="hibernate.hbm2ddl.auto">update</property>

<mapping resource="com/myobj/hibername/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4 定義實(shí)體類,繼承java.io.ser
5 定義User類的映射文件User.hbm.xml
<hibernate-mapping>
<class name="com.myobj.hibername.User" table="">
<id name="id">
<generator class="uuid"/>
<generator class="native"/>
<generator class="assigned"/>
</id>
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
6 將User.hbm.xml文件加入到hibernate.cfg.xml文件中
<session-factory >
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate1</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/myobj/hibername/User.hbm.xml"/>
</session-factory>
7 編寫hbm2ddl工具類,將實(shí)體類生成數(shù)據(jù)庫(kù)表,手工建數(shù)據(jù)庫(kù)

public class ExportDB
{

public static void main(String[] args)
{
//讀取hibernate.cfg.xml文件,默認(rèn)為.properties文件,
//讀取xml文件用new Configuration().configure()
Configuration cfg=new Configuration().configure();
//生成工具類
SchemaExport export=new SchemaExport(cfg);
//生成數(shù)據(jù)庫(kù)表
export.create(true, true);
}
}
8 開發(fā)客戶端Client類添加數(shù)據(jù)

public class Client
{


public static void main(String[] args)
{
//讀取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
//創(chuàng)建SessionFactory,與數(shù)據(jù)庫(kù)綁定,一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)SessionFactory,與二級(jí)緩存相關(guān),為重量級(jí)對(duì)象,是線程安全的
SessionFactory factory=cfg.buildSessionFactory();
//
Session session=null;//不同于connction,是對(duì)其的封裝,用時(shí)到連接池拿來(lái)conn

try
{
session = factory.openSession();
//開啟事務(wù)
session.beginTransaction();
User user = new User();
user.setName("張三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存數(shù)據(jù)
session.save(user);
//提交事務(wù)
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
//回滾事務(wù)
session.getTransaction().rollback();

}finally
{

if(session!=null)
{

if(session.isOpen())
{
//關(guān)閉session,是非線程安程的
session.close();
}
}
}
}
}
******session.update()相關(guān)類都改,session.merge()只改當(dāng)前類,session.delete(),都要開啟事務(wù)******
9 為了方便跟蹤SQL執(zhí)行,在hibernate.cfg.xml中加入
<property name="hibernate.show_sql">true</property>
持久化對(duì)象的狀態(tài)
1 瞬時(shí)對(duì)象:使用new操作符初始化的對(duì)象不是立刻就持久的。
2 持久化對(duì)象:持久實(shí)例是任何具有數(shù)據(jù)庫(kù)標(biāo)識(shí)的實(shí)便函。
3 離線對(duì)象:Session關(guān)閉后持久化對(duì)象就變?yōu)殡x線對(duì)名象。
持久化對(duì)象的生命周期:

Transient對(duì)象new但在數(shù)據(jù)庫(kù)中沒(méi)有記錄且沒(méi)有被Session管理,
Persistent對(duì)象數(shù)據(jù)庫(kù)中有記錄,并Session在管理。在清理緩存(或臟數(shù)據(jù)檢查)時(shí)與數(shù)據(jù)庫(kù)同步。Session與一級(jí)緩存綁定.
Detached對(duì)象數(shù)據(jù)庫(kù)中有記錄,Session沒(méi)有管理它。
創(chuàng)建HibernateUtils類,對(duì)重量級(jí)容量進(jìn)行優(yōu)化:

public class HibernateUtils
{
private static SessionFactory factory;
//static塊只執(zhí)行一次

static
{

try
{
Configuration cfg = new Configuration().configure();

} catch (Exception e)
{
e.printStackTrace();
}
}


public static SessionFactory getSessionFactory()
{
return factory;
}

public static Session getSession()
{
return factory.openSession();
}

public static void closeSession(Session session)
{

if(session!=null)
{

if(session.isOpen())
{
session.close();
}
}
}
}
Session接口的CRUD操作
瞬時(shí)/持久化/離線對(duì)象示例:

public class SessionTest extends TestCase
{

public void testSave1()
{
Session session=null;
Transaction tx=null;
User user=null;

try
{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//Transient狀態(tài),未被Session管理
user=new User();
user.setName("ssssss");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent狀態(tài),被Session管理,當(dāng)屬性發(fā)生改變的時(shí)候,hibernate會(huì)自動(dòng)和數(shù)據(jù)庫(kù)同步。
session.save(user);
user.setName("王五");
tx.commit();

}catch(Exception e)
{
e.printStackTrace();
tx.rollback();

}finally
{
HibernateUtils.closeSession(session);
}
//detached狀態(tài),被Session踢出緩存,未被管理
user.setName("張三");

try
{
session = HibernateUtils.getSession();
session.beginTransaction();
session.update(user);
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
}
Session接口
加載數(shù)據(jù)get與load的區(qū)別:
lazy代理:get沒(méi)有, load支持lazy;
查不存在數(shù)據(jù):get返回null,load拋出異常ObjectNotFoundException
//get查詢數(shù)據(jù)

public void testReadByGetMethod1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//采用get方式,馬上發(fā)出查詢sql,加載波User對(duì)象
User user=(User)session.get(User.class, "5c68c3ed206a327d01206a3281fa0001");
System.out.println(user.getName());
//persistent狀態(tài),當(dāng)屬性發(fā)生改變的時(shí)候,hibernate同自動(dòng)和數(shù)據(jù)庫(kù)同步。
user.setName("大龍");
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
//get查詢數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù)

public void testReadByGetMethod2()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//采用get加載User對(duì)象,如果數(shù)據(jù)庫(kù)中不存在數(shù)據(jù),返回null;
User user=(User)session.get(User.class, "5c68c");
System.out.println(user.getName());
//persistent狀態(tài),當(dāng)屬性發(fā)生改變的時(shí)候,hibernate同自動(dòng)和數(shù)據(jù)庫(kù)同步。
user.setName("大龍");
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
//load查詢數(shù)據(jù)

public void testReadByLoadMethod1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//采用load加載User對(duì)象,不會(huì)發(fā)出查詢sql,因?yàn)閘oad方法實(shí)現(xiàn)了lazy(懶加載或延遲加載)
//延遲加載:只有真正使用這個(gè)對(duì)象的時(shí)候,才加載(發(fā)出sql語(yǔ)句)
//hibernate延遲加載實(shí)現(xiàn)原理是代理方式,采用第三方組件添加User類的代理子類
User user=(User)session.load(User.class, "5c68c3ed206a327d01206a3281fa0001");//返回代理類
System.out.println(user.getName());
//persistent狀態(tài),當(dāng)屬性發(fā)生改變的時(shí)候,hibernate同自動(dòng)和數(shù)據(jù)庫(kù)同步。
user.setName("龍哥");
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
//load查詢數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù)

public void testReadByLoadMethod2()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//采用load加載User對(duì)象,如果數(shù)據(jù)庫(kù)中不存在數(shù)據(jù),
//拋出ObjectNotFoundException
User user=(User)session.load(User.class, "5c68c3e");//返回代理類
//如查不使用則沒(méi)有異常發(fā)生
System.out.println(user.getName());
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}

//手動(dòng)構(gòu)造detached狀態(tài)的對(duì)象
//一般修改時(shí)首加載再修改,不建議這樣作

public void testUpdate2()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//手動(dòng)構(gòu)造detached狀態(tài)的對(duì)象
User user=new User();
user.setId("5c68c3ed206a327d01206a3281fa0001");
user.setName("發(fā)哥");
session.update(user);
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
//刪除對(duì)象

public void testDelete1()
{
Session session=null;
User user=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
user=(User)session.load(User.class, "5c68c3ed206a327d01206a3281fa0001");//返回代理類
session.delete(user);
session.getTransaction().commit();

} catch (Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
//刪除扣user對(duì)象變?yōu)門ransient狀態(tài)
}
Query接口初步

public void testQuery()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//通過(guò)session對(duì)象得到query對(duì)象實(shí)例
Query query=session.createQuery("from User");
//分頁(yè)
query.setFirstResult(2);
query.setMaxResults(2);
//得到User的集合
List<User>userList=query.list();

for(int i=0;i<userList.size();i++)
{
System.out.println(userList.get(i).getId());
System.out.println(userList.get(i).getName());
}
session.getTransaction().commit();

} catch (HibernateException e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
posted on 2009-11-03 15:26
junly 閱讀(230)
評(píng)論(0) 編輯 收藏 所屬分類:
hibernate/orm