锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
ibatis鐨勭綉绔?br />www.ibatis.com涓婇潰鍙互鎵懼埌寰堝ソ鐨勬枃妗o紝鍐嶅姞涓婃湁闈炲父涓嶉敊鐨勪緥瀛愶紝鎵浠ヤ嬌鐢ㄦ槸鐩稿綋鐨勭畝鍗曘?br />sourceforge涓婇潰鐨勮璁?br />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
鐜涓嬬殑tomcat + apache閰嶇疆(緇濆瀹炶返鎿嶄綔鐗?
ibatis澶т綋涓婂彲浠ュ垎涓轟袱涓儴鍒?SQL Maps + Data Access Objects
鎴戠幇鍦ㄧ殑欏圭洰涓兘鐢ㄥ埌浜嗭紝瀹冩彁渚涚殑jpetstore灝變嬌鐢ㄤ簡db layer,鍙互鍙傝冨畠鐨勫疄鐜版柟寮忋?br />涓嶈繃鎴戣寰梛petstore鐨刣b layer瀹炵幇鏂瑰紡榪樹笉鏄お濂斤紝鑷沖皯瀹冪殑涓氬姟閫昏緫灞傚拰dao灞傛病鏈夋槑鏄懼尯鍒嗭紝鍦ㄥ疄鐜版瘮杈?/p>
澶х殑欏圭洰鐨勬椂鍊欓犳垚浜嗙▼搴忕殑娣蜂貢錛屽鏋滄病鏈変竴涓壇濂界殑妯″紡鏉ュ疄鐜癲b layer 鐨勬椂鍊欙紝紜疄浼氶犳垚鏁堢巼鐨勪綆涓嬶紝
鏈変簡鑹ソ鐨勬灦鏋勶紝閫熷害紜疄寰堝揩錛堢壒鍒槸SQL Maps + Data Access Objects 閮戒嬌鐢ㄧ殑鎯呭喌錛?br />BO灞傜殑璁捐宸茬粡涓嶆槸浠涔堟柊椴滅殑浜嗭紝浣嗘垜瑙夊緱瀹冪‘瀹炲彲浠ュ緢濂界殑鍜孌aoManager緇撳悎璧鋒潵錛岄氳繃DaoManager->SQL
map->jdbc
瀹冪殑涓や釜鏍稿績鐨勯厤緗枃浠訛細dao.xml+SqlMapConfig.xml
閫氳繃鐏墊椿鐨勯厤緗枃浠剁殑緇勫悎鍙互瀹炵幇鏁版嵁搴撲笉鍚岀殑璁塊棶緇勫悎
姣斿錛氫竴涓猟ao.xml鍙互瀵瑰簲澶氫釜SqlMapConfig.xml
涓涓猟ao.xml鍙搴斾竴涓暟鎹簱錛屽涓猟ao.xml灝卞彲浠ヨ闂涓暟鎹簱浜嗭紙瀹冪殑petstore灝辨彁渚涗簡婕旂ずdistributed
鍔熻兘鐨勬牱渚嬫槸oracle+ms sql錛?br />瀹冪殑SqlMapConfig.xml涓彲閰嶇疆sql-map resource錛屽氨鏄厤緗綘鍏蜂綋鐨剆ql璇彞鐨剎ml鏂囦歡銆?br />瀹冪殑sqlMap鎻愪緵寰堝鏂規硶鏉ヨ闂暟鎹簱錛岀洿鎺ヨ繑鍥炰綘鎯寵鐨勭粨鏋?/p>
***************************
DAO涓殑涓涓緵鍒嗛〉鏌ヨ鐨勬柟娉?br />***************************
......
SqlMap sqlMap = getSqlMapFromLocalTransaction();//鍙栧埌褰撳墠sqlmap瀵硅薄
List list=sqlMap.executeQueryForList("浣犵殑MappedStatement鏂囦歡涓璼ql璇彞鐨勫悕縐?, object("浣犲彲浠ラ氳繃榪?/p>
涓猳bject浼犱竴浜涙煡璇㈡潯浠?),skipResults,maxResults);
...
鏈変簡鑹ソ鐨勮璁℃ā寮忥紝瀹冨彲浠ュ拰struts瀹岀編緇撳悎鍦ㄤ竴璧鳳紝鏃犺鏄晥鐜囪繕鏄竻鏅板瀷涓婏紝閮介潪甯鎬護浜烘弧鎰忕殑
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)鍏佽浣犲幓鍒涘緩綆鍗曠殑緇勪歡錛屼負浣犺闂綘鐨勬暟鎹紝鑰屼笉鐢ㄥ幓瀹炵幇鍏蜂綋鐨勫疄鐜扮粏鑺傘備嬌鐢?/p>
DAOS浣犺兘鍔ㄦ侀厤緗笉鍚岀殑鎸佷箙灞傛満鍒躲?br />娉ㄦ剰錛欴AO妗嗘灦涓巗qlmaps妗嗘灦鏄畬鍏ㄧ殑鍒嗙寮鍜屼簰涓嶄緷璧栨э紝鎵浠ヤ綘鍙互鍗曠嫭浣跨敤錛屾垨涓璧鋒潵鐢ㄩ兘娌℃湁鍏崇郴.
涓嬮潰鏄竴浜涢噸瑕佺殑daos api
DaoManager(Facade妯″紡):璐熻矗閰嶇疆DAO妗嗘灦瀹炰緥錛堢粡榪嘾ao.xml),鍦ㄥ叾瀹僡pi褰撲腑鍏呭綋facade.
DaoTransaction(Marker Interface):閫氱敤鐨勬帴鍙o紝涓轟簡鍘諱嬌鐢ㄤ簨鐗╋紙榪炴帴錛夛紝閫氱敤鐨勫疄鐜板皢鍖呰jdbc鐨勮繛鎺ュ璞?/p>
.
DaoException(RuntimeException榪愯鏈熷紓甯?:鎵鏈夌殑鏂規硶鍜岀被鍏ㄩ儴鎶涘嚭dao api涓撴湁鐨勫紓甯搞?br />Dao(Marker Interface):涓涓爣璁版帴鍙d緵鎵鏈夌殑dao鍘誨疄鐜幫紝榪欎釜鎺ュ彛蹇呴』涓烘墍鏈夌殑dao綾誨幓瀹炵幇銆傝繖涓帴鍙f病鏈?/p>
澹板悕浠諱綍鏂規硶琚疄鐜幫紝鍙槸鍏呭綋涓涓爣璁幫紙渚嬪錛氫竴浜汥aoFactory鍘昏京鍒笉鍚岀殑綾?;
-----------------------------------
jdbc浜嬪姟鎺у埗瀹炵幇
sqlmap:閫氳繃sqlmaps妗嗘灦鍜屽畠鐨勪簨鐗╃鐞嗘湇鍔″幓瀹炵幇錛屽寘鎷笉鍚岀殑DataSource鍜屼簨鐗╃鐞嗛厤緗?br />hibernate:鎻愪緵綆鍗曞鏄撶殑鍜宧ibernate,瀹冪殑浜嬬墿宸ュ叿錛圫essionFactory,Session,Transaction)鏁村悎
jdbc:閫氳繃jdbc api錛屼嬌鐢ㄥ畠鐨勫熀鏈殑dataSource鍜孋onnction鎺ュ彛鍘葷鐞嗕簨鐗?br />jta:綆$悊鍒嗛儴寮忎簨鐗╋紝闇瑕佽綆$悊鐨刣atasource錛岃繖鏍峰瓙鍙互閫氳繃jndi璁塊棶.
external:鍏佽浜嬬墿琚閮ㄦ帶鍒?/p>
dao.xml涓洪厤緗枃浠?http://www.ibatis.com/dtd/dao-2.dtd)
DaoManager璐熻矗閰嶇疆dao妗嗘灦銆侱aoManager綾誨彲浠ヤ負妗嗘灦瑙f瀽鐗瑰畾鐨剎ml鏂囦歡錛岃屾彁渚涘嚭鏈夌敤鐨勪俊鎭緵妗嗘灦浣跨敤銆?/p>
閭d箞閰嶇疆鏂囦歡(xml鏂囦歡)闇瑕佹寚瀹氫笅闈㈢殑鍐呭:
1)dao鐨勪笂涓嬫枃
2)浜嬬墿涓烘瘡涓涓笂涓嬫枃浠剁殑瀹炵幇
3)TransactionManager閰嶇疆灞炴?br />4)Dao涓烘瘡涓涓疄鐜扮殑dao鎺ュ彛
涓涓狣ao涓婁笅鏂囨槸涓緇勭浉鍏崇殑閰嶇疆淇℃伅鍜孌ao瀹炵幇銆傞氬父涓涓笂涓嬫枃鍏寵仈鍒頒竴涓暟鎹簮(datasource)鎴栦竴涓枃浠躲?br />dao閰嶇疆鏂囦歡錛堥氬父琚彨鍋歞ao.xml錛屼絾涓嶆槸蹇呴』鐨?,涓轟笅闈㈢殑緇撴瀯
<!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>
涓涓猟ao.xml閲屽彲浠ユ湁澶氫釜context,閫氬父涓涓笂涓嬫枃鎸囧畾涓涓壒瀹氱殑dataSource
涓轟簡鍘葷鐞嗗鏍風殑閰嶇疆錛堝洜涓烘湁涓嶅悓鐨勭幆澧冿級錛屼綘鍙互浣跨敤鍙夌殑鍏冪礌<properties).
榪欎釜鍏佽浣跨敤鍗犵敤絎︼紝渚嬪錛?br />driver=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/test
榪欐椂浣犲彲浠ュ湪dao.xml閲岀敤鍗犵敤絎﹀彇浠e叿浣撶殑鍊鹼紝渚嬪涓婇潰鐨勫彲浠ユ敼鍐欐垚涓嬮潰鐨?br /><property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
鍦ㄤ笂涓嬫枃褰撲腑錛岀涓涓猚ontext閲屽悓浣跨敤鐨勬槸jdbc浜嬬墿鎺у埗錛屾墍浠ュ湪鎸囧畾鐨刾roperty鍏冪礌涔熻浣跨敤jdbc錛屼笉鍚岀殑浜?/p>
鐗╃鐞嗗疄鐜頒細闇瑕佷笉鍚岀殑properties,
浜嬬墿綆$悊瀹炵幇(Transaction Manager Implementation and Configuration)鏄竴涓粍浠朵細綆$悊pool錛堜簨鐗╁璞★級
錛屼竴浜嬬墿綆$悊閫氬父鍙槸鍖呰鐗瑰畾鐨凞ataSource錛岀畝鍗曠殑浜嬬墿閫氬父鍖呰涓鐗瑰畾鐨勫疄鐜扮被濡俲dbc榪炴帴瀹炵幇
jdbc Transaction Manager:鍒╃敤鎻愪緵鐨刣atasource api鎻愪緵榪炴帴姹犳湇鍔?br />鏈変笁縐峝atasource鏄敮鎸佺殑(simple,dbcp,jndi),simple鏄疄鐜頒簡ibatis鐨凷impleDataSource銆俤bcp浣跨敤浜?/p>
jakarta dbcp datasource錛屾渶鍚庯紝jndi鏄疄鐜頒簡鏌ユ壘datasource鏄粠jndi涓婂幓鏌?br />涓嬮潰鏄笉鍚岀殑閰嶇疆鏂規硶
<!-- 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.瀹炵瀹炵幇鎬繪槸闇瑕侀氳繃jndi鍘昏幏寰梔atasource鍜屼竴涓猆serTransaction瀹炰緥涔?/p>
鏄氳繃jndi璁塊棶鐨?鍥犱簺闇瑕佸湪鏈嶅姟鍣ㄩ厤緗竴涓嬶紝涓嶈繃榪欎嬌寰楅厤緗甦ao妗嗘灦鍗佸垎綆鍗曚簡銆備笅闈㈡槸涓涓畝鍗曠殑閰嶇疆
<transactionManager type="JTA">
<property name="DBJndiContext" value="java:comp/env/jdbc/MyDataSource"/>
<property name="UserTransaction" value="java:comp/env/UserTransaction"/>
</transactionManager>
sqlmap綆$悊浜嬬墿錛氶氳繃dao妗嗘灦鍖呰sql maps浜嬬墿鏈嶅姟錛屾墍鏈夌殑浣犻兘瑕佹寚瀹氫竴涓猻ql maps閰嶇疆鏂囦歡銆備笅闈㈡槸涓涓畝
鍗曠殑閰嶇疆
<transactionManager type="SQLMAP">
<property name="SqlMapConfigResource" value="com/domain/dao/sqlmap/SqlMapConfig.xml"/>
</transactionManager>
hibernate綆$悊浜嬬墿:鍚屾牱鐨?閫氳繃dao妗嗘灦鍖呰hibernate浜嬬墿鏈嶅姟,鍩烘湰涓妏roperties鍦ㄩ厤緗枃浠跺綋涓拰
hibernate.properties鏂囦歡鏄竴鏍風殑錛屽彟澶栵紝鎸佷箙鍖栫被錛堜綘鍙兘閫氳繃娣誨姞鍒癶ibernate閰嶇疆鏂囦歡褰撲腑鍘葷殑錛夎
浠?class."寮澶達紝涓嬮潰鏄竴涓緥瀛?
<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妗嗘灦鎺у埗銆傝繖涓墽琛屽熀鏈槸娌℃湁琛屼負錛屽洜浜涗笉闇瑕乸roperties錛屽鏋滀綘浣跨敤涓涓?/p>
flat file,浣犲彲浠ヤ嬌鐢╡xternal浜嬬墿綆$悊,
<transactionManager type="EXTERNAL"/>
dao瀹炵幇妯℃澘錛氫綘鍙兘瑕侀棶鎴戞庝箞浣跨敤涓婇潰鐨勪簨鐗╋紝濂戒簡姣忎竴縐嶄簨鐗╃被鍨嬮兘瑕佺浉搴旂殑dao妯℃澘涓庝箣瀵瑰簲銆備緥濡傦細
jta,jdbc妯℃澘鎻愪緵綆鍗曠殑璁塊棶jdbc榪炴帴瀵硅薄銆傜浉浼肩殑sqlmap妯℃澘鎻愪緵璁塊棶綆鍗曠殑SqlMapExecutor瀹炰緥錛岃?/p>
hibernate template鎻愪緵璁塊棶Session object.
浣跨敤dao template瀹屽叏鏄彲閫夌殑錛屼絾99%鐨勬椂闂撮噷錛屾槸涓嶅彲涓嶉夋嫨鐨?
鏇村鐨勬ā鏉胯鐪嬩笅闈㈢殑.
DaoManager緙栫▼錛歩BATIS銆dao妗嗘灦鏈夎澶氱殑鐩殑錛庣涓涓紝瀹冭瘯鍥炬寔涔呭眰鐨勭粏鑺傦紟榪欏寘鎷墍鏈夌殑鎺ュ彛錛屽疄鐜板拰寮?/p>
甯哥粏鑺傦紙鍦ㄤ綘鐨勬寔涔呭眰瑙e喅鏂規褰撲腑錛?
渚嬪錛氬鏋滀綘浣跨敤jdbc,dao妗嗘灦灝嗕負浣犻殣钘忕被濡侱ataSource,Connection鍜孲QLException.綾諱技鐨勶紝濡傛灉浣犱嬌鐢?/p>
Hibernate orm,dao妗嗘灦浼氫負浣犻殣钘忕被濡侰onfiguration,SessionFactory,Session鍜孒ibernateException.鎵鏈夌殑
榪欎簺緇嗚妭閮戒細闅愯棌鍒頒簡dao鎺ュ彛灞傦紟鐢氳嚦鍦ㄦ樉紺哄眰鐨勮澶氱殑datasource涔熶細琚殣钘?
絎簩涓洰鐨勬槸:綆鍖栨寔涔呭眰緙栫▼妯″瀷,浣垮湪鍚屼竴鏃墮棿淇濇寔涓鑷?涓嶅悓鐨勬寔涔呭眰瑙e喅鏂規鏈変笉鍚岀殑緙栫▼璇箟鍜岃涓?
dao妗嗘灦璇曞浘闅愯棌鏇村,鍏佽鍦ㄤ綘鐨勫簲鐢╯ervice鍜宒omain灞?鍐欏嚭涓鑷寸殑椋庢牸.
DaoManager綾昏礋璐ao妗嗘灦鐨勯厤緗枃浠?閫氳繃dao.xml),鍙﹀,DaoManage鎵紨鐫涓績闂ㄩ潰鐨勮鑹?瀹冪壒孌婁箣澶勬槸,榪樻彁
渚涙柟娉曞厑璁鎬綘璁塊棶浜嬬墿鍜宒ao瀹炰緥.
璇誨彇閰嶇疆鏂囦歡:
浣跨敤DaoManagerBuilder綾葷殑闈欐佹柟娉昩uildDaoManager()鏂規硶璇誨彇dao.xml鏂囦歡,buildDaoManager()鏂規硶闇瑕佷竴涓?/p>
Reader瀹炰緥浣滀負鍙傛暟.
渚嬪:
Reader reader = new FileReader(C:/myapp/dao.xml);
DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);
濡傚湪web搴旂敤鐜褰撲腑(鎴栧叾瀹?,涓鑸厤緗枃浠墮兘浼氫粠classpath褰撲腑鍘誨姞杞界殑.鎴戜滑鍙互浣跨敤
com.ibatis.common.resources.Resources綾?br />Reader reader = Resources.getResourceAsReader(鈥渃om/domain/config/dao.xml鈥?;
DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);
Context鍜孌aoManager
DaoManager瀹炰緥鏄粠dao.xml鏂囦歡寤虹珛鐨?褰撲綘闇瑕佷竴涓猟ao瀹炰緥鏃?浣犲彲浠ラ氳繃DaoManager,鍜屼簨鐗╂帶鍒朵篃浼氫粠瀹冩
澶勬彁渚涚殑.鍥犱簺涓嶉渶鐩存帴璁塊棶context鍜屼簨鐗╃鐞?.
浣犵殑dao鐭ラ亾瀹冩庝箞鍘誨仛.綾諱技鐨?闇瑕佺湅浣犵殑daos鎬庝箞宸ヤ綔鐨?浜嬬墿浼氭伆褰撶殑寮濮嬪拰鎻愪氦鐨?鑰屼笖,浜嬬墿浠呭湪浣犵殑dao
琚皟鐢ㄦ椂鎵嶅惎鍔?
鑾峰彇dao瀹炰緥
涓鏃︿綘寰楀埌浜咲aoManager瀹炰緥,浣犲氨鍙互鏍規嵁dao鍚嶅瓧,鍒╃敤DaoManager鐨刧etDao鏂規硶鑾峰彇璇ao瀹炰緥浜?濡?
ProductDao productDao = (ProductDao) daoManager.getDao (ProductDao.class);
DaoManager鎻愪緵浜嗗鐞嗕簨鍔$殑鏂規硶.榪欎簺鏂規硶鍏佽浣犲垝鍒嗕簨鍔?鍜岄伩鍏嶄紶閫掍簨鍔″璞?eg:jdbc Connction)鍒頒綘鐨勬墍
鏈夌殑daos褰撲腑鍘?渚嬪:
ProductDao productDao = (ProductDao) daoManager.getDao (ProductDao.class);
try {
daoManager.startTransaction();
Product product = productDao.getProduct (5);
product.setDescription (鈥淣ew description.鈥?;
productDao.updateProduct(product);
daoManager.commitTransaction();
} finally {
daoManager.endTransaction();
}
璋冪敤startTransaction()鍙槸璁〥aoManager鐭ラ亾,浣犲皢瑕佸惎鍔ㄧ紪紼嬫帶鍒朵簨鍔?
dao瀹炰緥鍖栨椂鎵嶅惎鍔ㄤ簨鍔$殑,鐢氳嚦浜嬪姟浠呬粎鏄痗ontexts闇瑕佺殑鏃跺?
commitTransaction()鎻愪氦浜嬪姟,endTransaction()闇瑕佸湪try{}catch(){}閲岄潰鐨?,
濡傛灉鍙戠幇浜嗗紓甯?閭d箞灝變細鍥炴粴.
鑷姩鎻愪氦浜嬪姟
鍍廽dbc鐨剆etAutoCommit(true)涓鏍?涓嶈繃涔熸湁涓嶅悓涔嬪,浣犲彲浠ヤ嬌鐢ㄥ涓猽pdate浣滀負涓涓簨鍔?浣犱笉闇瑕佹寚瀹氭彁浜?/p>
鐨勮涓烘柟寮?鍙浣犱笉璋冪敤startTransaction()灝辮浜?br />Product product = productDao.getProduct (5); // Transaction 1
product.setDescription (鈥淣ew description.鈥?;
productDao.updateProduct(product); // Transaction 2
product = productDao.getProduct (5); // Transaction 3
娉ㄦ剰浜?榪欓噷娌℃湁寮傚父鐨勪簨浠跺彂鐢熺殑,濡傚彂鐢熷紓甯?灝變細鍥炴粴,鍜岄噴鏀捐繛鎺ヨ祫婧愮殑.
瀹炵幇鑷繁鐨刣ao鎺ュ彛:
dao鎺ュ彛闈炲父鐨勭畝鍗?鍥犱負瀹冩病鏈夊0鍚嶄換浣曠殑鏂規硶,鍙槸涓涓猰arker interface,鎵浠ュ疄鐜扮殑鍙槸浣犺嚜宸辯殑鎺ュ彛緗簡,
鍦ㄤ綘鐨勬帴鍙e綋涓病鏈夐檺鍒朵綘瑕佸畾鐨勪換浣曟柟娉?鎶涘嚭鐨勫紓甯告槸榪愯鏈熺殑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鍜孖mplementations
鍦ㄤ笂闈篃鎻愬埌浜?姣忎竴縐嶆ā鏉塊兘瀵瑰簲涓縐嶇壒孌婄殑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 (鈥渋nsertProduct鈥? product);
} catch (SQLException e) {
throw new DaoException (鈥淓rror inserting product. Cause: 鈥?+ e, e);
}
}
/
/ 鈥?assume remaining methods to save space
}
娉ㄦ剰:鍦ㄤ笂闈㈢殑渚嬪瓙閲屽彧鏈変竴浜涗釜鏋勯犲櫒,鍙傛暟涓篋aoManager,瀹冩槸鍦ㄥ垵濮嬪寲瀹炰緥鏃墮氳繃DaoManagerBuilder鑷姩娉?/p>
鍏ュ弬鏁拌繘鍘?.絎竴涓渶瑕丏aoManager浣滀負鏋勯犲櫒鐨勫弬鏁?涔熷氨榪嬌瀹冪殑瀛愮被閮借涓涓甫鍙?DaoManager)鐨勬瀯閫犲櫒,
褰撲綘浣跨敤妯℃澘鏃?鏋勯犲櫒鏄繀欏葷殑,浣犱笉闇瑕佹彁渚涘叾瀹冪殑鏋勯犲櫒浜?.浣犵殑daos浠呬粎闇瑕丏aoManagerBuilder鍘誨疄渚嬪寲
瀹?
鑰冭檻dao鐨勮璁℃柟寮?
鎺ㄨ崘浣跨敤涓涓戶鎵縟ao鎺ュ彛鐨勬帴鍙?鍙︿竴涓負涓涓戶鎵縟ao鎺ュ彛鐨勬娊璞$被(灝侀棴涓浜涘紓甯?浜嬪姟絳夌瓑)..
瀹為檯涓婁綘鍙渶瑕佷竴涓氨琛屼簡,鍙﹀浣犱篃鍙互閫夋嫨涓嬮潰榪欑鏂瑰紡..
浣犲彲浠ヤ嬌鐢˙aseJdbcDao(abstract)緇ф壙dao鎺ュ彛,闇璁㏄roductDao涓嶈鍘繪柇鎵縟ao鎺ュ彛,璁㏄roductJdbcDao鍘誨疄鐜?/p>
ProductDao鍜岀戶鎵緽aseJdbcDao灝卞彲浠ヤ簡,璁㏄roduct鎺ュ彛浠嶇劧涓巇ao鍒嗙寮鏉?...
鍦ㄤ笂闈㈢殑渚嬪瓙褰撲腑鍙互灝咮aseJdbcDao緇ф壙JdbcDaoTemplate(瀹冨凡緇忓疄鐜頒簡dao鎺ュ彛)
鐜板湪鍋氫竴涓緥瀛?
create table test
(
id int auto_increment;
name varchar(20)
);
寤轟竴涓搴旂殑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;
}
}
寤轟竴涓厤緗暟鎹簱鐨勯厤緗枃浠?br />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
-------- <sqlMap namespace="test"> ---------------- public interface MyDao { import java.sql.SQLException; import com.ibatis.dao.client.DaoManager; public class TestDao extends SqlMapDaoTemplate implements MyDao{ 聽public TestDao(DaoManager arg0) { 聽public void MyInsert(test t) { } import com.ibatis.sqlmap.client.*; 聽public static void main(String[] args) throws Exception { } 錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛?/p>
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛?/p>
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛?/p>
錛嶏紞錛嶏紞錛嶏紞錛?br />鍐欎竴涓繍琛宒ao鐨?br /><!DOCTYPE daoConfig <sqlMap namespace="test"> --------------------------------------------- import com.ibatis.dao.client.DaoManager; 聽public static void main(String[] args) throws Exception { }
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
聽聽聽 "
聽 <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 void MyInsert(test t);
}
==================
package zhai;
import com.ibatis.dao.client.template.SqlMapDaoTemplate;
聽聽super(arg0);
聽聽// TODO Auto-generated constructor stub
聽}
聽聽try {
聽聽聽getSqlMapExecutor().insert ("insertTest",t);
聽聽} catch (SQLException e) {
聽聽聽System.out.println("鎻掑叆鏃跺嚭寮傚父");
聽聽聽e.printStackTrace();
聽聽}
聽}
============
package zhai;
import java.io.*;
public class TestDemo {
聽聽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());
聽}
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛?/p>
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"
聽聽聽 "
聽 <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.DaoManagerBuilder;
import com.ibatis.sqlmap.client.*;
public class TestDemo {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //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);
聽}
娉ㄦ剰浜嗗鏋滀綘鐢ㄧ殑鏄?br />Reader reader = Resources.getResourceAsReader("zhai/dao.xml");
閭d箞浣犲氨寰楁敞鎰忎簨浜嗭紝dao.xml瑕佹斁鍦ㄩ」鐩殑bin鐩綍涓嬮潰錛屽惁鍒欏氨浼氬嚭閿?br />榪樻湁鍦╠ao.xml閲岀殑聽 <transactionManager type="SQLMAP">
聽聽聽聽 <property name="SqlMapConfigResource" value="zhai/config.xml"/>
聽聽聽 </transactionManager>
涔熸槸涓涓亾鐞嗗憖
]]>
主站蜘蛛池模板:
男女一边摸一边做爽的免费视频|
亚洲av中文无码字幕色不卡
|
一本色道久久88综合亚洲精品高清|
成人免费观看男女羞羞视频|
99免费在线视频|
亚洲精品美女久久777777|
国产一二三四区乱码免费|
国产亚洲人成无码网在线观看|
a毛片免费观看完整|
亚洲av无码av制服另类专区|
无码AV片在线观看免费|
亚洲视频一区在线|
久久久www成人免费毛片|
亚洲日韩精品A∨片无码加勒比|
成全视频在线观看免费高清动漫视频下载
|
国产亚洲情侣一区二区无码AV
|
青柠影视在线观看免费|
国产亚洲成AV人片在线观黄桃|
免费黄色电影在线观看|
亚洲视频在线观看视频|
最新中文字幕电影免费观看|
亚洲a无码综合a国产av中文|
国产乱弄免费视频|
中文字幕视频免费在线观看
|
亚洲最大无码中文字幕|
免费国产在线观看|
成全在线观看免费观看大全|
亚洲国产日韩女人aaaaaa毛片在线|
免费无码A片一区二三区|
成a人片亚洲日本久久|
亚洲精品国产精品乱码不99|
中文字幕免费在线|
日韩精品亚洲专区在线影视|
久久精品夜色噜噜亚洲A∨|
999久久久免费精品播放|
亚洲色偷偷色噜噜狠狠99|
久久久久亚洲精品天堂久久久久久|
2015日韩永久免费视频播放|
亚洲av成人片在线观看|
亚洲国产美国国产综合一区二区|
成人毛片免费观看视频|