<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊(cè)

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825447
    • 排名 - 49

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    Hibernate

    .關(guān)系映射

    1.單表映射:a. public class User { private Integer id;   
    private String name; get/set}



    b.xml: <class name="User" table="user">

     <id name="id" column="id" type="integer">//配置主鍵的生成方式

    <generator class="identity"></generator>    </id>

            <property name="name" column="name" type="string"></property> </class>



    c. hibernate.cfg.xml
    配置相應(yīng)數(shù)據(jù)庫和映射, show_sql=true;使consolesql語句可見

     


    d.
    采取junit進(jìn)行測(cè)試:一般通過junitsetUp方法初始化,通過tearDown釋放資源,自動(dòng)加載


    public class Client extends TestCase { protected Session session;

        public Client(String name) {        super(name);    }

        protected void setUp() throws Exception {

    Configuration config=new Configuration().configure();//創(chuàng)建Hibernate配置管理類,默認(rèn)加載cfg.xml,若改名則用configure(new File(“src/hib.cfg.xml”));加上路徑

    SessionFactory sessionFactory =config.buildSessionFactory();

    session= sessionFactory.openSession(); } //applicationHibernate交互接口

       


    protected void tearDown() throws Exception {if(session!=null) session.close();}

        public void testCreate(){User user=new User();user.setName("hello");//自動(dòng)加載

        Transaction tr=null;//改變數(shù)據(jù)庫數(shù)據(jù)的操作都要開啟一個(gè)事物

        try{    tr=session.beginTransaction(); session.save(user); tr.commit();    }

    catch(HibernateException e) {       //將自由狀態(tài)變成持久狀態(tài)

    e.printStackTrace();   }    if(tr!=null) tr.rollback(); }

        public void testRetrieve(){

            User user=(User)session.get(User.class, 122);//得到xml中的主鍵對(duì)應(yīng)的對(duì)象

            assertEquals("hello", user.getName());}//使用斷言精確判斷,防止空格等因素



    public static Test suite(){ //junit
    的靜態(tài)測(cè)試方法

            TestSuite ts=new TestSuite();     Client cl=new Client("testCreate");

            ts.addTest(cl);     return ts; } }

    e.sessionloadget方法的區(qū)別:1.對(duì)象存在時(shí),load返回實(shí)體代理類類型,get返回實(shí)體類

                                    2.對(duì)象不存在時(shí):load拋出異常,get返回null(用于判斷)

     



    f.
    實(shí)體對(duì)象的生命周期

     1Transient自由狀態(tài):與Hibernate和數(shù)據(jù)庫沒有任何關(guān)系

     2Persistent持久狀態(tài):納入了HibernateSession實(shí)體對(duì)象管理的容器,session會(huì)復(fù)制實(shí)體對(duì)象的引用進(jìn)行臟數(shù)據(jù)檢查,實(shí)體對(duì)象任何狀態(tài)的改變最終都會(huì)同步到數(shù)據(jù)庫。例如:Transaction trx=null;

        trx=session.beginTransaction(); User user=(User)session.load(User.class, 1);

        user.setName("nihao");      trx.commit();

    // session.update(user);就不需要了

     3Detached游離狀態(tài):(session.close()),Hibernate和數(shù)據(jù)庫沒有任何關(guān)系,但是實(shí)體對(duì)象對(duì)應(yīng)數(shù)據(jù)庫的一條紀(jì)錄。如:trx=session.beginTransaction();

    User user=new User();   user.setId(61);只要一個(gè)主鍵與數(shù)據(jù)庫唯一標(biāo)識(shí)

         session.delete(user);//進(jìn)行臟數(shù)據(jù)檢查 trx.commit(); //真正執(zhí)行



    2
    Generator的主鍵產(chǎn)生方式:

       a. <generator class="assigned"></generator>由應(yīng)用邏輯產(chǎn)生:***.setId(number);

       b.hilo:通過hi/lo(hign/low)算法產(chǎn)生

       c.seqhilo:適合oracle沒有自動(dòng)增長只有序列,主鍵歷史狀態(tài)保存在sequence

       d.increment:按照數(shù)值順序增長,Hibernate維護(hù),效率很高

       e.identity:采用數(shù)據(jù)庫提供的主鍵生成機(jī)制,并發(fā)性不好

       f.sequence:支持oracle這種數(shù)據(jù)庫

       g.native:根據(jù)數(shù)據(jù)庫適配器自動(dòng)采用identity,hilo,sequence中的一種

       h.uuid:Hibernate基于128位唯一算法生成32位字符串作為主鍵,適合所有數(shù)據(jù)庫,并發(fā)好

       i:foreign:使用外部表的字段作為主鍵





    3.
    一對(duì)一通過主鍵關(guān)聯(lián)(one to one)(數(shù)據(jù)庫中將兩個(gè)表id為主鍵并建立外聯(lián),只一表自動(dòng)增長)

     a. public class User1 {   private Integer id; private String name;

         private Passport passport; ...getter/setter} //passport最為成員屬性

     b. public class Passport { private Integer id; private String serial;

        private User1 user; ...getter/setter}   //user作為成員屬性

     c. <hibernate-mapping package="OneToOne"> <class name="User1" table="user1">

        <id name="id" column="id" type="integer"> <generator class="identity"/></id>

         <property name="name" column="name"></property>   // type可以省略,Hib匹配

         <one-to-one name="passport" cascade="all" fetch="join"></one-to-one> </class>

    </hibernate-mapping>//cascade主控方設(shè)置級(jí)聯(lián)同步更新,delete,sava-update,none

     d. <hibernate-mapping package="OneToOne"> <class name="Passport" table="passport">

        <id name="id" column="id"> <generator class="foreign"> //主鍵有外表產(chǎn)生

          <param name="property">user</param> </generator> </id>  //值來自user成員屬性

     <property name="serial" column="serial"></property>

     <one-to-one name="user" class=”更好> </one-to-one></class> </hibernate-mapping>

     e.要想實(shí)現(xiàn)級(jí)聯(lián)操作,要讓級(jí)聯(lián)雙發(fā)都知道對(duì)方的存在:

    passport.setUser(user);    user.setPassport(passport);

    tr=session.beginTransaction();session.save(user); tr.commit();//才會(huì)起作用

     



    4.
    通過外鍵關(guān)聯(lián):many to one(環(huán)境:很多個(gè)人在一個(gè)組中且fk:user.group_id-àgroup.id)

     a. public class Group {  private Integer id; private String name; }

    b. public class User2 { private Integer id;   private String name;

    private Group group; ...getter/setter;}

     c. <hibernate-mapping package="ManyToOne">

       <class name="Group" table="group">   <id name="id" column="id">

        <generator class="identity"></generator>   </id>

       <property name="name" column="name"></property> </class> </hibernate-mapping>

    d. <hibernate-mapping package="ManyToOne"> <class name="User2" table="user2">

     <id name="id" column="id">     <generator class="identity"/>   </id>

       <property name="name" column="name"></property>

     <many-to-one name="group" column="group_id" fetch="join"></many-to-one>

     </class> </hibernate-mapping> //關(guān)系由many端進(jìn)行維護(hù)

     e.關(guān)聯(lián)雙方:Group group=new Group();    group.setId(1); User2 user=new User2(); user.setName("hello");    user.setGroup(group);   //session.save()才行



    5.ont to many:(
    環(huán)境:一個(gè)人有多個(gè)地址,fk:address.user_idàuser.id)

     a. public class MyUser { private Integer id; private String name;

      private Set<Address> addresses; } //對(duì)應(yīng)多個(gè)值采用集合形式

     b. public class Address { private Integer id;  private String address;

    private MyUser user; }

     c. <hibernate-mapping package="ManyToOne"> <class name="MyUser" table="myuser">

        <id name="id" column="id"> <generator class="identity"/>    </id>

           <property name="name" column="name"></property>

       <set name="addresses" cascade="all" inverse="true" order-by="address asc" fetch="join">  <key column="user_id"></key> //必須通過外表的外鍵建立的關(guān)聯(lián)

          Inverse=”true”進(jìn)行反轉(zhuǎn),many端來維護(hù)關(guān)聯(lián)

    <one-to-many class="Address"/> </set> </class> </hibernate-mapping>

     d. <hibernate-mapping package="ManyToOne"> <class name="Address" table="address">

          <id name="id" column="id">   <generator class="identity"/> </id>

         <property name="address" column="address"></property>

       <many-to-one name="user" column="user_id"></many-to-one> </class> </hibernate-mapping>

     e.使用時(shí)要設(shè)置關(guān)聯(lián):MyUser user=new MyUser();user.setName(“hello”);

       Set<Address> addresses=new HashSet<Address>();

       Address add1=new Address();add1.setZipcode(“241000”);

       add1.setUser(user); addresses.add(add1); user.setAddresses(addresses);

     




    .HQL:特點(diǎn):語法類似sql,使用面向?qū)ο蟮姆庋b,直接返回對(duì)象或?qū)ο髷?shù)組

    1.查詢整個(gè)實(shí)體對(duì)象(不加select)

    String hql="from com.mypack.User4"; Query query=session.createQuery(hql);

         List lists=query.list();   for(int i=0;i< lists.size();i++){

    User4 user=(User4)lists.get(i);   System.out.println(user.getId());   }

    或者: for(Iterator iter=users.iterator();iter.hasNext();){

        User4 user=(User4)iter.next(); }




    2.
    查詢單個(gè)屬性(返回單個(gè)屬性類型): hql="select u.name from User4 u";

           query=session.createQuery(hql);   List names=query.list();//執(zhí)行查詢

           for(int i=0;i<names.size();i++){   String name=(String)names.get(i);    }



    3.1
    查詢多個(gè)屬性返回對(duì)象數(shù)組的集合: hql="select u.name,u.age from User4 u";

           query=session.createQuery(hql);    List names=query.list();//一步步轉(zhuǎn)型

           for(int i=0;i<names.size();i++){   Object[ ] object=(Object[])names.get(i);

               String name=(String)object[0];        Integer age=(Integer)object[1];



    3.2
    也可以將多個(gè)屬性用單個(gè)屬性替代: hql="select new User4(u.name,u.age) from User4 u";

           query=session.createQuery(hql);   List names=query.list();

           for(int i=0;i<names.size();i++){   User4 user=(User4)names.get(i); }

       :需要在User4中添加User4(name,age)構(gòu)造函數(shù),同時(shí)添加無參構(gòu)造函數(shù)防止影響其他代碼



    4.
    聚合函數(shù)也可以使用: hql="select count(*) from User4 u";

           query=session.createQuery(hql);   int count=(Integer)query.list().get(0);

           System.out.println(count);

     當(dāng)確定只有唯一的一個(gè)結(jié)果: int count=(Integer)query.uniqueResult(); 代替



    5.
    更新(需要加上Transaction): Transaction tr=session.beginTransaction();

                                 hql="update User4 u set u.name='liming'";

         query=session.createQuery(hql);    query.executeUpdate();  tr.commit();




    6.
    刪除操作: Transaction tr2=session.beginTransaction();

                hql="delete from User4 u where u.id=81";

                query=session.createQuery(hql);   query.executeUpdate(); tr2.commit();



    7.1.?
    查詢綁定: hql="from User4 u where u.name=?";

    query=session.createQuery(hql); query.setString(0, "lm"); List user= query.list();




    7.2.
    引用占位符:查詢綁定: hql="from User4 u where u.name=:name and u.id=:id";

         query=session.createQuery(hql);

         query.setInteger("id", 84);    query.setParameter("name", "lm");推薦使用

         List user1= query.list(); assertEquals(8, user1.size());



    8.
    分頁查詢功能: hql="from User4 u order by u.id"; query=session.createQuery(hql);

    query.setFirstResult(2);從零計(jì)數(shù) query.setMaxResults(10);//十分方便數(shù)據(jù)庫的移植

         List userlist=query.list();    for(int i=0;i<userlist.size();i++){

         User4 name=(User4)userlist.get(i); System.out.println(name.getId()); }



    9.
    同樣支持原生SQL語句: String sql="select id ,name, age from t_user4";

         Query sqlQuery=session.createSQLQuery(sql);

         List result =sqlQuery.list(); for(Iterator it=result.iterator();it.hasNext();){

             Object[] obj=(Object[])it.next();  Integer id=(Integer)obj[0];

             String name=(String)obj[1];        Integer age=(Integer)obj[2]; }

     利用得到的數(shù)據(jù): List<User4> users=new ArrayList();

                     User4 user4=new User4(); user4.setId(id); users.add(user4);



    posted on 2007-08-20 20:28 Ke 閱讀(778) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 免费在线观看视频网站| 好男人看视频免费2019中文| 成人毛片免费观看视频| 久久伊人亚洲AV无码网站| 亚洲日本国产乱码va在线观看| 蜜臀亚洲AV无码精品国产午夜.| a毛片免费在线观看| 免费观看的av毛片的网站| 国产亚洲精品美女久久久 | 久久久久亚洲AV片无码下载蜜桃| 亚洲久热无码av中文字幕| 可以免费观看的国产视频| 全免费a级毛片免费看无码| 久久精品国产亚洲av麻豆| 国产精品无码亚洲精品2021 | 国产精品免费一区二区三区四区| 免费看无码自慰一区二区| 亚洲国产二区三区久久| 男男gay做爽爽的视频免费| 18级成人毛片免费观看| 国产精品亚洲精品日韩已方| 亚洲综合一区国产精品| 久久国产精品免费网站| 亚洲A∨精品一区二区三区| 亚洲最大的黄色网| 日本免费久久久久久久网站| 国产性生交xxxxx免费| 亚洲国产成人久久三区| 99视频在线观看免费| 国产一级高清免费观看| 亚洲国产视频网站| 成全在线观看免费观看大全| 免费一级毛片在线播放| 亚洲色成人WWW永久在线观看 | 女人被免费视频网站| 久久久久亚洲av无码专区| a级毛片免费在线观看| 亚洲精品tv久久久久久久久久| 亚洲人成色777777老人头| 亚洲一级毛片免费观看| 亚洲Aⅴ无码专区在线观看q|