e代劍客——溫柔一刀

          生活就像海洋,只有意志堅強的人,才能到達彼岸

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            76 隨筆 :: 7 文章 :: 215 評論 :: 0 Trackbacks

          最簡單的 iBatis 入門例子? ?? ?

          iBatis 是一個 O/R Mapping 解決方案, iBatis 最大的特點就是小巧,上手很快。如果你不需要太多復雜的功能, iBatis 是能滿足你的要求又足夠靈活的最簡單的解決方案。下面我們看一個最簡單的入門例子,是《 ibatis 開發指南》上的例子改的,不過上面講的不仔細,我開始學的時候搞了一個晚上才把那個例子跑起來的,相信一些朋友也和我一樣,在入門的時候有一點小郁悶,我把整個工程項目打包了供朋友 下載 ,工具是 eclipse3.2+myeclipse5.0 ,導入即可運行,數據庫用的是 MySQL 。也可以改用別的數據庫!??

          先建數據庫和表吧; sql 語句我導出來了:

          /* ?

          SQLyog?企業版?-?MySQL?GUI?v4.1?

          主機?-?5.0.7-beta-nt?:?數據庫?-?sample?

          *********************************************************************?

          服務器版本?:?5.0.7-beta-nt?

          create?database?if?not?exists?`sample`;?

          USE?`sample`;?

          /*?數據表?`t_user`?的表結構
          */
          ?

          drop ? table ? if ? exists ?`t_user`;?

          CREATE ? TABLE ?`t_user`?(?

          ??`id`?
          int ?( 11 )? NOT ? NULL ?auto_increment,?

          ??`?name?`?
          varchar ?( 50 )? default ? NULL ?,?

          ??`sex`?
          int ?( 11 )? default ? NULL ?,?

          ??
          PRIMARY ? KEY ???(`id`)?

          )?ENGINE
          = InnoDB? DEFAULT ?CHARSET = latin1;?

          /* ?數據表?`t_user`?的數據 */ ?

          insert ? into ?`t_user`? values ?( 1 ,? ' zhupan ' ?, 1 ),( 2 ,? ' zhupan ' ?, 2 ),( 3 ,? ' 3 ' ?, 3 ),( 4 ,? ' 4 ' ?, 4 ),( 5 ,? ' 5 ' ?, 5 );?


          整個工程目錄結構如下:??(圖片未能顯示,附件里面有)

          lib 包下面的文件:??(圖片未能顯示,附件里面有)

          下面開始編寫每個文件:??

          編寫 iBatis 必須的配置文件 SqlMapConfig.xml ,放在包 com.ctgusec.zhupan.maps 下,文件名可以任意改,內容如下:

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

          <! ?DOCTYPE?sqlMapConfig?

          ????PUBLIC?"-//iBATIS.com//DTD?SQL?Map?Config?2.0//EN"?

          ????"http://www.ibatis.com/dtd/sql-map-config-2.dtd"?
          > ?

          < ?sqlMapConfig? > ?

          ????
          < ?settings? cacheModelsEnabled? =?"true" ?enhancementEnabled? =?"true" ?

          ????????lazyLoadingEnabled?
          =?"true" ?errorTracingEnabled? =?"true" ?maxRequests? =?"32" ?

          ????????maxSessions?
          =?"10" ?maxTransactions? =?"5" ?useStatementNamespaces? =?"false" ? /> ?

          ??

          ????
          < ?transactionManager? type? =?"JDBC" ? > ?

          ????????
          < ?dataSource? type? =?"SIMPLE" ? > ?

          ????????????
          < property? name ="JDBC.Driver" ?value ="com.mysql.jdbc.Driver" ? /> ?

          ???????????
          < property? name ="JDBC.ConnectionURL" ????value ="jdbc:mysql://localhost/sample" ? /> ?

          ???????????
          < property? name ="JDBC.Username" ?value ="root" ? /> ?

          ???????????
          < property? name ="JDBC.Password" ?value ="" ? /> ?

          ????????????
          < ?property? name? =?"Pool.MaximumActiveConnections" ?value? =?"10" ? /> ?

          ????????????
          < ?property? name? =?"Pool.MaximumIdleConnections" ?value? =?"5" ? /> ?

          ????????????
          < ?property? name? =?"Pool.MaximumCheckoutTime" ?value? =?"120000" ? /> ?

          ????????????
          < ?property? name? =?"Pool.TimeToWait" ?value? =?"500" ? /> ?

          ????????????
          < ?property? name? =?"Pool.PingQuery" ?value? =?"select?1?from?sample" ? /> ?

          ????????????
          < ?property? name? =?"Pool.PingEnabled" ?value? =?"false" ? /> ?

          ????????????
          < ?property? name? =?"Pool.PingConnectionsOlderThan" ?value? =?"1" ? /> ?

          ????????????
          < ?property? name? =?"Pool.PingConnectionsNotUsedFor" ?value? =?"1" ? /> ?

          ????????
          </ ?dataSource? > ?

          ????
          </ ?transactionManager? > ?

          ????
          < ?sqlMap? resource? =?"com/ctgusec/zhupan/maps/User.xml" ? /> ?

          </ ?sqlMapConfig? > ?

          如果不用 mysql 數據庫,需要重新配置數據源(紅色加粗字體標出),更改相應的屬性即可。

          然后注意到這個配置文件還引用了一個 User.xml iBatis 把每個需要 O/R Mapping Java 對象關聯到一個 xml 配置文件,我們需要把 t_user 表映射到一個 User 類:

          package ?com.ctgusec.zhupan.model;?

          import ?java.io.Serializable;?

          ??

          public ? class ?User? implements ?Serializable? {?

          ??

          ????
          /** ?

          ??????*?
          @author ?zhupan?

          ??????
          */
          ?

          ????
          private ? static ? final ? long ?serialVersionUID? = ? 1L ;?

          ??

          ????
          private ?Integer?id?;?

          ??

          ????
          private ?String?name?;?

          ??

          ????
          private ?Integer?sex?;?

          ????

          ????
          public ?User()? {?

          ????}
          ?

          ??

          ????
          public ?Integer?getId()? {?

          ????????
          return ? this ?.?id?;?

          ????}
          ?

          ??

          ????
          public ? void ?setId(Integer?id)? {?

          ????????
          this ?.?id? = ?id;?

          ????}
          ?

          ??

          ????
          public ?String?getName()? {?

          ????????
          return ? this ?.?name?;?

          ????}
          ?

          ??

          ????
          public ? void ?setName(String?name)? {?

          ????????
          this ?.?name? = ?name;?

          ????}
          ?

          ??

          ????
          public ?Integer?getSex()? {?

          ????????
          return ? this ?.?sex?;?

          ????}
          ?

          ??

          ????
          public ? void ?setSex(Integer?sex)? {?

          ????????
          this ?.?sex? = ?sex;?

          ????}
          ?

          }
          ?


          編寫 User.xml 文件:

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

          ??

          <! ?DOCTYPE?sqlMap?

          ????PUBLIC?"-//iBATIS.com//DTD?SQL?Map?2.0//EN"?

          ????"http://www.ibatis.com/dtd/sql-map-2.dtd"?
          > ?

          ??

          < ?sqlMap? namespace? =?"User" ? > ?

          ??

          ????
          < ?typeAlias? alias? =?"user" ?type? =?"com.ctgusec.zhupan.model.User" ? /> ?

          ????
          < ?select? id? =?"getUser" ?parameterClass? =?"java.lang.String" ?

          ????????resultClass?
          =?"user" ? > ?

          ????????
          <![CDATA[ ?????select??name,??sex???from?t_user???where?name?=?#name#??? ]]> ?

          ????
          </ ?select? > ?

          ????

          ????
          < ?select? id? =?"getAllUser" ?resultClass? =?"user" ? > ?

          ????????
          <![CDATA[ ????select???name,??sex??from?t_user?? ]]> ?

          ????
          </ ?select? > ?

          ??

          ????
          < ?update? id? =?"updateUser" ?parameterClass? =?"user" ? > ?

          ????????
          <![CDATA[ ????UPDATE?t_user??SET?name=#name#,?sex=#sex#?WHERE?id?=?#id#? ]]> ?

          ????
          </ ?update? > ?

          ??

          ????
          < ?insert? id? =?"insertUser" ?parameterClass? =?"user" ? > ?

          ????????INSERT?INTO?t_user?(?name,?sex)?VALUES?(?#name#,?#sex#?)?
          </ ?insert? > ?

          ??

          ????
          < ?delete? id? =?"deleteUser" ?parameterClass? =?"java.lang.String" ? > ?

          ????????delete?from?t_user?where?id=#value#?

          ????
          </ ?delete? > ?

          </ ?sqlMap? >

          通過 <insert> <delete> <update> <select> 節點,分別定義了針對 TUser 對象的增刪改查操作。在這些節點中,我們指定了對應的 SQL 語句: ID 指定了操作 ID ,之后我們可以在代碼中通過指定操作 id 來執行此節點所定義的操作,如: sqlMap.update("updateUser",user);?? ID 設定使得在一個配置文件中定義兩個同名節點成為可能(兩個 update 節點,以不同 id 區分) parameterClass 指定 需的 類型 此例 update com.ctgusec.zhupan.model .User 類型的對象作為參數,目標是將提供的 User 實例更新到數據庫。 parameterClass="user" 中, user 為“ com.ctgusec.zhupan.model.User ”類的別名,別名可通過 typeAlias 節點指定,如示例配置文件中的: <typeAlias alias="user" type="com.ctgusec.zhupan.model.User"/> #name# ”在運行期會由傳入的 user 對象的 name 屬性填充。 #sex# ”,將在運行期由傳入的 user 對象的 sex 屬性填充。“ #id# ”,將在運行期由傳入的 user 對象的 id 屬性填充。??

          只要你會寫 SQL ,就能非常容易地寫出配置文件。

          最后便是如何使用 iBatis 實現 O/R 映射 , 測試給個例子:

          package ?com.ctgusec.zhupan;???

          import ?java.sql.SQLException;?

          import ?java.util.List;???

          import ?com.ctgusec.zhupan.model.User;?

          import ?com.ibatis.sqlmap.client.SqlMapClientBuilder;???

          /** ?

          ?*?

          ?*?
          @author ?zhupan?

          ?
          */
          ?

          public ? class ?ExampleMain? {?

          ??

          ???????
          public ? static ? void ?update()? {?

          ??????????????
          // ?首先初始化?iBatis?獲得一個?SqlMapClient?對象?

          ??????????????String?resource?
          = ? " com/ctgusec/zhupan/maps/SqlMapConfig.xml " ;?

          ??????????????com.ibatis.sqlmap.client.SqlMapClient?sqlMap?
          = ? null ;?

          ??????????????
          try ? {?

          ?????????????????????java.io.Reader?reader?
          = ?com.ibatis.common.resources.Resources.getResourceAsReader(resource);?

          ?????????????????????sqlMap?
          = ?SqlMapClientBuilder.buildSqlMapClient(reader);?

          ??????????????}
          ? catch ?(Exception?e)? {?

          ?????????????????????e.printStackTrace();?

          ??????????????}
          ?

          ??????????????
          // ?sqlMap?系統初始化完畢,開始執行?update?操作?

          ??????????????
          try ? {?

          ?????????????????????sqlMap.startTransaction();?

          ?????????????????????User?user?
          = ? new ?User();?

          ?????????????????????user.setId(
          new ?Integer( 1 ));?

          ?????????????????????user.setName(
          " zhupan " );?

          ?????????????????????user.setSex(
          new ?Integer( 1 ));?

          ?????????????????????sqlMap.update(
          " updateUser " ,?user);?

          ?????????????????????sqlMap.commitTransaction();?

          ??????????????}
          ? catch ?(SQLException?e)? {?

          ?????????????????????System.out.println(e.getMessage());?

          ??????????????}
          ? finally ? {?

          ?????????????????????
          try ? {?

          ????????????????????????????sqlMap.endTransaction();?

          ?????????????????????}
          ? catch ?(SQLException?e)? {?

          ????????????????????????????e.printStackTrace();?

          ?????????????????????}
          ?

          ??????????????}
          ?

          ???????}
          ?

          ???????
          public ? static ?List?getUser()? {?

          // ????????????首先初始化?iBatis?獲得一個?SqlMapClient?對象?

          ??????????????String?resource?
          = ? " com/ctgusec/zhupan/maps/SqlMapConfig.xml " ;?

          ??????????????com.ibatis.sqlmap.client.SqlMapClient?sqlMap?
          = ? null ;?

          ??????????????List?user
          = null ;?

          ??????????????
          try ? {?

          ?????????????????????java.io.Reader?reader?
          = ?com.ibatis.common.resources.Resources.getResourceAsReader(resource);?

          ?????????????????????sqlMap?
          = ?SqlMapClientBuilder.buildSqlMapClient(reader);?

          ??????????????}
          ? catch ?(Exception?e)? {?

          ?????????????????????e.printStackTrace();?

          ??????????????}
          ?

          ??????????????
          // ?sqlMap?系統初始化完畢,開始執行?getAllUser?操作?

          ??????????????
          try ? {?

          ?????????????????????sqlMap.startTransaction();?????????????????????????

          ?????????????????????user
          = sqlMap.queryForList( " getAllUser " ,? null );?

          ?????????????????????sqlMap.commitTransaction();?

          ??????????????}
          ? catch ?(SQLException?e)? {?

          ?????????????????????System.out.println(e.getMessage());?

          ??????????????}
          ? finally ? {?

          ?????????????????????
          try ? {?

          ????????????????????????????sqlMap.endTransaction();?

          ?????????????????????}
          ? catch ?(SQLException?e)? {?

          ????????????????????????????e.printStackTrace();?

          ?????????????????????}
          ?

          ??????????????}
          ?

          ??????????????
          return ?user;?

          ???????}
          ?

          ???????
          public ? static ? void ?main(String[]?args)? {?

          ??????????????update();?

          ??????????????List?user
          = getUser();???????

          ??????????????
          for ( int ?i = 0 ;i < user.size();i ++ )?

          ??????????????
          {?

          ?????????????????????System.out.println(((User)user.get(i)).getName());?

          ??????????????}
          ?

          ???????}
          ?

          }
          ?


          運行時把 lib 包下的所有 .jar 構建到路徑中,操作如下:?(圖片未能顯示,附件里面有)?

          點擊???(圖片未能顯示,附件里面有)??找到.jar文件全部選中,確認即可??

          總結:iBatis確實簡單靈活,上手容易,代碼很少,配置稍嫌復雜。動態SQL的確是個強點,熟悉后感覺很不錯。iBatis中所有的DAO方法都只傳一個值對象,復雜查詢當然也不例外。另外對常見的1:11:N關系的支持不如Hibernate。使用iBatis 2.01.0有較大區別,主要體現在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地實現DAO模式。持久層使用了iBatis后,團隊中以前亂七八糟的jdbc包裝不見了,大家的編碼風格統一了,可以集中精力進行業務組件的編寫!??

          源文件下載 進入頁面: http://ctguzhupan.go1.icpcn.com/ibatis/ibatis.html? ?

          參考文獻: ibatis 開發指南》??

          Ps :第一次寫這東西,表達能力實在不怎么樣!結合《 ibatis 開發指南》會更容易明白!有不明白的地方也可以聯系我,我將盡力幫助,有錯誤地方也請指正,謝謝!

          blog e代劍客 ??? email zhupanjava@gmail.com? ?

          e代劍客 2006 8 1 完成于 三峽大學軟件工程中心

          posted on 2006-08-11 14:05 溫柔一刀 閱讀(6618) 評論(16)  編輯  收藏 所屬分類: 開源框架

          評論

          # re: 最簡單的iBatis入門例子 2006-08-11 15:16 溫柔一刀
          昏,圖片搞不上來啊  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-08-12 10:47 溫柔一刀
          源文件和說明文件也可以到群4799157共享里面下載  回復  更多評論
            

          # re: iBatis入門例子 2006-08-12 11:18 testffff
          不錯,很順利的運行通過  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-08-12 11:19 testffff
          是純java工程啊,有沒有web的?  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-08-12 13:51 溫柔一刀
          @testffff
          過幾天閑下來了再寫一個spring+ibatis的簡單入門例子
            回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-08-13 18:37 方法學
          收藏  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-10-04 12:32 zengliangzhu
          受益匪淺讓我省去了很多時間入門
          感謝萬分,希望有好的作品請郵件方式通知我  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-12-10 20:37 浩境
          最好有Struts+Spring+ibatis的簡單入門例子
          Spring+ibatis  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2006-12-16 12:02 溫柔一刀
          @浩境
          一樣的,把springmvc換成struts就行了  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2007-02-23 16:58 inthewater0
          謝謝提供  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2007-06-11 17:46 kk
          謝謝!  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2007-07-17 10:19 davy
          非常感謝.
            回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2007-08-16 11:04 kfc
          謝謝..  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2008-04-22 16:19 cainiao
          十分感謝  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2008-07-13 09:22 roben
          謝謝~!
          非常不錯。
          是一個很好的捷徑~!  回復  更多評論
            

          # re: 最簡單的iBatis入門例子 2009-06-20 16:56 居士
          很好的例子  回復  更多評論
            

          聯系偶 zhupanjava@gmail.com 溫柔一刀
          主站蜘蛛池模板: 勃利县| 鹤山市| 突泉县| 台中县| 轮台县| 广汉市| 精河县| 乌拉特中旗| 长兴县| 临安市| 福建省| 抚远县| 兴仁县| 宁陵县| 平江县| 固安县| 阳新县| 聂拉木县| 星座| 灯塔市| 峨眉山市| 大港区| 淮安市| 黄石市| 保靖县| 荥经县| 新绛县| 扶绥县| 罗平县| 沽源县| 南投县| 司法| 龙南县| 昌图县| 故城县| 德钦县| 思南县| 成武县| 淳安县| 鲁甸县| 县级市|