eagames  
          日歷
          <2005年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345
          統(tǒng)計(jì)
          • 隨筆 - 22
          • 文章 - 0
          • 評(píng)論 - 2
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(2)

          隨筆分類(lèi)

          隨筆檔案

          收藏夾

          test

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

          Hibernate 入門(mén)(1

          本文配置環(huán)境:
          JBuilder X
          jdk 1.4.2
          Mysql 4.0.11
          驅(qū)動(dòng):mm.mysql-2.0.4-bin.jar(org.gjt.mm.mysql.Driver)
          Hibernate 2.1

          解壓Hibernate

          打開(kāi)JB,新建工程,名為:hibernate
          加入Hibernate需要的包與MYSQL驅(qū)動(dòng)
          步驟:file->new project->name中輸入hibernate,directory選擇你要存放本工程的路徑->next

          ->required libraries->add->new->name
          中輸入你要設(shè)置的hibernate包名

          ->add->
          選擇你hibernate解壓到的目錄,選中該目錄下的hibernate2.jarlib目錄下的所有jar包,再把你的MYSQL驅(qū)動(dòng)包也加進(jìn)去

          然后一直按OKnext

          新建一個(gè)類(lèi),名為Hello_Bean.java,代碼如下:



          package hibernate;

          import java.io.Serializable;

          /**
          * @author geezer
          * QQ:9986986 MSN:geezer_hot@hotmail.com
          */

          public class Hello_Bean implements Serializable {

          private String name;//
          這里nameaddressid的名字可以自己定,不會(huì)有什么影響.getset方法不可以。因?yàn)槟堑酶鷶?shù)據(jù)庫(kù)與配置文件對(duì)應(yīng)。

          private String address;

          private int id;



          public Hello_Bean() {

          }

          public Hello_Bean(String name, String address) {//
          構(gòu)造函數(shù),看完本章以后相信你會(huì)明白的了
          this.name = name;
          this.address = address;
          }

          public String getName() {//
          此方法名必須與Hello_Bean.hbm.xml文件里的對(duì)應(yīng)的名字一樣,下面會(huì)詳細(xì)講
          return name;
          }

          public void setName(String name) {
          this.name = name;
          }

          public String getAddress() {
          return address;
          }

          public void setAddress(String address) {
          this.address = address;
          }

          public int getId() {//
          必須的方法
          return id;
          }

          public void setId(int id)//
          必須的方法
          {
          this.id = id;
          }


          }



          完成這一步以后編譯

          hibernate解壓后的目錄下的src文件夾里的hibernate.propertieslog4j.properties文件復(fù)制到你的工程目錄的classes目錄下

          (
          例如hibernate\classes\目錄下)

          打開(kāi)hibernate.properties文件,找到

          ## HypersonicSQL

          hibernate.dialect net.sf.hibernate.dialect.HSQLDialect
          hibernate.connection.driver_class org.hsqldb.jdbcDriver
          hibernate.connection.username sa
          hibernate.connection.password
          hibernate.connection.url jdbc:hsqldb:hsql://localhost
          hibernate.connection.url jdbc:hsqldb:test
          hibernate.connection.url jdbc:hsqldb:.

          改為

          ## HypersonicSQL

          #hibernate.dialect net.sf.hibernate.dialect.HSQLDialect
          #hibernate.connection.driver_class org.hsqldb.jdbcDriver
          #hibernate.connection.username sa
          #hibernate.connection.password
          #hibernate.connection.url jdbc:hsqldb:hsql://localhost
          #hibernate.connection.url jdbc:hsqldb:test
          #hibernate.connection.url jdbc:hsqldb:.

          再找到

          ## MySQL

          #hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
          #hibernate.connection.driver_class org.gjt.mm.mysql.Driver
          #hibernate.connection.driver_class com.mysql.jdbc.Driver
          #hibernate.connection.url jdbc:mysql:///test
          #hibernate.connection.username root
          #hibernate.connection.password

          改為


          ## MySQL

          hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
          hibernate.connection.driver_class org.gjt.mm.mysql.Driver
          hibernate.connection.url jdbc:mysql://localhost:3306/test
          hibernate.connection.username root
          hibernate.connection.password

          上面的URL請(qǐng)改為你自己的。

           

          完成以后創(chuàng)建一個(gè)空的文件,保存在你工程的類(lèi)文件同個(gè)文件夾里(例如hibernate\classes\hibernate\目錄下),文件名為:Hello_Bean.hbm.xml

          內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>

          <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
          <hibernate-mapping>

          <class name="hibernate.Hello_Bean" table="test_hibernate" >

          <id name="id" column="id">

          <generator class="identity"/>

          </id>

          <property name="name" type="string" update="true" insert="true" column="name" />
          <property name="address" type="string" update="true" insert="true" column="address" />

          </class>

          </hibernate-mapping>

          稍微解釋一下,<class name="hibernate.Hello_Bean" table="test_hibernate" >里的name指你的生成表的類(lèi),

          table
          則指定你要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)表的名字,可以自由修改,沒(méi)有影響.

          <id name="id" column="id">
          設(shè)置主鍵ID,這里name的值idHello_Bean.java里的方法getIdsetId對(duì)應(yīng),不用管這個(gè),hibernate會(huì)自動(dòng)調(diào)用,配置好就可以了,column的值為要生成的字段名,可以自由修改,沒(méi)有影響。

          <generator class="identity"/>
          屬性讓主鍵的ID自增(插入數(shù)據(jù)的時(shí)候自動(dòng)加1

          <property name="name" type="string" update="true" insert="true" column="name" />
          這里的name"name"Hello_Bean.java里的getName方法對(duì)應(yīng),column為要生成的字段名
          <property name="address" type="string" update="true" insert="true" column="address" />

          分別添加一個(gè)字段nameaddress,注意這里的type屬性類(lèi)型為string,如果這里的類(lèi)型與Hello_Bean.java里設(shè)置的類(lèi)型不一樣會(huì)出錯(cuò)。

          修改完以后保存。

          最后在JB里新建一個(gè)類(lèi),名字為Hello.java,我會(huì)一步步解釋?zhuān)a如下:

          package hibernate;

          import net.sf.hibernate.cfg.Configuration;
          import net.sf.hibernate.SessionFactory;
          import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
          import net.sf.hibernate.Session;
          import net.sf.hibernate.Query;
          import net.sf.hibernate.Hibernate;
          import net.sf.hibernate.type.LongType;
          import net.sf.hibernate.Transaction;
          import net.sf.hibernate.ScrollableResults;
          import java.util.*;

          /**
          * @author geezer
          * QQ:9986986 MSN:geezer_hot@hotmail.com
          */


          public class Hello {


          public Hello() {


          }

          public static void main(String[] args) throws Exception {

          Configuration cfg = new Configuration().addClass(Hello_Bean.class);//
          Hello_Bean.class類(lèi)初始化

          SessionFactory sessions = cfg.buildSessionFactory();//
          buildSessionFactory方法得到一個(gè)SessionFactory對(duì)象

          Session session = sessions.openSession();//
          再用SessionFactoryopenSession方法得到一個(gè)session

          new SchemaExport(cfg).create(true, true);//
          這句意思是創(chuàng)建表,第一次運(yùn)行以后,就是創(chuàng)建完表以后再把這行加上注釋。如果建表以后不把這一句注釋掉的話會(huì)刪掉以前創(chuàng)建的表再重新建一個(gè)。

          Hello_Bean my_hibernate = new Hello_Bean();//
          得到一個(gè)Hello_Bean對(duì)象

          my_hibernate.setName("my_name");//
          設(shè)置Hello_Bean對(duì)象的name值為my_name,這里其實(shí)就是說(shuō)把字符串my_name當(dāng)作數(shù)據(jù)庫(kù)字段name的值.數(shù)據(jù)庫(kù)字段nameHello_Bean類(lèi)里的getName,setName方法是對(duì)應(yīng)的。形成一個(gè)映射關(guān)系。

          my_hibernate.setAddress("my_address");//
          如上

          session.save(my_hibernate);//
          這句很重要,將my_hibernate對(duì)象寫(xiě)進(jìn)數(shù)據(jù)庫(kù)(my_hibernate對(duì)象里的nameaddress我們剛剛已經(jīng)設(shè)置了值了,會(huì)直接把name,address的值寫(xiě)進(jìn)數(shù)據(jù)庫(kù)去)

          session.flush();
          session.close();


          //
          上面是一個(gè)簡(jiǎn)單的插入數(shù)據(jù)與第一次運(yùn)行建表的介紹,下面我再介紹刪除與修改的方法,下面的代碼我都加了注釋?zhuān)约盒枰裁捶椒ǎ▌h除,修改,循環(huán)數(shù)據(jù)庫(kù)的值)就把注釋去掉就可以了
          HSQL
          比較簡(jiǎn)單,大家看一下例子就應(yīng)該明白了,這里就不講了。
          遍歷數(shù)據(jù)庫(kù)的方法有三種,分別是Query,find,iterateQueryfind返回一個(gè)List接口,iterate返回一個(gè)Iterator,具體方法可以查看這些類(lèi)得知。

          //
          刪除數(shù)據(jù)
          /*
          int a=session.delete("from Hello_Bean where id=1");//
          如果沒(méi)有找到id1的數(shù)據(jù)那么返回0,如果找到返回1,這里的Hello_Bean是我們的Hello_Bean類(lèi),他跟數(shù)據(jù)庫(kù)表對(duì)應(yīng),所以我們?cè)谶@里是直接用Hello_Bean來(lái)代碼數(shù)據(jù)庫(kù)表的。
          System.out.println(a);
          session.flush();
          session.close();

          */

          //Query
          方法查詢(xún)數(shù)據(jù)
          /*
          Hello_Bean my_hibernate = null;
          Query q = session.createQuery("from Hello_Bean");
          // Query q = session.createQuery("from Hello_Bean where name=?");//
          這里的?JDBCPreparedStatement方法的差不多,只不過(guò)這里的是以0開(kāi)始,jdbc的是1開(kāi)始。
          // q.setString(0,"my_name");
          // q.setFirstResult(0);//
          這句話的意思是說(shuō)查詢(xún)結(jié)果從第幾行開(kāi)始列出數(shù)據(jù)
          // q.setMaxResults(3);//
          這句話的意思是取多少條數(shù)據(jù),就跟SQL SERVERTOP方法和MYSQLLIMIT方法一樣的意思。
          // ScrollableResults sc=q.scroll();//
          得到一個(gè)ScrollableResults,可滾動(dòng)的,如果你的數(shù)據(jù)庫(kù)支持游標(biāo)自由移動(dòng)的話可以加上,也就是說(shuō)可以判斷查詢(xún)結(jié)果有沒(méi)有值,或者移動(dòng)到下一行記錄等等。

          // if(!sc.next())
          // {
          // System.out.println("
          沒(méi)有找到你需要的數(shù)據(jù)");
          // }

          session.flush();//
          如果使用了ScrollableResults的話請(qǐng)把這行注釋掉
          session.close();//
          如果使用了ScrollableResults的話請(qǐng)把這行注釋掉

          List l=q.list();//
          返回一個(gè)List接口,用來(lái)遍歷結(jié)果集

          for(int i=0;i<l.size();i++){
          my_hibernate = (Hello_Bean) l.get(i);//
          List中取得一個(gè)my_hibernate對(duì)象
          System.out.println(my_hibernate.getName());//
          調(diào)用my_hibernate對(duì)象的getName方法取得數(shù)據(jù)庫(kù)name字段的值

          }

          */

          //find
          方法查詢(xún)數(shù)據(jù)
          /*
          Hello_Bean my_hibernate = null;
          List q = session.find("from Hello_Bean");
          session.flush();
          session.close();

          for(int i=0;i<q.size();i++)
          {
          my_hibernate = (Hello_Bean) q.get(i);
          System.out.println(my_hibernate.getName());
          }
          */

          //iterate
          方法查詢(xún)數(shù)據(jù)
          /*
          Hello_Bean my_hibernate = null;
          Iterator q = session.iterate("from Hello_Bean");

          while(q.hasNext())
          {
          my_hibernate = (Hello_Bean) q.next();
          System.out.println(my_hibernate.getName());
          }

          */

          //
          修改數(shù)據(jù)
          /*
          Query qq=session.createQuery("from Hello_Bean");

          Hello_Bean my_hibernate=(Hello_Bean)session.load(Hello_Bean.class,new Integer(2));
          //
          這里的new Integer(2)意思是修改表中id2的那一行數(shù)據(jù),必須是一個(gè)包裝類(lèi)的對(duì)象,如果使用int的話會(huì)出錯(cuò)。
          my_hibernate.setName("geezer");//
          id2的那一行數(shù)據(jù)的name字段值改為"geezer"
          session.flush();
          session.close();

          */

          }

          }

          最后運(yùn)行就可以了。

          如果大家有什么不清楚的,可以下載這篇文章的例子看看,運(yùn)行一下。
          下載地址:點(diǎn)擊下載

          下載完以后用JB打開(kāi)hibernate.jpx就可以了。用之前把hibernateMYSQL的驅(qū)動(dòng)加進(jìn)去,方法如果不知道再看看本章開(kāi)頭部分。


          常見(jiàn)錯(cuò)誤:
          Caused by: org.dom4j.DocumentException: Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence.
          如果出現(xiàn)這行錯(cuò)誤說(shuō)明你的xml配置文件有不規(guī)范的字符,檢查下。

          net.sf.hibernate.MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml


          如果出現(xiàn)這行錯(cuò)誤說(shuō)明你的hibernateXML配置文件有錯(cuò)

          net.sf.hibernate.MappingException: Resource: hibernate/Hello_Bean.hbm.xml not found


          如果出現(xiàn)這行錯(cuò)誤說(shuō)明hibernateXML配置文件沒(méi)有找到,你應(yīng)該把XML文件放在與你的類(lèi)文件同個(gè)目錄下,本文中是放在hibernate\classes\hibernate\目錄下,也就是跟Hello_Bean.class類(lèi)文件一起。

          net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean


          如果出現(xiàn)這行錯(cuò)誤說(shuō)明你的xml文件里設(shè)置的字段名name的值與Hello_Bean.java類(lèi)里的getXXXsetXXX方法不一致。

          net.sf.hibernate.HibernateException: JDBC Driver class not found: org.gjt.mm.mysql.Driver
          如果出現(xiàn)這行錯(cuò)誤說(shuō)明你的MYSQL驅(qū)動(dòng)沒(méi)有加進(jìn)JB庫(kù)里或者不在CLASSPATH里。(全文完)

          posted on 2005-10-21 22:16 EA_Games 閱讀(267) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Hibernate
           
          Copyright © EA_Games Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 望谟县| 马关县| 和林格尔县| 邳州市| 平顺县| 蓬溪县| 临泉县| 贵溪市| 宕昌县| 保山市| 乌鲁木齐市| 磐石市| 体育| 昭苏县| 克拉玛依市| 玛纳斯县| 平利县| 望城县| 宿迁市| 介休市| 江永县| 鞍山市| 金堂县| 青州市| 武功县| 海门市| 泽普县| 泰兴市| 康马县| 永年县| 修武县| 阿荣旗| 湘乡市| 贞丰县| 嘉义县| 和静县| 伊吾县| 康乐县| 中江县| 泽普县| 昆明市|