blogjava's web log

          blogjava's web log
          ...

          hibernate調用mysql5.0存儲過程小記


          準備工作:
          1.hibernate3
          到這下載hibernate3:http://sourceforge.net/project/showfiles.phpgroup_id=40712&package_id=127784&release_id=403223
          2.mysql (注意一定要用mysql5.0和最新驅動)
          ?mysql官方網站http://www.mysql.com/


          1 .建張表
          CREATE ? TABLE ?`proctest`?(
          ??`id`?
          int ( 11 )? NOT ? NULL ?auto_increment,
          ??`Name`?
          varchar ( 20 )? default ? '''''' ,
          ??`age`?
          int ( 11 )? default ? NULL ,
          ??`address`?
          varchar ( 50 )? default ? '' ,
          ??
          PRIMARY ? KEY ??(`id`)
          )?ENGINE
          = InnoDB? DEFAULT ?CHARSET = gb2312;
          插入幾條記錄
          INSERT ? INTO ?`proctest`? VALUES ?( 1 , ' tom ' , 22 , 'http://www.aygfsteel.com ' );
          INSERT ? INTO ?`proctest`? VALUES ?( 2 , ' wujun ' , 25 , 'http://www.aygfsteel.com/wujun ' );
          INSERT ? INTO ?`proctest`? VALUES ?( 3 , ' jerry ' , 30 , ' 深圳 ' );
          INSERT ? INTO ?`proctest`? VALUES ?( 4 , ' wujun ' , 40 , ' 南昌 ' );
          創建存儲過程
          -- 這只是一個例子,就來個簡單存儲過程
          create ? PROCEDURE ?testProc()
          begin
          ???
          select ? * ? from ?proctest;
          end ;



          打開eclipce新建個java工程,記的把hiberbate3類庫也一起加進去..
          看下結構圖:


          1.新建UserVO.java文件

          package ?net.wj.proc.vo;

          public ? class ?UserVO? {
          ????
          private ? int ?id;
          ????
          private ?String?name;
          ????
          private ? int ?age;
          ????
          private ?String?address;
          ????
          public ?UserVO()
          ????
          {}
          順便把它相對應的配置文件也寫上。。
          UserVO.hbm.xml?

          <?xml?version="1.0"?encoding='UTF-8'?>
          <!DOCTYPE?hibernate-mapping?PUBLIC
          ????????????????????????????"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"
          ????????????????????????????"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"?
          >

          <!--?DO?NOT?EDIT:?This?is?a?generated?file?that?is?synchronized?-->
          <!--?by?MyEclipse?Hibernate?tool?integration.???????????????????-->
          <!--?Created?Sat?Apr?22?17:08:56?CST?2006?????????????????????????-->
          <hibernate-mapping>

          ????
          <class?name="net.wj.proc.vo.UserVO"?table="proctest">
          ????????
          <id?name="id"?column="id">
          ????????????
          <generator?class="native"/>
          ????????
          </id>
          ????????
          ????????
          <property?name="name"?column="name"?type="string"?/>
          ????????
          <property?name="age"?column="age"?type="integer"?/>
          ????????
          <property?name="address"?column="address"?type="string"?/>

          ????
          </class>

          ????
          <!--sql查詢-->
          ?????
          <sql-query?name="select">
          ?????
          <![CDATA[select?{usr.*}?from?proctest?usr?]]>
          ?????
          <return?alias="usr"?class="net.wj.proc.vo.UserVO"?/>
          ?????
          </sql-query>

          ?????
          <!--調用存儲過程就在這里配了-->
          ????
          <sql-query?name="getUser"?callable="true">
          ?????
          <return?alias="user"?class="net.wj.proc.vo.UserVO">
          ?????
          ?????
          <return-property?name="id"?column="id"?/>
          ??????
          <return-property?name="name"?column="name"?/>
          ???????
          <return-property?name="age"?column="age"?/>
          ????????
          <return-property?name="address"?column="address"?/>
          ?????
          </return>
          ?????
          <!--這里就是我們剛剛創建的存儲過程名-->
          ?????{call?testProc()}
          ?????
          </sql-query>
          </hibernate-mapping>

          測試代碼
          package?net.wj.proc.test;


          import?java.util.List;

          import?org.hibernate.*;
          import?org.hibernate.cfg.*;
          import?net.wj.proc.vo.*;
          import?org.apache.log4j.*;


          public?class?ProcTest?{

          ????
          /**
          ?????*?
          @param?args
          ?????
          */

          ????Logger?log
          =Logger.getLogger(this.getClass());
          ????
          public?ProcTest()
          ????
          {}
          ????
          public?static?void?main(String[]?args)?{
          ????????System.out.print(
          "start.............................");
          ????????ProcTest?tt
          =new?ProcTest();
          ???????
          //?tt.LoadAll();
          ???????
          //?tt.ExampleSelect();
          ???????tt.ExampleProc();
          ????????
          ????}

          ????
          ????
          //得到Session,
          ????public?Session??getSession()
          ????
          {
          ????????
          try
          ????????
          {
          ????????????Configuration?cfg?
          =?new?Configuration().configure();
          ????????????SessionFactory?sf
          =cfg.buildSessionFactory();
          ????????????Session?ss
          =?sf.openSession();
          ????????????
          return?ss;

          ????????}

          ????????
          catch(Exception?ee)
          ????????
          {
          ????????????System.out.print(
          "失敗"+ee.getMessage());
          ????????????
          return?null;
          ????????}

          ??????
          ????}

          ????
          //這里調我們在UserVO.hbm.xml
          ????
          //sql-query?寫上的name屬性getUser
          ????public?void?ExampleProc()
          ????
          {
          ????????Session?ss
          =this.getSession();
          ????????List?li
          =ss.getNamedQuery("getUser").list();
          ????????
          for(int?i=0;i<li.size();i++)
          ????????
          {
          ????????????UserVO?vo
          =(UserVO)li.get(i);
          ????????????log.info(
          "name:"+vo.getName());
          ????????????log.info(
          "age"+vo.getAge());
          ????????????log.info(
          "address"+vo.getAddress());
          ????????}

          ????????ss.close();
          ????}

          ????
          //配置文件的sql查詢
          ????public?void?ExampleSelect()
          ????
          {
          ???????????Session?ss
          =this.getSession();
          ???????????List?li
          =?ss.getNamedQuery("select").list();
          ????????
          ???????????
          for(int?i=0;i<li.size();i++)
          ???????????
          {
          ????????????UserVO?vo
          =(UserVO)li.get(i);
          ????????????log.info(
          "name:"+vo.getName());
          ????????????log.info(
          "age"+vo.getAge());
          ????????????log.info(
          "address"+vo.getAddress());
          ???????????}

          ???????????ss.close();??
          ????}
          }


          記的用最新的驅動:
          要不然可能會報這個錯
          Exception?in?thread?"main"?org.hibernate.exception.GenericJDBCException:?could?not?execute?query
          ????at?org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:
          91)
          ????at?org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:
          79)
          ????at?org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:
          43)
          ????at?org.hibernate.loader.Loader.doList(Loader.java:
          2148)
          ????at?org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:
          2029)
          ????at?org.hibernate.loader.Loader.list(Loader.java:
          2024)
          ????at?org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:
          111)
          ????at?org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:
          1674)
          ????at?org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:
          147)
          ????at?org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:
          164)
          ????at?net.wj.proc.test.ProcTest.ExampleProc(ProcTest.java:
          45)
          ????at?net.wj.proc.test.ProcTest.main(ProcTest.java:
          22)
          Caused?by:?java.sql.SQLException:?Callable?statments?not?supported.
          ????at?com.mysql.jdbc.Connection.prepareCall(Connection.java:
          1278)
          ????at?org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:
          439)
          ????at?org.hibernate.jdbc.AbstractBatcher.prepareCallableQueryStatement(AbstractBatcher.java:
          115)
          ????at?org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:
          1557)
          ????at?org.hibernate.loader.Loader.doQuery(Loader.java:
          661)
          ????at?org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:
          224)
          ????at?org.hibernate.loader.Loader.doList(Loader.java:
          2145)
          ?????
          8?more
          09:38:18,837??INFO?SessionFactoryImpl:153?-?building?session?factory
          09:38:18,917??WARN?Configurator:126?-?No?configuration?found.?Configuring?ehcache?from?ehcache-failsafe.xml?found?in?the?classpath:?jar:file:/E:/lib/hibernate3/ehcache-1.1.jar!/ehcache-failsafe.xml
          09:38:21,951??INFO?SessionFactoryObjectFactory:82?-?Not?binding?factory?to?JNDI,?no?JNDI?name?configured
          Hibernate:?
          {call?testProc()}
          09:38:22,482??WARN?JDBCExceptionReporter:71?-?SQL?Error:?0,?SQLState:?S1C00
          09:38:22,482?ERROR?JDBCExceptionReporter:72?-?Callable?statments?not?supported.

          源代碼http://www.aygfsteel.com/Files/wujun/Proc.rar

          是不是挺簡單的.

          posted on 2006-05-20 11:21 record java and net 閱讀(6200) 評論(14)  編輯  收藏 所屬分類: java

          評論

          # re: hibernate調用mysql5.0存儲過程小記 2006-05-24 10:36 Tin

          哈哈,好文,謝謝。不過是否用過沒有返回值的存儲過程?我發現在Hibernate里面用沒有返回值的存儲過程總會出錯,不知是否解決?  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-05-24 11:58 吳某人-不斷地學習

          看老兄的博客。。是牛人啊。。

          還是用session.connection得到jdbc實例進行調用吧。

          好象那樣不行。。我試了也報錯。。

            回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-05-30 11:14 老鼠

          呵呵,受教:)

          我把您這篇文章轉走了,您愿意么?

          如果有疑問,請在此留言或給我郵件:cammy.sun@hotmail.com.


          謝謝您:)  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-05-30 11:24 吳某人-不斷地學習

          可以啊

          把轉載在那里告訴我一下。。

          呵呵  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-05-30 12:13 老鼠

          :P

          呵呵,我把它轉tech.it168.com去了:p

          您同意么:P

          好象您也上ITPUB的喲:),我也是那里的常客:p

          :shake:  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-05-30 17:22 吳某人-不斷地學習

          呵呵。。

            回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-06-07 10:19 sunqiqi

          不錯。贊一個。  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-07-20 22:39 何為

          報Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query
          這個錯。
          我的驅動版本是3.1.13的,還是報這個錯啊

          請問你用的是什么版本呢  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-07-21 10:00 吳某人-不斷地學習

          用最新的驅動。。
          3.1.13 的可能不行。

          下最新 5。0的驅動就可以了
          http://dev.mysql.com/downloads/  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2006-10-23 14:04 tt

          不過創建存儲過程
          -- 這只是一個例子,就來個簡單存儲過程
          create PROCEDURE testProc()
          begin
          select * from proctest;
          end ;
          像這樣子,只有一個語句的,好像可以,要是多個語句的在MYSQL管理里面沒有辦法編輯,老出問題,
            回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2007-07-10 16:12 超超

          此代碼對了嗎?為什么我在其它地方看到的代碼,他們都說要調用session.connection()去調用存儲過程呢?  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2007-11-02 10:35 joyou

          朋友 你的測試 是否正確 否則看了之后 也不清楚 謝謝 :)  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記 2008-12-12 14:36 stringtz

          請問數據庫的驅動放什么地方
          我照你的做為什么報錯是這樣的
          start.............................Exception in thread "main" java.lang.Error: Unresolved compilation problems:
          The method getName() is undefined for the type UserVO
          The method getAge() is undefined for the type UserVO
          The method getAddress() is undefined for the type UserVO

          at net.wj.proc.test.ProcTest.ExampleProc(ProcTest.java:54)
          at net.wj.proc.test.ProcTest.main(ProcTest.java:23)  回復  更多評論   

          # re: hibernate調用mysql5.0存儲過程小記[未登錄] 2010-01-14 12:40 AAA

          能有點追求嗎》Hibernate如何調用out類型的參數寫了嗎,  回復  更多評論   

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 大理市| 三门县| 磐安县| 沾化县| 潮安县| 霍州市| 平罗县| 巢湖市| 普兰县| 米泉市| 灵石县| 罗江县| 平昌县| 永和县| 黄大仙区| 司法| 安康市| 九江县| 莆田市| 银川市| 南平市| 永城市| 抚宁县| 绵竹市| 唐海县| 江津市| 肃宁县| 瑞金市| 武冈市| 宾川县| 永宁县| 双鸭山市| 博爱县| 黔西| 土默特右旗| 通江县| 炎陵县| 贵定县| 大关县| 长岛县| 龙南县|