隨筆-124  評(píng)論-49  文章-56  trackbacks-0
          類擬框架: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(truetrue);
              }

          }
          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
          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          other

          文章

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 齐齐哈尔市| 唐海县| 临江市| 南宁市| 新源县| 赤壁市| 奈曼旗| 漳州市| 太谷县| 公主岭市| 台中县| 铁岭县| 杭州市| 南溪县| 留坝县| 米泉市| 石屏县| 拉萨市| 怀仁县| 额济纳旗| 高碑店市| 深水埗区| 岐山县| 岳阳县| 三门县| 山阴县| 舞钢市| 巨鹿县| 南丹县| 永安市| 马龙县| 射阳县| 泌阳县| 曲水县| 和平区| 长乐市| 柳江县| 浦北县| 黄石市| 博罗县| 陆丰市|