探索與發(fā)現(xiàn)

          研究java技術(shù)

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 109 評(píng)論 :: 0 Trackbacks

          to robbin
          ibatis的網(wǎng)站
          www.ibatis.com上面可以找到很好的文檔,再加上有非常不錯(cuò)的例子,所以使用是相當(dāng)?shù)暮?jiǎn)單。
          sourceforge上面的討論
          http://swik.net/DAO
          http://www.learntechnology.net/struts-ibatis.do
          http://www.nabble.com/iBATIS-f360.html
          http://www.cjsdn.net/post/page?bid=20&sty=3&tpg=2&s=73&age=0
          https://sourceforge.net/forum/forum.php?forum_id=206693
          http://www.cjsdn.net/post/view?bid=11&id=172565&sty=1&tpg=1&age=0Windows
          環(huán)境下的tomcat + apache配置(絕對(duì)實(shí)踐操作版)

          ibatis大體上可以分為兩個(gè)部分:SQL Maps + Data Access Objects
          我現(xiàn)在的項(xiàng)目中都用到了,它提供的jpetstore就使用了db layer,可以參考它的實(shí)現(xiàn)方式。
          不過(guò)我覺(jué)得jpetstore的db layer實(shí)現(xiàn)方式還不是太好,至少它的業(yè)務(wù)邏輯層和dao層沒(méi)有明顯區(qū)分,在實(shí)現(xiàn)比較

          大的項(xiàng)目的時(shí)候造成了程序的混亂,如果沒(méi)有一個(gè)良好的模式來(lái)實(shí)現(xiàn)db layer 的時(shí)候,確實(shí)會(huì)造成效率的低下,

          有了良好的架構(gòu),速度確實(shí)很快(特別是SQL Maps + Data Access Objects 都使用的情況)
          BO層的設(shè)計(jì)已經(jīng)不是什么新鮮的了,但我覺(jué)得它確實(shí)可以很好的和DaoManager結(jié)合起來(lái),通過(guò)DaoManager->SQL

          map->jdbc
          它的兩個(gè)核心的配置文件:dao.xml+SqlMapConfig.xml
          通過(guò)靈活的配置文件的組合可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)不同的訪問(wèn)組合
          比如:一個(gè)dao.xml可以對(duì)應(yīng)多個(gè)SqlMapConfig.xml
          一個(gè)dao.xml可對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù),多個(gè)dao.xml就可以訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)了(它的petstore就提供了演示distributed

          功能的樣例是oracle+ms sql)
          它的SqlMapConfig.xml中可配置sql-map resource,就是配置你具體的sql語(yǔ)句的xml文件。
          它的sqlMap提供很多方法來(lái)訪問(wèn)數(shù)據(jù)庫(kù),直接返回你想要的結(jié)果

          ***************************
          DAO中的一個(gè)供分頁(yè)查詢的方法
          ***************************
          ......

          SqlMap sqlMap = getSqlMapFromLocalTransaction();//取到當(dāng)前sqlmap對(duì)象
          List list=sqlMap.executeQueryForList("你的MappedStatement文件中sql語(yǔ)句的名稱", object("你可以通過(guò)這

          個(gè)object傳一些查詢條件"),skipResults,maxResults);

          ...

          有了良好的設(shè)計(jì)模式,它可以和struts完美結(jié)合在一起,無(wú)論是效率還是清晰型上,都非常令人滿意的

          public void saveUser(User user)
          ??? {
          ??????? if (user.getId() == null)
          ??????? {
          ??????????????? Long id = (Long) getSqlMapClientTemplate().insert("addUser", user);
          ??????????? logger.info("new User id set to: " + id);
          ??????? } else {
          ??????????? getSqlMapClientTemplate().update("updateUser", user);
          ??????? }
          ???????
          ??? }???

          domain is the central business tier. service package is more like a web package, just a way to

          expose these services remotely, so that users could use the web interfaces, or the webservice

          interfaces(like amazon's webservices).


          //TestA.javapublic class TestA{public static void main(String[] args){TestA a=new TestA

          ();System.out.println(a.getClass().getClassLoader());TestB b=new TestB();b.print

          ();}}//TestB.javapublic class TestB{public void print(){System.out.println(this.getClass

          ().getClassLoader());}}

          DAO(data access objects)允許你去創(chuàng)建簡(jiǎn)單的組件,為你訪問(wèn)你的數(shù)據(jù),而不用去實(shí)現(xiàn)具體的實(shí)現(xiàn)細(xì)節(jié)。使用

          DAOS你能動(dòng)態(tài)配置不同的持久層機(jī)制。
          注意:DAO框架與sqlmaps框架是完全的分離開(kāi)和互不依賴性,所以你可以單獨(dú)使用,或一起來(lái)用都沒(méi)有關(guān)系.

          下面是一些重要的daos api
          DaoManager(Facade模式):負(fù)責(zé)配置DAO框架實(shí)例(經(jīng)過(guò)dao.xml),在其它api當(dāng)中充當(dāng)facade.
          DaoTransaction(Marker Interface):通用的接口,為了去使用事物(連接),通用的實(shí)現(xiàn)將包裝jdbc的連接對(duì)象

          .
          DaoException(RuntimeException運(yùn)行期異常):所有的方法和類全部拋出dao api專有的異常。
          Dao(Marker Interface):一個(gè)標(biāo)記接口供所有的dao去實(shí)現(xiàn),這個(gè)接口必須為所有的dao類去實(shí)現(xiàn)。這個(gè)接口沒(méi)有

          聲名任何方法被實(shí)現(xiàn),只是充當(dāng)一個(gè)標(biāo)記(例如:一些DaoFactory去辯別不同的類);
          -----------------------------------
          jdbc事務(wù)控制實(shí)現(xiàn)
          sqlmap:通過(guò)sqlmaps框架和它的事物管理服務(wù)去實(shí)現(xiàn),包括不同的DataSource和事物管理配置
          hibernate:提供簡(jiǎn)單容易的和hibernate,它的事物工具(SessionFactory,Session,Transaction)整合
          jdbc:通過(guò)jdbc api,使用它的基本的dataSource和Connction接口去管理事物
          jta:管理分部式事物,需要被管理的datasource,這樣子可以通過(guò)jndi訪問(wèn).
          external:允許事物被外部控制

          dao.xml為配置文件(http://www.ibatis.com/dtd/dao-2.dtd)
          DaoManager負(fù)責(zé)配置dao框架。DaoManager類可以為框架解析特定的xml文件,而提供出有用的信息供框架使用。

          那么配置文件(xml文件)需要指定下面的內(nèi)容:
          1)dao的上下文
          2)事物為每一個(gè)上下文件的實(shí)現(xiàn)
          3)TransactionManager配置屬性
          4)Dao為每一個(gè)實(shí)現(xiàn)的dao接口
          一個(gè)Dao上下文是一組相關(guān)的配置信息和Dao實(shí)現(xiàn)。通常一個(gè)上下文關(guān)聯(lián)到一個(gè)數(shù)據(jù)源(datasource)或一個(gè)文件。
          dao配置文件(通常被叫做dao.xml,但不是必須的),為下面的結(jié)構(gòu)
          <!DOCTYPE daoConfig
          PUBLIC "-//iBATIS.com//DTD DAO Configuration 2.0//EN"
          "<
          daoConfig>
          <properties resource="com/domain/properties/MyProperties.properties"/>
          <!-- Example JDBC DAO Configuration -->
          <context>
          <transactionManager type="JDBC">
          <property name="DataSource" value="SIMPLE"/>
          <property name="JDBC.Driver" value="${driver}"/>
          <property name="JDBC.ConnectionURL" value="${url}"/>
          <property name="JDBC.Username" value="${username}"/>
          <property name="JDBC.Password" value="${password}"/>
          <property name="JDBC.DefaultAutoCommit" value="true" />
          <property name="Pool.MaximumActiveConnections" value="10"/>
          <property name="Pool.MaximumIdleConnections" value="5"/>
          <property name="Pool.MaximumCheckoutTime" value="120000"/>
          </transactionManager>
          <dao interface="com.domain.dao.OrderDao"
          implementation="com.domain.dao.jdbc.JdbcOrderDao"/>
          <dao interface="com.domain.dao.LineItemDao"
          implementation="com.domain.dao.jdbc.JdbcLineItemDao"/>
          <dao interface="com.domain.dao.CustomerDao"
          implementation="com.domain.dao.jdbc.JdbcCustomerDao"/>
          </context>
          <!-- Example SQL Maps DAO Configuration -->
          <context>
          <transactionManager type="SQLMAP">
          <property name="SqlMapConfigResource" value="com/domain/dao/sqlmap/SqlMapConfig.xml"/>
          </transactionManager>
          <dao interface="com.domain.dao.PersonDao"
          implementation="com.domain.dao.sqlmap.SqlMapPersonDao"/>
          <dao interface="com.domain.dao.BusinessDao"
          implementation="com.domain.dao.sqlmap.SqlMapBusinessDao"/>
          <dao interface="com.domain.dao.AccountDao"
          implementation="com.domain.dao.sqlmap.SqlMapAccountDao"/>
          </context>
          </daoConfig>
          一個(gè)dao.xml里可以有多個(gè)context,通常一個(gè)上下文指定一個(gè)特定的dataSource
          為了去管理多樣的配置(因?yàn)橛胁煌沫h(huán)境),你可以使用可選的元素<properties).
          這個(gè)允許使用占用符,例如:
          driver=org.postgresql.Driver
          url=jdbc:postgresql://localhost:5432/test
          這時(shí)你可以在dao.xml里用占用符取代具體的值,例如上面的可以改寫(xiě)成下面的
          <property name="JDBC.Driver" value="${driver}"/>
          <property name="JDBC.ConnectionURL" value="${url}"/>
          在上下文當(dāng)中,第一個(gè)context里同使用的是jdbc事物控制,所以在指定的property元素也要使用jdbc,不同的事

          物管理實(shí)現(xiàn)會(huì)需要不同的properties,

          事物管理實(shí)現(xiàn)(Transaction Manager Implementation and Configuration)是一個(gè)組件會(huì)管理pool(事物對(duì)象)

          ,一事物管理通常只是包裝特定的DataSource,簡(jiǎn)單的事物通常包裝一特定的實(shí)現(xiàn)類如jdbc連接實(shí)現(xiàn)

          jdbc Transaction Manager:利用提供的datasource api提供連接池服務(wù)
          有三種datasource是支持的(simple,dbcp,jndi),simple是實(shí)現(xiàn)了ibatis的SimpleDataSource。dbcp使用了

          jakarta dbcp datasource,最后,jndi是實(shí)現(xiàn)了查找datasource是從jndi上去查
          下面是不同的配置方法
          <!-- Example iBATIS SimpleDataSource JDBC Transaction Manager -->
          <transactionManager type="JDBC">
          <property name="DataSource" value="SIMPLE"/>
          <property name="JDBC.Driver" value="${driver}"/>
          <property name="JDBC.ConnectionURL" value="${url}"/>
          <property name="JDBC.Username" value="${username}"/>
          <property name="JDBC.Password" value="${password}"/>
          <property name="JDBC.DefaultAutoCommit" value="true" />
          <!-- The following are optional -->
          <property name="Pool.MaximumActiveConnections" value="10"/>
          <property name="Pool.MaximumIdleConnections" value="5"/>
          <property name="Pool.MaximumCheckoutTime" value="120000"/>
          <property name="Pool.TimeToWait" value="10000"/>
          <property name="Pool.PingQuery" value="select * from dual"/>
          <property name="Pool.PingEnabled" value="false"/>
          <property name="Pool.PingConnectionsOlderThan" value="0"/>
          <property name="Pool.PingConnectionsNotUsedFor" value="0"/>
          </transactionManager>

          <!-- Example Jakarta DBCP JDBC Transaction Manager -->
          <transactionManager type="JDBC">
          <property name="DataSource" value="DBCP"/>
          <property name="JDBC.Driver" value="${driver}"/>
          <property name="JDBC.ConnectionURL" value="${url}"/>
          <property name="JDBC.Username" value="${username}"/>
          <property name="JDBC.Password" value="${password}"/>
          <property name="JDBC.DefaultAutoCommit" value="true" />
          <!-- The following are optional -->
          <property name="Pool.MaximumActiveConnections" value="10"/>
          <property name="Pool.MaximumIdleConnections" value="5"/>
          <property name="Pool.MaximumWait" value="60000"/>
          <!-- Use of the validation query can be problematic. If you have difficulty, try without it. -->
          <property name="Pool.ValidationQuery" value="select 1 from ACCOUNT"/>
          <property name="Pool.LogAbandoned" value="false"/>
          <property name="Pool.RemoveAbandoned" value="false"/>
          <property name="Pool.RemoveAbandonedTimeout" value="50000"/>
          </transactionManager>


          <!-- Example JNDI DataSource JDBC Transaction Manager -->
          <transactionManager type="JDBC">
          <property name="DataSource" value="JNDI"/>
          <property name="DBJndiContext" value="java:comp/env/jdbc/MyDataSource"/>
          </transactionManager>

          jta管理事物:它使用的是jta api.實(shí)種實(shí)現(xiàn)總是需要通過(guò)jndi去獲得datasource和一個(gè)UserTransaction實(shí)例也

          是通過(guò)jndi訪問(wèn)的,因些需要在服務(wù)器配置一下,不過(guò)這使得配置dao框架十分簡(jiǎn)單了。下面是一個(gè)簡(jiǎn)單的配置
          <transactionManager type="JTA">
          <property name="DBJndiContext" value="java:comp/env/jdbc/MyDataSource"/>
          <property name="UserTransaction" value="java:comp/env/UserTransaction"/>
          </transactionManager>

          sqlmap管理事物:通過(guò)dao框架包裝sql maps事物服務(wù),所有的你都要指定一個(gè)sql maps配置文件。下面是一個(gè)簡(jiǎn)

          單的配置
          <transactionManager type="SQLMAP">
          <property name="SqlMapConfigResource" value="com/domain/dao/sqlmap/SqlMapConfig.xml"/>
          </transactionManager>

          hibernate管理事物:同樣的,通過(guò)dao框架包裝hibernate事物服務(wù),基本上properties在配置文件當(dāng)中和

          hibernate.properties文件是一樣的,另外,持久化類(你可能通過(guò)添加到hibernate配置文件當(dāng)中去的)要

          以"class."開(kāi)頭,下面是一個(gè)例子:
          <transactionManager type="HIBERNATE">
          <property name="hibernate.dialect" value="net.sf.hibernate.dialect.PostgreSQLDialect"/>
          <property name="hibernate.connection.driver_class" value="${driver}"/>
          <property name="hibernate.connection.url" value="${url}"/>
          <property name="hibernate.connection.username" value="${username}"/>
          <property name="hibernate.connection.password" value="${password}"/>
          <property name="class.1" value="com.domain.Person"/>
          <property name="class.2" value="com.domain.Business"/>
          <property name="class.3" value="com.domain.Account"/>
          </transactionManager>

          external 管理事物:允許使用dao框架控制。這個(gè)執(zhí)行基本是沒(méi)有行為,因些不需要properties,如果你使用一個(gè)

          flat file,你可以使用external事物管理,
          <transactionManager type="EXTERNAL"/>

          dao實(shí)現(xiàn)模板:你可能要問(wèn)我怎么使用上面的事物,好了每一種事物類型都要相應(yīng)的dao模板與之對(duì)應(yīng)。例如:

          jta,jdbc模板提供簡(jiǎn)單的訪問(wèn)jdbc連接對(duì)象。相似的sqlmap模板提供訪問(wèn)簡(jiǎn)單的SqlMapExecutor實(shí)例,而

          hibernate template提供訪問(wèn)Session object.
          使用dao template完全是可選的,但99%的時(shí)間里,是不可不選擇的/

          更多的模板請(qǐng)看下面的.
          DaoManager編程:iBATIS dao框架有許多的目的.第一個(gè),它試圖持久層的細(xì)節(jié).這包括所有的接口,實(shí)現(xiàn)和異

          常細(xì)節(jié)(在你的持久層解決方案當(dāng)中).
          例如:如果你使用jdbc,dao框架將為你隱藏類如DataSource,Connection和SQLException.類似的,如果你使用

          Hibernate orm,dao框架會(huì)為你隱藏類如Configuration,SessionFactory,Session和HibernateException.所有的

          這些細(xì)節(jié)都會(huì)隱藏到了dao接口層.甚至在顯示層的許多的datasource也會(huì)被隱藏.
          第二個(gè)目的是:簡(jiǎn)化持久層編程模型,使在同一時(shí)間保持一致.不同的持久層解決方案有不同的編程語(yǔ)義和行為.
          dao框架試圖隱藏更多,允許在你的應(yīng)用service和domain層,寫(xiě)出一致的風(fēng)格.

          DaoManager類負(fù)責(zé)dao框架的配置文件(通過(guò)dao.xml),另外,DaoManage扮演著中心門(mén)面的角色,它特殊之處是,還提

          供方法允許你訪問(wèn)事物和dao實(shí)例.

          讀取配置文件:
          使用DaoManagerBuilder類的靜態(tài)方法buildDaoManager()方法讀取dao.xml文件,buildDaoManager()方法需要一個(gè)

          Reader實(shí)例作為參數(shù).
          例如:
          Reader reader = new FileReader(C:/myapp/dao.xml);
          DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);

          如在web應(yīng)用環(huán)境當(dāng)中(或其它),一般配置文件都會(huì)從classpath當(dāng)中去加載的.我們可以使用

          com.ibatis.common.resources.Resources類
          Reader reader = Resources.getResourceAsReader(“com/domain/config/dao.xml”);
          DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);

          Context和DaoManager
          DaoManager實(shí)例是從dao.xml文件建立的.當(dāng)你需要一個(gè)dao實(shí)例時(shí),你可以通過(guò)DaoManager,和事物控制也會(huì)從它此

          處提供的.因些不需直接訪問(wèn)context和事物管理..
          你的dao知道它怎么去做.類似的,需要看你的daos怎么工作的,事物會(huì)恰當(dāng)?shù)拈_(kāi)始和提交的.而且,事物僅在你的dao

          被調(diào)用時(shí)才啟動(dòng).

          獲取dao實(shí)例
          一旦你得到了DaoManager實(shí)例,你就可以根據(jù)dao名字,利用DaoManager的getDao方法獲取該dao實(shí)例了,如:
          ProductDao productDao = (ProductDao) daoManager.getDao (ProductDao.class);

          DaoManager提供了處理事務(wù)的方法.這些方法允許你劃分事務(wù),和避免傳遞事務(wù)對(duì)象(eg:jdbc Connction)到你的所

          有的daos當(dāng)中去.例如:
          ProductDao productDao = (ProductDao) daoManager.getDao (ProductDao.class);
          try {
          daoManager.startTransaction();
          Product product = productDao.getProduct (5);
          product.setDescription (“New description.”);
          productDao.updateProduct(product);
          daoManager.commitTransaction();
          } finally {
          daoManager.endTransaction();
          }
          調(diào)用startTransaction()只是讓DaoManager知道,你將要啟動(dòng)編程控制事務(wù).
          dao實(shí)例化時(shí)才啟動(dòng)事務(wù)的,甚至事務(wù)僅僅是contexts需要的時(shí)候.
          commitTransaction()提交事務(wù),endTransaction()需要在try{}catch(){}里面的,,
          如果發(fā)現(xiàn)了異常,那么就會(huì)回滾.

          自動(dòng)提交事務(wù)
          像jdbc的setAutoCommit(true)一樣,不過(guò)也有不同之處,你可以使用多個(gè)update作為一個(gè)事務(wù),你不需要指定提交

          的行為方式,只要你不調(diào)用startTransaction()就行了
          Product product = productDao.getProduct (5); // Transaction 1
          product.setDescription (“New description.”);
          productDao.updateProduct(product); // Transaction 2
          product = productDao.getProduct (5); // Transaction 3
          注意了,這里沒(méi)有異常的事件發(fā)生的,如發(fā)生異常,就會(huì)回滾,和釋放連接資源的.

          實(shí)現(xiàn)自己的dao接口:
          dao接口非常的簡(jiǎn)單,因?yàn)樗鼪](méi)有聲名任何的方法,只是一個(gè)marker interface,所以實(shí)現(xiàn)的只是你自己的接口罷了,

          在你的接口當(dāng)中沒(méi)有限制你要定的任何方法,拋出的異常是運(yùn)行期的DaoException類型的異常.
          An example of a good Dao interface is:
          public interface ProductDao extends Dao {
          // Updates
          public int updateProduct (Product product); // DAO Framework code may throw DaoException
          public int insertProduct (Product product);
          public int deleteProduct (int productId);
          /
          / Queries
          public Product getProduct (int productId);
          public List getProductListByProductDescription (String description);
          }

          Templates和Implementations
          在上面也提到了,每一種模板都對(duì)應(yīng)一種特殊的Transaction Manager.
          每一種模板提供了一種便利的方法去交互.
          template Class?????? Transaction Manager??????? Convenience Method
          JdbcDaoTemplate????? JDBC?????????????????????? Connection getConnection()
          JtaDaoTemplate?????? JTA??????????????????????? Connection getConnection();
          SqlMapDaoTemplate??? SQLMAP???????????????????? SqlMapExecutor getSqlMapExecutor()
          HibernateDaoTemplate? HIBERNATE??????????? ?Session getSession()

          The following is an example implementation using the SqlMapDaoTemplate:
          public class SqlMapProductDao implements ProductDao extends SqlMapDaoTemplate {
          public SqlMapProductDao (DaoManager daoManager) {
          super (daoManager);
          }
          /
          * Insert method */
          public int updateProduct (Product product) {
          try {
          getSqlMapExecutor().insert (“insertProduct”, product);
          } catch (SQLException e) {
          throw new DaoException (“Error inserting product. Cause: “ + e, e);
          }
          }
          /
          / … assume remaining methods to save space
          }
          注意:在上面的例子里只有一些個(gè)構(gòu)造器,參數(shù)為DaoManager,它是在初始化實(shí)例時(shí)通過(guò)DaoManagerBuilder自動(dòng)注

          入?yún)?shù)進(jìn)去..第一個(gè)需要DaoManager作為構(gòu)造器的參數(shù),也就迫使它的子類都要一個(gè)帶參(DaoManager)的構(gòu)造器,

          當(dāng)你使用模板時(shí),構(gòu)造器是必須的,你不需要提供其它的構(gòu)造器了..你的daos僅僅需要DaoManagerBuilder去實(shí)例化

          它.

          考慮dao的設(shè)計(jì)方式:
          推薦使用一個(gè)繼承dao接口的接口,另一個(gè)為一個(gè)繼承dao接口的抽象類(封閉一些異常,事務(wù)等等)..
          實(shí)際上你只需要一個(gè)就行了,另外你也可以選擇下面這種方式..
          你可以使用BaseJdbcDao(abstract)繼承dao接口,需讓ProductDao不要去斷承dao接口,讓ProductJdbcDao去實(shí)現(xiàn)

          ProductDao和繼承BaseJdbcDao就可以了,讓Product接口仍然與dao分離開(kāi)來(lái)....
          在上面的例子當(dāng)中可以將BaseJdbcDao繼承JdbcDaoTemplate(它已經(jīng)實(shí)現(xiàn)了dao接口)


          現(xiàn)在做一個(gè)例子:
          create table test
          (
          id int auto_increment;
          name varchar(20)
          );

          建一個(gè)對(duì)應(yīng)的vo
          package zhai;

          public class test {
          ?int id;
          ?String name;
          public int getId() {
          ?return id;
          }
          public void setId(int id) {
          ?this.id = id;
          }
          public String getName() {
          ?return name;
          }
          public void setName(String name) {
          ?this.name = name;
          }
          }

          建一個(gè)配置數(shù)據(jù)庫(kù)的配置文件
          config.xml
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE sqlMapConfig
          ??? PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
          ??? "
          <sqlMapConfig>
          ? <transactionManager type="JDBC">
          ??? <dataSource type="SIMPLE">
          ????? <property value="com.mysql.jdbc.Driver" name="JDBC.Driver"/>
          ????? <property value="jdbc:mysql://localhost:3306/test" name="JDBC.ConnectionURL"/>
          ????? <property value="root" name="JDBC.Username"/>
          ????? <property value="root" name="JDBC.Password"/>
          ??? </dataSource>
          ? </transactionManager>
          ? <sqlMap url="file:C:\Test\sql.xml"/>
          </sqlMapConfig>


          --
          sql.xml

          --------
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
          ??? "

          <sqlMap namespace="test">
          ? <typeAlias alias="test" type="test.test"/>
          ? <select id="getByName" resultClass="test" parameterClass="string">
          ??? SELECT
          ???? ID,
          ???? NAME
          ??? FROM TEST
          ??? WHERE NAME = #name#
          ? </select>
          </sqlMap>

          ----------------
          ------------------
          package zhai;

          public interface MyDao {
          ? public void MyInsert(test t);
          }
          ==================
          package zhai;

          import java.sql.SQLException;

          import com.ibatis.dao.client.DaoManager;
          import com.ibatis.dao.client.template.SqlMapDaoTemplate;

          public class TestDao extends SqlMapDaoTemplate implements MyDao{

          ?public TestDao(DaoManager arg0) {
          ??super(arg0);
          ??// TODO Auto-generated constructor stub
          ?}

          ?public void MyInsert(test t) {
          ??try {
          ???getSqlMapExecutor().insert ("insertTest",t);
          ??} catch (SQLException e) {
          ???System.out.println("插入時(shí)出異常");
          ???e.printStackTrace();
          ??}
          ?}

          }

          ============
          package zhai;
          import java.io.*;

          import com.ibatis.sqlmap.client.*;
          public class TestDemo {

          ?public static void main(String[] args) throws Exception {
          ??Reader reader=new FileReader("C:\\Test\\config.xml");
          ???? SqlMapClient sqlmap=SqlMapClientBuilder.buildSqlMapClient(reader);
          ???? test emp = (test) sqlmap.queryForObject("getById", new Integer(1));
          ??????? System.out.println("歡迎你="+emp.getName());
          ?}

          }
          -------------------------------------------------

          -------------------------------------------------

          -------------------------------------------------

          -------------------------------------------------

          -------
          寫(xiě)一個(gè)運(yùn)行dao的
          <!DOCTYPE daoConfig
          PUBLIC "-//iBATIS.com//DTD DAO Configuration 2.0//EN"
          "
          <daoConfig>
          <!-- Example JDBC DAO Configuration -->
          <context>
          ??? <transactionManager type="SQLMAP">
          ???? <property name="SqlMapConfigResource" value="zhai/config.xml"/>
          ??? </transactionManager>
          <dao interface="zhai.MyDao" implementation="zhai.TestDao"/>
          </context>
          </daoConfig>
          ----------------------
          --------------------
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
          ??? "

          <sqlMap namespace="test">
          ? <typeAlias alias="test" type="zhai.test"/>
          ? <select id="getById" resultClass="test" parameterClass="int">
          ??? SELECT
          ???? ID,
          ???? NAME
          ??? FROM TEST
          ??? WHERE ID = #id#
          ? </select>
          ? <insert id="insertTest" parameterClass="test">
          ??? insert into TEST (NAME) values (#name#)
          ? </insert>
          ?
          </sqlMap>
          --------------------------------------------------------------------------------------------------

          ---------------------------------------------
          package zhai;
          import java.io.*;

          import com.ibatis.dao.client.DaoManager;
          import com.ibatis.dao.client.DaoManagerBuilder;
          import com.ibatis.sqlmap.client.*;
          public class TestDemo {

          ?public static void main(String[] args) throws Exception {
          ??????????????? //Reader reader = Resources.getResourceAsReader("zhai/dao.xml");
          ??Reader reader=new FileReader("C:\\Test\\dao.xml");
          ??DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);
          ??MyDao testdao = (MyDao) daoManager.getDao(MyDao.class);
          ??test t=new test();
          ??t.setName("test");
          ??testdao.MyInsert(t);
          ?}

          }


          注意了如果你用的是
          Reader reader = Resources.getResourceAsReader("zhai/dao.xml");
          那么你就得注意事了,dao.xml要放在項(xiàng)目的bin目錄下面,否則就會(huì)出錯(cuò)
          還有在dao.xml里的? <transactionManager type="SQLMAP">
          ???? <property name="SqlMapConfigResource" value="zhai/config.xml"/>
          ??? </transactionManager>
          也是一個(gè)道理呀


          評(píng)論

          # re: 學(xué)習(xí)一下ibaties 2006-07-24 10:35 Compass
          拜托,專業(yè)點(diǎn),先把名字寫(xiě)對(duì)  回復(fù)  更多評(píng)論
            

          # re: 學(xué)習(xí)一下ibatis 2006-07-25 14:02 劍事
          我在自己的網(wǎng)站應(yīng)用了ibatis 感覺(jué)還不錯(cuò) 結(jié)合Spring比較好
          http://www.migti.com  回復(fù)  更多評(píng)論
            

          # re: 學(xué)習(xí)一下ibatis 2006-07-31 17:08 蜘蛛小子
          劍事大哥,我知道你剛從德國(guó)留學(xué)畢業(yè)了,
          恭喜你呀!我現(xiàn)在還沒(méi)有具體的把ibatis用到工程里去,而且現(xiàn)在這方面的資料又不多,聽(tīng)說(shuō)現(xiàn)在進(jìn)在出一本ibatis in action,不過(guò)現(xiàn)在好像還沒(méi)有出來(lái),,不知道你那里有沒(méi)有相關(guān)的資料,,分享一下好么,,我的郵箱javazhai@126.com  回復(fù)  更多評(píng)論
            

          # re: 學(xué)習(xí)一下ibatis 2006-08-03 07:24 劍事
          你從哪聽(tīng)說(shuō)我去德國(guó)留學(xué)????????????

          我很是吃驚啊

          我只有官方的中文指南比較全  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 庐江县| 库尔勒市| 景泰县| 新兴县| 乾安县| 米脂县| 上虞市| 淅川县| 北碚区| 榆林市| 玛沁县| 皮山县| 重庆市| 博罗县| 罗田县| 米易县| 长寿区| 茶陵县| 蒙阴县| 乌拉特中旗| 垣曲县| 古浪县| 漳浦县| 天气| 庆阳市| 镇平县| 五家渠市| 怀集县| 吉木萨尔县| 汉阴县| 甘南县| 陆良县| 历史| 大田县| 封开县| 康定县| 屯门区| 平凉市| 青海省| 陇西县| 康乐县|