锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV成人精品网站在线播放,亚洲精品无码av人在线观看 ,337p日本欧洲亚洲大胆人人http://www.tkk7.com/176142998/category/33690.htmlzh-cnSat, 02 Apr 2011 00:37:30 GMTSat, 02 Apr 2011 00:37:30 GMT60寮鍙憇oap鐨勪竴涓畝鍗曠殑渚嬪瓙http://www.tkk7.com/176142998/archive/2011/04/01/347484.html椋為椋為Fri, 01 Apr 2011 09:21:00 GMThttp://www.tkk7.com/176142998/archive/2011/04/01/347484.htmlhttp://www.tkk7.com/176142998/comments/347484.htmlhttp://www.tkk7.com/176142998/archive/2011/04/01/347484.html#Feedback0http://www.tkk7.com/176142998/comments/commentRss/347484.htmlhttp://www.tkk7.com/176142998/services/trackbacks/347484.html1銆佸緩涓涓狿roject鍙栧悕涓篠OAP
2銆佸皢axis-1_4\webapps\axis\WEB-INF\lib涓嬬殑鎵鏈夋枃浠舵嫹璐濆埌浣犵殑SOAP宸ョ▼鏂囦歡涓?/div>
3銆佹柊寤轟竴涓狧elloWord.java
package com;
public class HelloWord {
public String getHelloWord(userInfo userInfo) {
return "hi!:" + userInfo.getName() + "| " + userInfo.getPassword()
+ " | " + userInfo.getArea();
}
}
 
4銆佹柊寤轟竴涓猽serInfo.java 瀵硅薄
package com;
public class userInfo implements java.io.Serializable{
/**
 * 
 */
private static final long serialVersionUID = -1536718814867769008L;
String name;
String password;
String area;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
}
5銆佸湪WEB-INF\server-config.wsdd 鏂囦歡娣誨姞浠ヤ笅鍐呭錛堟敞鎰忛鑹叉爣璁扮殑鍦版柟鏃惰窡soap鐩稿叧鐨勫湴鏂癸級(jí)
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler type="java:org.apache.axis.handlers.http.URLMapper"
name="URLMapper" />
<service name="HelloWord" provider="java:RPC">
<parameter name="className" value="com.HelloWord" />
<parameter name="allowedMethods" value="getHelloWord" />
<beanMapping languageSpecificType="java:com.userInfo" qname="ns:userInfo" xmlns:ns="urn:BeanService"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
</requestFlow>
</transport>
</deployment> 
6銆亀eb.xml 鍐呭
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Apache-Axis</display-name>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
    </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jws</welcome-file>
</welcome-file-list>
</web-app>
7銆佽闂礬寰?http://localhost:8080/SOAP/services/HelloWord?wsdl
8銆佷嬌鐢╯oapUI 3.6.1 鐢熸垚瀹㈡埛绔疛UNIT嫻嬭瘯浠g爜.榪涜鍗曞厓嫻嬭瘯錛佽緗畇oapui鐨刟xis鍙傛暟
9銆佺敓鎴愬鎴風(fēng)JUNIT嫻嬭瘯浠g爜
 
 
10銆佸皢鐢熸垚鐨勪唬鐮佹斁鍒癝OAP宸ョ▼涓嬨備慨鏀規(guī)祴璇曠敤渚嬨?/div>
 
 
11銆佹墽琛屾祴璇曪紝鏌ョ湅緇撴灉錛?/div>


椋為 2011-04-01 17:21 鍙戣〃璇勮
]]>Spring鐨凧DBCTemplatehttp://www.tkk7.com/176142998/archive/2008/08/12/221507.html椋為椋為Tue, 12 Aug 2008 07:31:00 GMThttp://www.tkk7.com/176142998/archive/2008/08/12/221507.htmlhttp://www.tkk7.com/176142998/comments/221507.htmlhttp://www.tkk7.com/176142998/archive/2008/08/12/221507.html#Feedback1http://www.tkk7.com/176142998/comments/commentRss/221507.htmlhttp://www.tkk7.com/176142998/services/trackbacks/221507.htmlSpring鐨凧DBCTemplate

褰揾ql絳夋煡璇㈡柟寮忎笉鑳芥弧瓚蟲(chóng)ц兘鎴栫伒媧繪х殑瑕佹眰錛屽繀欏諱嬌鐢⊿QL鏃訛紝澶у鏈変笁縐嶉夋嫨錛?/p>

絎竴銆佷嬌鐢℉ibernate 鐨剆ql 鏌ヨ鍑芥暟錛屽皢鏌ヨ緇撴灉瀵硅薄杞負(fù)Entity瀵硅薄銆?/p>

絎簩銆佷嬌鐢℉ibernate Session鐨刧etConnection 鑾峰緱JDBC Connection錛岀劧鍚庤繘琛岀函JDBC API鎿嶄綔錛?/p>

絎笁銆侀夋嫨鎶奡pring鐨凧DBCTemplate浣滀負(fù)涓縐嶅緢涓嶉敊鐨凧DBC Utils鏉ヤ嬌鐢ㄣ?/p>

     JDBCTemplate鐨勪嬌鐢ㄥ緢綆鍗曪紝鍙鍦ˋpplicationContext鏂囦歡閲屽畾涔変竴涓猨dbcTemplate鑺傜偣錛孭OJO鑾峰緱娉ㄥ叆鍚庡彲浠ョ洿鎺ユ墽琛屾搷浣滐紝涓嶉渶瑕佺戶鎵夸粈涔堝熀綾伙紝璇﹁JDBCTemplate鍙傝冩枃妗?sup>銆?/p>

     AplicationContext瀹氫箟錛?/p>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

瀹為檯浣跨敤錛?nbsp;

SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, params);

Tips1錛?/strong> jdbcTemplate鏈夊緢澶氱殑ORM鍖栧洖璋冩搷浣滃皢榪斿洖緇撴灉杞負(fù)瀵硅薄鍒楄〃錛屼絾寰堝鏃跺欒繕鏄渶瑕佽繑鍥濺esultSet錛孲pring鏈夋彁渚涗竴涓被浼糝esultSet鐨?Spring SqlRowSet瀵硅薄銆?/p>

         

Tips2錛?/strong>.娉ㄦ剰jdbcTemplate灝介噺鍙墽琛屾煡璇㈡搷浣滐紝鑾榪涜鏇存柊錛屽惁鍒欏緢瀹規(guī)槗鐮村潖Hibernate鐨勪簩綰х紦瀛樹(shù)綋緋匯?/p>

Chapter 11. 浣跨敤JDBC榪涜鏁版嵁璁塊棶

11.1. 綆浠?/h2>

Spring JDBC鎶借薄妗嗘灦鎵甯︽潵鐨勪環(huán)鍊煎皢鍦ㄤ互涓嬪嚑涓柟闈㈠緱浠ヤ綋鐜幫細(xì)錛堟敞錛氫嬌鐢ㄤ簡(jiǎn)Spring JDBC鎶借薄妗嗘灦涔嬪悗錛屽簲鐢ㄥ紑鍙戜漢鍛樺彧闇瑕佸畬鎴愭枩浣撳瓧閮ㄥ垎鐨勭紪鐮佸伐浣溿傦級(jí)

  1. 鎸囧畾鏁版嵁搴撹繛鎺ュ弬鏁?/p>

  2. 鎵撳紑鏁版嵁搴撹繛鎺?/p>

  3. 澹版槑SQL璇彞

  4. 棰勭紪璇戝茍鎵цSQL璇彞

  5. 閬嶅巻鏌ヨ緇撴灉錛堝鏋滈渶瑕佺殑璇濓級(jí)

  6. 澶勭悊姣忎竴嬈¢亶鍘嗘搷浣?/em>

  7. 澶勭悊鎶涘嚭鐨勪換浣曞紓甯?/p>

  8. 澶勭悊浜嬪姟

  9. 鍏抽棴鏁版嵁搴撹繛鎺?/p>

Spring灝嗘浛鎴戜滑瀹屾垚鎵鏈夊崟璋冧箯鍛崇殑JDBC搴曞眰緇嗚妭澶勭悊宸ヤ綔銆?

11.1.1. Spring JDBC鍖呯粨鏋?/h3>

Spring JDBC鎶借薄妗嗘灦鐢卞洓涓寘鏋勬垚錛?tt class="literal">core銆?dataSource銆?tt class="literal">object浠ュ強(qiáng)support銆?

org.springframework.jdbc.core鍖呯敱JdbcTemplate綾諱互鍙?qiáng)鐩稿叧鐨勫洖璋冩帴鍙eQ坈allback interface錛夊拰綾葷粍鎴愩?

org.springframework.jdbc.datasource鍖呯敱涓浜涚敤鏉ョ畝鍖?tt class="interfacename">DataSource璁塊棶鐨勫伐鍏風(fēng)被錛屼互鍙?qiáng)鍚効U?tt class="interfacename">DataSource鎺ュ彛鐨勭畝鍗曞疄鐜?涓昏鐢ㄤ簬鍗曞厓嫻嬭瘯浠ュ強(qiáng)鍦↗2EE瀹瑰櫒涔嬪浣跨敤JDBC)緇勬垚銆傚伐鍏風(fēng)被鎻愪緵浜?jiǎn)涓浜涢潤(rùn)鎬佹柟娉曪紝璇稿閫氳繃JNDI鑾峰彇鏁版嵁榪炴帴浠ュ強(qiáng)鍦ㄥ繀瑕佺殑鎯呭喌涓嬪叧闂繖浜涜繛鎺ャ傚畠鏀寔緇戝畾綰跨▼鐨勮繛鎺ワ紝姣斿琚敤浜?tt class="classname">DataSourceTransactionManager鐨勮繛鎺ャ?

鎺ヤ笅鏉ワ紝org.springframework.jdbc.object鍖呯敱灝佽浜?jiǎn)鏌ヨ銆佹洿鏂頒互鍙?qiáng)瀛樺偍杩嚱E嬬殑綾葷粍鎴愶紝榪欎簺綾葷殑瀵硅薄閮芥槸綰跨▼瀹夊叏騫朵笖鍙噸澶嶄嬌鐢ㄧ殑銆傚畠浠被浼間簬JDO錛屼笌JDO鐨勪笉鍚屼箣澶勫湪浜庢煡璇㈢粨鏋滀笌鏁版嵁搴撴槸“鏂紑榪炴帴”鐨勩傚畠浠槸鍦?tt class="literal">org.springframework.jdbc.core鍖呯殑鍩虹涓婂JDBC鏇撮珮灞傛鐨勬娊璞°?

鏈鍚庯紝org.springframework.jdbc.support鍖呮彁渚涗簡(jiǎn)涓浜?tt class="classname">SQLException鐨勮漿鎹㈢被浠ュ強(qiáng)鐩稿叧鐨勫伐鍏風(fēng)被銆?

鍦↗DBC澶勭悊榪囩▼涓姏鍑虹殑寮傚父灝嗚杞崲鎴?tt class="literal">org.springframework.dao鍖呬腑瀹氫箟鐨勫紓甯搞傚洜姝や嬌鐢⊿pring JDBC榪涜寮鍙戝皢涓嶉渶瑕佸鐞咼DBC鎴栬呯壒瀹氱殑RDBMS鎵嶄細(xì)鎶涘嚭鐨勫紓甯搞傛墍鏈夌殑寮傚父閮芥槸unchecked exception錛岃繖鏍鋒垜浠氨鍙互瀵逛紶閫掑埌璋冪敤鑰呯殑寮傚父榪涜鏈夐夋嫨鐨勬崟鑾楓?

11.2. 鍒╃敤JDBC鏍稿績(jī)綾誨疄鐜癑DBC鐨勫熀鏈搷浣滃拰閿欒澶勭悊

11.2.1. JdbcTemplate綾?/h3>

JdbcTemplate鏄痗ore鍖呯殑鏍稿績(jī)綾匯傚畠鏇挎垜浠畬鎴愪簡(jiǎn)璧勬簮鐨勫垱寤轟互鍙?qiáng)閲婃攽址ヤ綔锛屼粠鑰岀畝鍖栦簡(jiǎn)鎴戜滑瀵笿DBC鐨勪嬌鐢ㄣ傚畠榪樺彲浠ュ府鍔╂垜浠伩鍏嶄竴浜涘父瑙佺殑閿欒錛屾瘮濡傚繕璁板叧闂暟鎹簱榪炴帴銆侸dbcTemplate灝嗗畬鎴怞DBC鏍稿績(jī)澶勭悊嫻佺▼錛屾瘮濡係QL璇彞鐨勫垱寤恒佹墽琛岋紝鑰屾妸SQL璇彞鐨勭敓鎴愪互鍙?qiáng)鏌ヨ缁撴灉鐨勬彁鍙栧伐浣滅暀缁欐垜浠殑搴旂敤浠g爜銆傚畠鍙互瀹屾垚SQL鏌ヨ銆佹洿鏂頒互鍙?qiáng)璋冪敤瀛樺偍杩嚱E嬶紝鍙互瀵?tt class="interfacename">ResultSet榪涜閬嶅巻騫跺姞浠ユ彁鍙栥傚畠榪樺彲浠ユ崟鑾稪DBC寮傚父騫跺皢鍏惰漿鎹㈡垚org.springframework.dao鍖呬腑瀹氫箟鐨勶紝閫氱敤鐨勶紝淇℃伅鏇翠赴瀵岀殑寮傚父銆?

浣跨敤JdbcTemplate榪涜緙栫爜鍙渶瑕佹牴鎹槑紜畾涔夌殑涓緇勫綰︽潵瀹炵幇鍥炶皟鎺ュ彛銆?tt class="interfacename">PreparedStatementCreator鍥炶皟鎺ュ彛閫氳繃緇欏畾鐨?tt class="interfacename">Connection鍒涘緩涓涓狿reparedStatement錛屽寘鍚玈QL鍜屼換浣曠浉鍏崇殑鍙傛暟銆?tt class="literal">CallableStatementCreateor瀹炵幇鍚屾牱鐨勫鐞嗭紝鍙笉榪囧畠鍒涘緩鐨勬槸CallableStatement銆?tt class="literal">RowCallbackHandler鎺ュ彛鍒欎粠鏁版嵁闆嗙殑姣忎竴琛屼腑鎻愬彇鍊箋?

鎴戜滑鍙互鍦ㄤ竴涓猻ervice瀹炵幇綾諱腑閫氳繃浼犻掍竴涓?tt class="interfacename">DataSource寮曠敤鏉ュ畬鎴怞dbcTemplate鐨勫疄渚嬪寲錛屼篃鍙互鍦╝pplication context涓厤緗竴涓狫dbcTemplate bean錛屾潵渚泂ervice浣跨敤銆傞渶瑕佹敞鎰忕殑鏄?tt class="interfacename">DataSource鍦╝pplication context鎬繪槸閰嶅埗鎴愪竴涓猙ean錛岀涓縐嶆儏鍐典笅錛?tt class="interfacename">DataSource bean灝嗕紶閫掔粰service錛岀浜岀鎯呭喌涓?tt class="interfacename">DataSource bean浼犻掔粰JdbcTemplate bean銆傚洜涓篔dbcTemplate浣跨敤鍥炶皟鎺ュ彛鍜?tt class="interfacename">SQLExceptionTranslator鎺ュ彛浣滀負(fù)鍙傛暟錛屾墍浠ヤ竴鑸儏鍐典笅娌℃湁蹇呰閫氳繃緇ф壙JdbcTemplate鏉ュ畾涔夊叾瀛愮被銆?

JdbcTemplate涓嬌鐢ㄧ殑鎵鏈塖QL灝嗕細(xì)浠?#8220;DEBUG”綰у埆璁板叆鏃ュ織錛堜竴鑸儏鍐典笅鏃ュ織鐨刢ategory鏄?tt class="classname">JdbcTemplate鐩稿簲鐨勫叏闄愬畾綾誨悕錛屼笉榪囧鏋滈渶瑕佸JdbcTemplate榪涜瀹氬埗鐨勮瘽錛屽彲鑳芥槸瀹冪殑瀛愮被鍚嶏級(jí)銆?

11.2.2. NamedParameterJdbcTemplate綾?/h3>

NamedParameterJdbcTemplate綾誨鍔犱簡(jiǎn)鍦⊿QL璇彞涓嬌鐢ㄥ懡鍚嶅弬鏁扮殑鏀寔銆傚湪姝や箣鍓嶏紝鍦ㄤ紶緇熺殑SQL璇彞涓紝鍙傛暟閮芥槸鐢?tt class="literal">'?'鍗犱綅絎︽潵琛ㄧず鐨勩?NamedParameterJdbcTemplate綾誨唴閮ㄥ皝瑁呬簡(jiǎn)涓涓櫘閫氱殑JdbcTemplate錛屽茍浣滀負(fù)鍏朵唬鐞嗘潵瀹屾垚澶ч儴鍒嗗伐浣溿備笅闈㈢殑鍐呭涓昏閽堝NamedParameterJdbcTemplate涓?tt class="classname">JdbcTemplate鐨勪笉鍚屼箣澶勬潵鍔犱互璇存槑錛屽嵆濡備綍鍦⊿QL璇彞涓嬌鐢ㄥ懡鍚嶅弬鏁般?

閫氳繃涓嬮潰鐨勪緥瀛愭垜浠彲浠ユ洿濂藉湴浜?jiǎn)瑙?tt class="classname">NamedParameterJdbcTemplate鐨勪嬌鐢ㄦā寮忥紙鍦ㄥ悗闈㈡垜浠繕鏈夋洿濂界殑浣跨敤鏂瑰紡錛夈?

// some JDBC-backed DAO class...
public int countOfActorsByFirstName(String firstName) {
String sql = "select count(0) from T_ACTOR where first_name = :first_name";
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
return template.queryForInt(sql, namedParameters);
}

鍦ㄤ笂闈緥瀛愪腑錛?tt class="literal">sql鍙橀噺浣跨敤浜?jiǎn)鍛藉悕鍙傛暟鍗犱綅绗?#8220;first_name”錛屼笌鍏跺搴旂殑鍊煎瓨鍦?tt class="literal">namedParameters鍙橀噺涓紙綾誨瀷涓?tt class="classname">MapSqlParameterSource錛夈?

濡傛灉浣犲枩嬈㈢殑璇濓紝涔熷彲浠ヤ嬌鐢ㄥ熀浜嶮ap椋庢牸鐨勫悕鍊煎灝嗗懡鍚嶅弬鏁頒紶閫掔粰NamedParameterJdbcTemplate錛?tt class="classname">NamedParameterJdbcTemplate瀹炵幇浜?tt class="interfacename">NamedParameterJdbcOperations鎺ュ彛錛屽墿涓嬬殑宸ヤ綔灝嗙敱璋冪敤璇ユ帴鍙g殑鐩稿簲鏂規(guī)硶鏉ュ畬鎴愶紝榪欓噷鎴戜滑灝變笉鍐嶈禈榪幫級(jí)錛?

// some JDBC-backed DAO class...
public int countOfActorsByFirstName(String firstName) {
String sql = "select count(0) from T_ACTOR where first_name = :first_name";
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
Map namedParameters = new HashMap();
namedParameters.put("first_name", firstName);
return template.queryForInt(sql, namedParameters);
}

鍙﹀涓涓煎緱涓鎻愮殑鐗規(guī)ф槸涓?tt class="classname">NamedParameterJdbcTemplate浣嶄簬鍚屼竴涓寘涓殑SqlParameterSource鎺ュ彛銆傚湪鍓嶉潰鐨勪唬鐮佺墖鏂腑鎴戜滑宸茬粡鐪嬪埌浜?jiǎn)璇ユ帴鍙g殑瀹炵帋图堝?tt class="classname">MapSqlParameterSource綾伙級(jí)錛?tt class="interfacename">SqlParameterSource鍙互鐢ㄦ潵浣滀負(fù)NamedParameterJdbcTemplate鍛藉悕鍙傛暟鐨勬潵婧愩?tt class="classname">MapSqlParameterSource綾繪槸涓涓潪甯哥畝鍗曠殑瀹炵幇錛屽畠浠呬粎鏄竴涓?tt class="interfacename">java.util.Map閫傞厤鍣紝褰撶劧鍏剁敤娉曚篃灝變笉璦鑷槑浜?jiǎn)锛堝鏋湗q樻湁涓嶆槑浜?jiǎn)鐨勫Q屽彲浠ュ湪Spring鐨凧IRA緋葷粺涓姹傛彁渚涙洿澶氱殑鐩稿叧璧勬枡錛夈?

SqlParameterSource鎺ュ彛鐨勫彟涓涓疄鐜幫紞錛?tt class="classname">BeanPropertySqlParameterSource涓烘垜浠彁渚涗簡(jiǎn)鏇存湁瓚g殑鍔熻兘銆傝綾誨寘瑁呬竴涓被浼糐avaBean鐨勫璞★紝鎵闇瑕佺殑鍛藉悕鍙傛暟鍊煎皢鐢卞寘瑁呭璞℃彁渚涳紝涓嬮潰鎴戜滑浣跨敤涓涓緥瀛愭潵鏇存竻妤氬湴璇存槑瀹冪殑鐢ㄦ硶銆?

// some JavaBean-like class...
public class Actor {
private Long id;
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
public Long getId() {
return this.id;
}
// setters omitted...
}
// some JDBC-backed DAO class...
public int countOfActors(Actor exampleActor) {
// notice how the named parameters match the properties of the above 'Actor' class
String sql = "select count(0) from T_ACTOR where first_name = :firstName and last_name = :lastName";
NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);
return template.queryForInt(sql, namedParameters);
}

澶у蹇呴』鐗㈣涓鐐癸細(xì)NamedParameterJdbcTemplate綾誨唴閮?span class="emphasis">鍖呰浜?jiǎn)涓涓爣鍑嗙殑JdbcTemplate綾匯傚鏋滀綘闇瑕佽闂叾鍐呴儴鐨?tt class="classname">JdbcTemplate瀹炰緥錛堟瘮濡傝闂?tt class="classname">JdbcTemplate鐨勪竴浜涙柟娉曪級(jí)閭d箞浣犻渶瑕佷嬌鐢?tt class="literal">getJdbcOperations()鏂規(guī)硶榪斿洖鐨?span class="emphasis">JdbcOperations鎺ュ彛銆傦紙JdbcTemplate瀹炵幇浜?tt class="interfacename">JdbcOperations鎺ュ彛錛夈?

NamedParameterJdbcTemplate綾繪槸綰跨▼瀹夊叏鐨勶紝璇ョ被鐨勬渶浣充嬌鐢ㄦ柟寮忎笉鏄瘡嬈℃搷浣滅殑鏃跺欏疄渚嬪寲涓涓柊鐨?tt class="classname">NamedParameterJdbcTemplate錛岃屾槸閽堝姣忎釜DataSource鍙厤緗竴涓?tt class="classname">NamedParameterJdbcTemplate瀹炰緥錛堟瘮濡傚湪Spring IoC瀹瑰櫒涓嬌鐢⊿pring IoC鏉ヨ繘琛岄厤緗級(jí)錛岀劧鍚庡湪閭d簺浣跨敤璇ョ被鐨凞AO涓叡浜瀹炰緥銆?

11.2.3. SimpleJdbcTemplate綾?/h3>

[Note] Note

璇鋒敞鎰忚綾繪墍鎻愪緵鐨勫姛鑳戒粎閫傜敤浜嶫ava 5 (Tiger)銆?/em>

SimpleJdbcTemplate綾繪槸JdbcTemplate綾葷殑涓涓寘瑁呭櫒錛坵rapper錛夛紝瀹冨埄鐢ㄤ簡(jiǎn)Java 5鐨勪竴浜涜璦鐗規(guī)э紝姣斿Varargs鍜孉utoboxing銆傚閭d簺鐢ㄦ儻浜?jiǎn)Java 5鐨勭▼搴忓憳錛岃繖浜涙柊鐨勮璦鐗規(guī)ц繕鏄緢濂界敤鐨勩?

SimpleJdbcTemplate 綾誨埄鐢↗ava 5鐨勮娉曠壒鎬у甫鏉ョ殑濂藉鍙互閫氳繃涓涓緥瀛愭潵璇存槑銆傚湪涓嬮潰鐨勪唬鐮佺墖鏂腑鎴戜滑棣栧厛浣跨敤鏍囧噯鐨?tt class="classname">JdbcTemplate榪涜鏁版嵁璁塊棶錛屾帴涓嬫潵浣跨敤SimpleJdbcTemplate鍋氬悓鏍風(fēng)殑浜嬫儏銆?

// classic JdbcTemplate-style...
public Actor findActor(long id) {
String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
RowMapper mapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setId(rs.getLong(Long.valueOf(rs.getLong("id"))));
actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
return actor;
}
};
// normally this would be dependency injected of course...
JdbcTemplate jdbcTemplate = new JdbcTemplate(this.getDataSource());
// notice the cast, and the wrapping up of the 'id' argument
// in an array, and the boxing of the 'id' argument as a reference type
return (Actor) jdbcTemplate.queryForObject(sql, mapper, new Object[] {Long.valueOf(id)});
}

涓嬮潰鏄悓涓鏂規(guī)硶鐨勫彟涓縐嶅疄鐜幫紝鎯熶竴涓嶅悓涔嬪鏄垜浠嬌鐢ㄤ簡(jiǎn)SimpleJdbcTemplate錛岃繖鏍蜂唬鐮佹樉寰楁洿鍔犳竻鏅般?

// SimpleJdbcTemplate-style...
public Actor findActor(long id) {
String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
ParameterizedRowMapper<Actor> mapper = new ParameterizedRowMapper<Actor>() {
// notice the return type with respect to Java 5 covariant return types
public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setId(rs.getLong("id"));
actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
return actor;
}
};
// again, normally this would be dependency injected of course...
SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(this.getDataSource());
return simpleJdbcTemplate.queryForObject(sql, mapper, id);
}

11.2.4. DataSource鎺ュ彛

涓轟簡(jiǎn)浠庢暟鎹簱涓彇寰楁暟鎹紝鎴戜滑棣栧厛闇瑕佽幏鍙栦竴涓暟鎹簱榪炴帴銆?Spring閫氳繃DataSource瀵硅薄鏉ュ畬鎴愯繖涓伐浣溿?DataSource鏄疛DBC瑙勮寖鐨勪竴閮ㄥ垎錛?瀹冭瑙嗕負(fù)涓涓氱敤鐨勬暟鎹簱榪炴帴宸ュ巶銆傞氳繃浣跨敤DataSource錛?Container鎴朏ramework鍙互灝嗚繛鎺ユ睜浠ュ強(qiáng)浜嬪姟綆$悊鐨勭粏鑺備粠搴旂敤浠g爜涓垎紱誨嚭鏉ャ?浣滀負(fù)涓涓紑鍙戜漢鍛橈紝鍦ㄥ紑鍙戝拰嫻嬭瘯浜у搧鐨勮繃紼嬩腑錛屼綘鍙兘闇瑕佺煡閬撹繛鎺ユ暟鎹簱鐨勭粏鑺傘?浣嗗湪浜у搧瀹炴柦鏃訛紝浣犱笉闇瑕佺煡閬撹繖浜涚粏鑺傘傞氬父鏁版嵁搴撶鐞嗗憳?shù)細(xì)甯綘璁揪|ソ鏁版嵁婧愩?

鍦ㄤ嬌鐢⊿pring JDBC鏃訛紝浣犳棦鍙互閫氳繃JNDI鑾峰緱鏁版嵁婧愶紝涔熷彲浠ヨ嚜琛岄厤緗暟鎹簮錛?浣跨敤Spring鎻愪緵鐨凞ataSource瀹炵幇綾伙級(jí)銆備嬌鐢ㄥ悗鑰呭彲浠ユ洿鏂逛究鐨勮劚紱籛eb瀹瑰櫒鏉ヨ繘琛屽崟鍏冩祴璇曘?榪欓噷鎴戜滑灝嗕嬌鐢?tt class="classname">DriverManagerDataSource錛屼笉榪嘍ataSource鏈夊縐嶅疄鐜幫紝 鍚庨潰鎴戜滑浼?xì)璁插埌銆備嬌鐢?tt class="classname">DriverManagerDataSource鍜屼綘浠ュ墠鑾峰彇涓涓狫DBC榪炴帴 鐨勫仛娉曟病浠涔堜袱鏍楓備綘棣栧厛蹇呴』鎸囧畾JDBC椹卞姩紼嬪簭鐨勫叏闄愬畾鍚嶏紝榪欐牱DriverManager 鎵嶈兘鍔犺澆JDBC椹卞姩綾伙紝鎺ョ潃浣犲繀欏繪彁渚涗竴涓猽rl錛堝洜JDBC椹卞姩鑰屽紓錛屼負(fù)浜?jiǎn)淇濊瘉璁揪|紜鍙傝冪浉鍏矹DBC椹卞姩鐨勬枃妗o級(jí)錛?鏈鍚庝綘蹇呴』鎻愪緵涓涓敤鎴瘋繛鎺ユ暟鎹簱鐨勭敤鎴峰悕鍜屽瘑鐮併備笅闈㈡垜浠皢閫氳繃涓涓緥瀛愭潵璇存槑濡備綍閰嶇疆涓涓?DriverManagerDataSource錛?

DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");

11.2.5. SQLExceptionTranslator鎺ュ彛

SQLExceptionTranslator鏄竴涓帴鍙o紝濡傛灉浣犻渶瑕佸湪 SQLException鍜?tt class="classname">org.springframework.dao.DataAccessException涔嬮棿浣滆漿鎹紝閭d箞蹇呴』瀹炵幇璇ユ帴鍙c?

杞崲鍣ㄧ被鐨勫疄鐜板彲浠ラ噰鐢ㄤ竴鑸氱敤鐨勫仛娉?姣斿浣跨敤JDBC鐨凷QLState code)錛屽鏋滀負(fù)浜?jiǎn)鋴设浆鎹㈡洿鍑喖嫯锛屼篃鍙互杩涜瀹氬堄灱堟瘮濡備娇鐢∣racle鐨別rror code錛夈?

SQLErrorCodeSQLExceptionTranslator鏄疭QLExceptionTranslator鐨勯粯璁ゅ疄鐜般?璇ュ疄鐜頒嬌鐢ㄦ寚瀹氭暟鎹簱鍘傚晢鐨別rror code錛屾瘮閲囩敤SQLState鏇寸簿紜?杞崲榪囩▼鍩轟簬涓涓狫avaBean錛堢被鍨嬩負(fù)SQLErrorCodes錛変腑鐨別rror code銆?榪欎釜JavaBean鐢?tt class="classname">SQLErrorCodesFactory宸ュ巶綾誨垱寤猴紝鍏朵腑鐨勫唴瀹規(guī)潵鑷簬 "sql-error-codes.xml"閰嶇疆鏂囦歡銆傝鏂囦歡涓殑鏁版嵁搴撳巶鍟嗕唬鐮佸熀浜嶥atabase MetaData淇℃伅涓殑 DatabaseProductName錛屼粠鑰岄厤鍚堝綋鍓嶆暟鎹簱鐨勪嬌鐢ㄣ?

 

SQLErrorCodeSQLExceptionTranslator浣跨敤浠ヤ笅鐨勫尮閰嶈鍒欙細(xì)

 

  • 棣栧厛媯(gè)鏌ユ槸鍚﹀瓨鍦ㄥ畬鎴愬畾鍒惰漿鎹㈢殑瀛愮被瀹炵幇銆傞氬父SQLErrorCodeSQLExceptionTranslator 榪欎釜綾誨彲浠ヤ綔涓轟竴涓叿浣撶被浣跨敤錛屼笉闇瑕佽繘琛屽畾鍒訛紝閭d箞榪欎釜瑙勫垯灝嗕笉閫傜敤銆?

  • 鎺ョ潃灝哠QLException鐨別rror code涓庨敊璇唬鐮侀泦涓殑error code榪涜鍖歸厤銆?榛樿鎯呭喌涓嬮敊璇唬鐮侀泦灝嗕粠SQLErrorCodesFactory鍙栧緱銆?閿欒浠g爜闆嗘潵鑷猚lasspath涓嬬殑sql-error-codes.xml鏂囦歡錛?瀹冧滑灝嗕笌鏁版嵁搴搈etadata淇℃伅涓殑database name榪涜鏄犲皠銆?

  • 濡傛灉浠嶇劧鏃犳硶鍖歸厤錛屾渶鍚庡皢璋冪敤fallbackTranslator灞炴х殑translate鏂規(guī)硶錛?tt class="classname">SQLStateSQLExceptionTranslator綾誨疄渚嬫槸榛樿鐨刦allbackTranslator銆?

 

SQLErrorCodeSQLExceptionTranslator鍙互閲囩敤涓嬮潰鐨勬柟寮忚繘琛屾墿灞曪細(xì)

public class MySQLErrorCodesTranslator extends SQLErrorCodeSQLExceptionTranslator {
protected DataAccessException customTranslate(String task, String sql, SQLException sqlex) {
if (sqlex.getErrorCode() == -12345) {
return new DeadlockLoserDataAccessException(task, sqlex);
}
return null;
}
}

鍦ㄤ笂闈㈢殑榪欎釜渚嬪瓙涓紝error code涓?tt class="literal">'-12345'鐨凷QLException 灝嗛噰鐢ㄨ杞崲鍣ㄨ繘琛岃漿鎹紝鑰屽叾浠栫殑error code灝嗙敱榛樿鐨勮漿鎹㈠櫒榪涜杞崲銆?涓轟簡(jiǎn)浣跨敤璇ヨ漿鎹㈠櫒錛屽繀欏誨皢鍏朵綔涓哄弬鏁頒紶閫掔粰JdbcTemplate綾?鐨?tt class="literal">setExceptionTranslator鏂規(guī)硶錛屽茍鍦ㄩ渶瑕佷嬌鐢ㄨ繖涓漿鎹㈠櫒鍣ㄧ殑鏁版嵁 瀛樺彇鎿嶄綔涓嬌鐢ㄨJdbcTemplate銆?涓嬮潰鐨勪緥瀛愭紨紺轟簡(jiǎn)濡備綍浣跨敤璇ュ畾鍒惰漿鎹㈠櫒錛?

// create a JdbcTemplate and set data source
JdbcTemplate jt = new JdbcTemplate();
jt.setDataSource(dataSource);
// create a custom translator and set the DataSource for the default translation lookup
MySQLErrorCodesTransalator tr = new MySQLErrorCodesTransalator();
tr.setDataSource(dataSource);
jt.setExceptionTranslator(tr);
// use the JdbcTemplate for this SqlUpdate
SqlUpdate su = new SqlUpdate();
su.setJdbcTemplate(jt);
su.setSql("update orders set shipping_charge = shipping_charge * 1.05");
su.compile();
su.update();

鍦ㄤ笂闈㈢殑瀹氬埗杞崲鍣ㄤ腑錛屾垜浠粰瀹冩敞鍏ヤ簡(jiǎn)涓涓暟鎹簮錛屽洜涓烘垜浠粛鐒墮渶瑕?浣跨敤榛樿鐨勮漿鎹㈠櫒浠?tt class="literal">sql-error-codes.xml涓幏鍙栭敊璇唬鐮侀泦銆?

11.2.6. 鎵цSQL璇彞

鎴戜滑浠呴渶瑕侀潪甯稿皯鐨勪唬鐮佸氨鍙互杈懼埌鎵цSQL璇彞鐨勭洰鐨勶紝涓鏃﹁幏寰椾竴涓?DataSource鍜屼竴涓?tt class="classname">JdbcTemplate錛?鎴戜滑灝卞彲浠ヤ嬌鐢?tt class="classname">JdbcTemplate鎻愪緵鐨勪赴瀵屽姛鑳藉疄鐜版垜浠殑鎿嶄綔銆?涓嬮潰鐨勪緥瀛愪嬌鐢ㄤ簡(jiǎn)鏋佸皯鐨勪唬鐮佸畬鎴愬垱寤轟竴寮犺〃鐨勫伐浣溿?

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class ExecuteAStatement {
private JdbcTemplate jt;
private DataSource dataSource;
public void doExecute() {
jt = new JdbcTemplate(dataSource);
jt.execute("create table mytable (id integer, name varchar(100))");
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}

11.2.7. 鎵ц鏌ヨ

闄や簡(jiǎn)execute鏂規(guī)硶涔嬪錛?tt class="classname">JdbcTemplate榪樻彁渚涗簡(jiǎn)澶ч噺鐨勬煡璇㈡柟娉曘?鍦ㄨ繖浜涙煡璇㈡柟娉曚腑錛屾湁寰堝ぇ涓閮ㄥ垎鏄敤鏉ユ煡璇㈠崟鍊肩殑銆傛瘮濡傝繑鍥炰竴涓眹鎬伙紙count錛夌粨鏋?鎴栬呬粠榪斿洖琛岀粨鏋滀腑鍙栧緱鎸囧畾鍒楃殑鍊箋傝繖鏃舵垜浠彲浠ヤ嬌鐢?tt class="literal">queryForInt(..)銆?queryForLong(..)鎴栬?tt class="literal">queryForObject(..)鏂規(guī)硶銆?queryForObject鏂規(guī)硶鐢ㄦ潵灝嗚繑鍥炵殑JDBC綾誨瀷瀵硅薄杞崲鎴愭寚瀹氱殑Java瀵硅薄錛屽鏋滅被鍨嬭漿鎹㈠け璐ュ皢鎶涘嚭 InvalidDataAccessApiUsageException寮傚父銆?涓嬮潰鐨勪緥瀛愭紨紺轟簡(jiǎn)涓や釜鏌ヨ鐨勭敤娉曪紝涓涓繑鍥?tt class="literal">int鍊鹼紝鍙︿竴涓繑鍥?String銆?

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class RunAQuery {
private JdbcTemplate jt;
private DataSource dataSource;
public int getCount() {
jt = new JdbcTemplate(dataSource);
int count = jt.queryForInt("select count(*) from mytable");
return count;
}
public String getName() {
jt = new JdbcTemplate(dataSource);
String name = (String) jt.queryForObject("select name from mytable", String.class);
return name;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}

闄や簡(jiǎn)榪斿洖鍗曞肩殑鏌ヨ鏂規(guī)硶錛?tt class="classname">JdbcTemplate榪樻彁渚涗簡(jiǎn)涓緇勮繑鍥濴ist緇撴灉 鐨勬柟娉曘侺ist涓殑姣忎竴欏瑰搴旀煡璇㈣繑鍥炵粨鏋滀腑鐨勪竴琛屻傚叾涓渶綆鍗曠殑鏄?tt class="literal">queryForList鏂規(guī)硶錛?璇ユ柟娉曞皢榪斿洖涓涓?tt class="interfacename">List錛岃List涓殑姣忎竴鏉?璁板綍鏄竴涓?tt class="interfacename">Map瀵硅薄錛屽搴斿簲鏁版嵁搴撲腑鏌愪竴琛岋紱鑰岃Map 涓殑姣忎竴欏瑰搴旇鏁版嵁搴撹涓殑鏌愪竴鍒楀箋備笅闈㈢殑浠g爜鐗囨柇鎺ョ潃涓婇潰鐨勪緥瀛愭紨紺轟簡(jiǎn)濡備綍鐢ㄨ鏂規(guī)硶榪斿洖琛ㄤ腑 鎵鏈夎褰曪細(xì)

public List getList() {
jt = new JdbcTemplate(dataSource);
List rows = jt.queryForList("select * from mytable");
return rows;
}

榪斿洖鐨勭粨鏋滈泦綾諱技涓嬮潰榪欑褰㈠紡錛?

[{name=Bob, id=1}, {name=Mary, id=2}]

11.2.8. 鏇存柊鏁版嵁搴?/h3>

JdbcTemplate榪樻彁渚涗簡(jiǎn)涓浜涙洿鏂版暟鎹簱鐨勬柟娉曘?鍦ㄤ笅闈㈢殑渚嬪瓙涓紝鎴戜滑鏍規(guī)嵁緇欏畾鐨勪富閿煎鎸囧畾鐨勫垪榪涜鏇存柊銆?渚嬪瓙涓殑SQL璇彞涓嬌鐢ㄤ簡(jiǎn)“?”鍗犱綅絎︽潵鎺ュ彈鍙傛暟錛堣繖縐嶅仛娉曞湪鏇存柊鍜屾煡璇QL璇彞涓緢甯歌錛夈?浼犻掔殑鍙傛暟鍊間綅浜庝竴涓璞℃暟緇勪腑錛堝熀鏈被鍨嬮渶瑕佽鍖呰鎴愬叾瀵瑰簲鐨勫璞$被鍨嬶級(jí)銆?

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class ExecuteAnUpdate {
private JdbcTemplate jt;
private DataSource dataSource;
public void setName(int id, String name) {
jt = new JdbcTemplate(dataSource);
jt.update("update mytable set name = ? where id = ?", new Object[] {name, new Integer(id)});
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}

11.3. 鎺у埗鏁版嵁搴撹繛鎺?/h2>

11.3.1. DataSourceUtils綾?/h3>

DataSourceUtils浣滀負(fù)涓涓府鍔╃被鎻愪緵鏄撶敤涓斿己澶х殑鏁版嵁搴撹闂兘鍔涳紝 鎴戜滑鍙互浣跨敤璇ョ被鎻愪緵鐨?tt class="literal">闈?rùn)鎬?/tt>鏂規(guī)硶浠嶫NDI鑾峰彇鏁版嵁搴撹繛鎺ヤ互鍙?qiáng)鍦ㄥ繀瑕佺殑鏃跺欏叧闂箣銆?瀹冩彁渚涙敮鎸佺嚎紼嬬粦瀹氱殑鏁版嵁搴撹繛鎺ワ紙姣斿浣跨敤DataSourceTransactionManager 鐨勬椂鍊欙紝灝嗘妸鏁版嵁搴撹繛鎺ョ粦瀹氬埌褰撳墠鐨勭嚎紼嬩笂錛夈?

娉細(xì)getDataSourceFromJndi(..)鏂規(guī)硶涓昏鐢ㄤ簬閭d簺娌℃湁浣跨敤bean factory 鎴栬卆pplication context鐨勫満鍚堛傚鏋滀嬌鐢╝pplication context錛岄偅涔堟渶濂芥槸鍦?JndiObjectFactoryBean涓厤緗産ean鎴栬呯洿鎺ヤ嬌鐢?JdbcTemplate瀹炰緥銆?tt class="classname">JndiObjectFactoryBean 鑳藉閫氳繃JNDI鑾峰彇DataSource騫跺皢 DataSource浣滀負(fù)寮曠敤鍙傛暟浼犻掔粰鍏朵粬bean銆?榪欐牱錛屽湪涓嶅悓鐨?tt class="interfacename">DataSource涔嬮棿鍒囨崲鍙渶瑕佷慨鏀歸厤緗枃浠跺嵆鍙紝 鐢氳嚦鎴戜滑鍙互鐢ㄤ竴涓潪JNDI鐨?tt class="interfacename">DataSource鏉ユ浛鎹?FactoryBean瀹氫箟錛?

11.3.2. SmartDataSource鎺ュ彛

SmartDataSource鏄?tt class="interfacename">DataSource 鎺ュ彛鐨勪竴涓墿灞曪紝鐢ㄦ潵鎻愪緵鏁版嵁搴撹繛鎺ャ備嬌鐢ㄨ鎺ュ彛鐨勭被鍦ㄦ寚瀹氱殑鎿嶄綔涔嬪悗鍙互媯(gè)鏌ユ槸鍚﹂渶瑕佸叧闂繛鎺ャ?璇ユ帴鍙e湪鏌愪簺鎯呭喌涓嬮潪甯告湁鐢紝姣斿鏈変簺鎯呭喌闇瑕侀噸鐢ㄦ暟鎹簱榪炴帴銆?

11.3.3. AbstractDataSource綾?/h3>

AbstractDataSource鏄竴涓疄鐜頒簡(jiǎn)DataSource 鎺ュ彛鐨?tt class="literal">abstract鍩虹被銆傚畠瀹炵幇浜?tt class="interfacename">DataSource鎺ュ彛鐨?涓浜涙棤鍏崇棝鐥掔殑鏂規(guī)硶錛屽鏋滀綘闇瑕佸疄鐜拌嚜宸辯殑DataSource錛岄偅涔堢戶鎵?璇ョ被鏄釜濂戒富鎰忋?

11.3.4. SingleConnectionDataSource綾?/h3>

SingleConnectionDataSource鏄?tt class="literal">SmartDataSource鎺ュ彛 鐨勪竴涓疄鐜幫紝鍏跺唴閮ㄥ寘瑁呬簡(jiǎn)涓涓崟榪炴帴銆傝榪炴帴鍦ㄤ嬌鐢ㄤ箣鍚庡皢涓嶄細(xì)鍏抽棴錛屽緢鏄劇劧瀹冧笉鑳藉湪澶氱嚎紼?鐨勭幆澧冧笅浣跨敤銆?

褰撳鎴風(fēng)浠g爜璋冪敤close鏂規(guī)硶鐨勬椂鍊欙紝濡傛灉瀹冩繪槸鍋囪鏁版嵁搴撹繛鎺ユ潵鑷繛鎺ユ睜錛堝氨鍍忎嬌鐢ㄦ寔涔呭寲宸ュ叿鏃朵竴鏍鳳級(jí)錛?浣犲簲璇ュ皢suppressClose璁劇疆涓簍rue銆?榪欐牱錛岄氳繃璇ョ被鑾峰彇鐨勫皢鏄唬鐞嗚繛鎺ワ紙紱佹鍏抽棴錛夎屼笉鏄師鏈夌殑鐗╃悊榪炴帴銆?闇瑕佹敞鎰忕殑鏄紝鎴戜滑涓嶈兘鎶婁嬌鐢ㄨ綾昏幏鍙栫殑鏁版嵁搴撹繛鎺ラ犲瀷錛坈ast錛変負(fù)Oracle Connection涔嬬被鐨勬湰鍦版暟鎹簱榪炴帴銆?

SingleConnectionDataSource涓昏鍦ㄦ祴璇曠殑鏃跺欎嬌鐢ㄣ?瀹冧嬌寰楁祴璇曚唬鐮佸緢瀹規(guī)槗鑴辯搴旂敤鏈嶅姟鍣ㄨ屽湪涓涓畝鍗曠殑JNDI鐜涓嬭繍琛屻?涓?tt class="classname">DriverManagerDataSource涓嶅悓鐨勬槸錛屽畠濮嬬粓鍙細(xì)浣跨敤鍚屼竴涓暟鎹簱榪炴帴錛?浠庤岄伩鍏嶆瘡嬈″緩绔嬬墿鐞嗚繛鎺ョ殑寮閿銆?

11.3.5. DriverManagerDataSource綾?/h3>

DriverManagerDataSource綾誨疄鐜頒簡(jiǎn) SmartDataSource鎺ュ彛銆傚湪applicationContext.xml涓彲浠ヤ嬌鐢?bean properties鏉ヨ緗甁DBC Driver灞炴э紝璇ョ被姣忔榪斿洖鐨勯兘鏄竴涓柊鐨勮繛鎺ャ?

璇ョ被涓昏鍦ㄦ祴璇曚互鍙?qiáng)鑴奔浕J2EE瀹瑰櫒鐨勭嫭绔嬬幆澧冧腑浣跨敤銆傚畠鏃㈠彲浠ョ敤鏉ュ湪application context涓綔涓轟竴涓?DataSource bean錛屼篃鍙互鍦ㄧ畝鍗曠殑JNDI鐜涓嬩嬌鐢ㄣ?鐢變簬Connection.close()浠呬粎鍙槸綆鍗曠殑鍏抽棴鏁版嵁搴撹繛鎺ワ紝鍥犳浠諱綍鑳藉鑾峰彇 DataSource鐨勬寔涔呭寲浠g爜閮借兘寰堝ソ鐨勫伐浣溿備笉榪囦嬌鐢↗avaBean椋庢牸鐨勮繛鎺ユ睜 錛堟瘮濡俢ommons-dbcp錛変篃騫墮潪闅句簨銆傚嵆浣挎槸鍦ㄦ祴璇曠幆澧冧笅錛屼嬌鐢ㄨ繛鎺ユ睜涔熸槸涓縐嶆瘮浣跨敤 DriverManagerDataSource鏇村ソ鐨勫仛娉曘?

11.3.6. TransactionAwareDataSourceProxy綾?/h3>

TransactionAwareDataSourceProxy浣滀負(fù)鐩爣DataSource鐨勪竴涓唬鐞嗭紝 鍦ㄥ鐩爣DataSource鍖呰鐨勫悓鏃訛紝榪樺鍔犱簡(jiǎn)Spring鐨勪簨鍔$鐞嗚兘鍔涳紝 鍦ㄨ繖涓鐐逛笂錛岃繖涓被鐨勫姛鑳介潪甯稿儚J2EE鏈嶅姟鍣ㄦ墍鎻愪緵鐨勪簨鍔″寲鐨凧NDI DataSource銆?

[Note] Note

璇ョ被鍑犱箮寰堝皯琚敤鍒幫紝闄ら潪鐜版湁浠g爜鍦ㄨ璋冪敤鐨勬椂鍊欓渶瑕佷竴涓爣鍑嗙殑 JDBC DataSource鎺ュ彛瀹炵幇浣滀負(fù)鍙傛暟銆?榪欑鎯呭喌涓嬶紝榪欎釜綾誨彲浠ヤ嬌鐜版湁浠g爜鍙備笌Spring鐨勪簨鍔$鐞嗐傞氬父鏈濂界殑鍋氭硶鏄嬌鐢ㄦ洿楂樺眰鐨勬娊璞?鏉ュ鏁版嵁婧愯繘琛岀鐞嗭紝姣斿JdbcTemplate鍜?tt class="classname">DataSourceUtils絳夌瓑銆?

濡傛灉闇瑕佹洿璇︾粏鐨勮祫鏂欙紝璇峰弬鑰?tt class="classname">TransactionAwareDataSourceProxy JavaDoc 銆?/em>

11.3.7. DataSourceTransactionManager綾?/h3>

DataSourceTransactionManager綾繪槸 PlatformTransactionManager鎺ュ彛鐨勪竴涓疄鐜幫紝鐢ㄤ簬澶勭悊鍗旿DBC鏁版嵁婧愩?瀹冨皢浠庢寚瀹欴ataSource鍙栧緱鐨凧DBC榪炴帴緇戝畾鍒板綋鍓嶇嚎紼嬶紝鍥犳瀹冧篃鏀寔浜?jiǎn)姣忎釜鏁版嵁婧愬搴斿堫C竴涓嚎紼嬨?

鎴戜滑鎺ㄨ崘鍦ㄥ簲鐢ㄤ唬鐮佷腑浣跨敤DataSourceUtils.getConnection(DataSource)鏉ヨ幏鍙?JDBC榪炴帴錛岃屼笉鏄嬌鐢↗2EE鏍囧噯鐨?tt class="literal">DataSource.getConnection銆傚洜涓哄墠鑰呭皢鎶涘嚭 unchecked鐨?tt class="literal">org.springframework.dao寮傚父錛岃屼笉鏄痗hecked鐨?SQLException寮傚父銆係pring Framework涓墍鏈夌殑綾伙紙姣斿 JdbcTemplate錛夐兘閲囩敤榪欑鍋氭硶銆傚鏋滀笉闇瑕佸拰榪欎釜 DataSourceTransactionManager綾諱竴璧蜂嬌鐢紝DataSourceUtils 鎻愪緵鐨勫姛鑳借窡涓鑸殑鏁版嵁搴撹繛鎺ョ瓥鐣ユ病鏈変粈涔堜袱鏍鳳紝鍥犳瀹冨彲浠ュ湪浠諱綍鍦烘櫙涓嬩嬌鐢ㄣ?

DataSourceTransactionManager綾繪敮鎸佸畾鍒墮殧紱葷駭鍒紝浠ュ強(qiáng)瀵筍QL璇彞鏌ヨ瓚呮椂鐨勮瀹氥?涓轟簡(jiǎn)鏀寔鍚庤咃紝搴旂敤浠g爜蹇呴』浣跨敤JdbcTemplate鎴栬呭湪姣忔鍒涘緩SQL璇彞鏃惰皟鐢?DataSourceUtils.applyTransactionTimeout鏂規(guī)硶銆?

鍦ㄤ嬌鐢ㄥ崟涓暟鎹簮鐨勬儏褰笅錛屼綘鍙互鐢?tt class="classname">DataSourceTransactionManager鏉ユ浛浠?tt class="classname">JtaTransactionManager錛?鍥犱負(fù)DataSourceTransactionManager涓嶉渶瑕佸鍣ㄦ敮鎸丣TA銆傚鏋滀綘浣跨敤DataSourceUtils.getConnection(DataSource)鏉ヨ幏鍙?JDBC榪炴帴錛屼簩鑰呬箣闂寸殑鍒囨崲鍙渶瑕佹洿鏀逛竴浜涢厤緗傛渶鍚庨渶瑕佹敞鎰忕殑涓鐐瑰氨鏄?tt class="classname">JtaTransactionManager涓嶆敮鎸侀殧紱葷駭鍒殑瀹氬埗錛?

11.4. 鐢↗ava瀵硅薄鏉ヨ〃杈綣DBC鎿嶄綔

org.springframework.jdbc.object鍖呬笅鐨勭被鍏佽鐢ㄦ埛浠ユ洿鍔?闈㈠悜瀵硅薄鐨勬柟寮忓幓璁塊棶鏁版嵁搴撱傛瘮濡傝錛岀敤鎴峰彲浠ユ墽琛屾煡璇㈠茍榪斿洖涓涓猯ist錛?璇ist浣滀負(fù)涓涓粨鏋滈泦灝嗘妸浠庢暟鎹簱涓彇鍑虹殑鍒楁暟鎹槧灝勫埌涓氬姟瀵硅薄鐨勫睘鎬т笂銆?鐢ㄦ埛涔熷彲浠ユ墽琛屽瓨鍌ㄨ繃紼嬶紝浠ュ強(qiáng)榪愯鏇存柊銆佸垹闄や互鍙?qiáng)鎻掑叆SQL璇彞銆?

[Note] Note

鍦ㄨ澶歋pring寮鍙戜漢鍛樹(shù)腑闂村瓨鍦ㄦ湁涓縐嶈鐐癸紝閭e氨鏄笅闈㈠皢瑕佹彁鍒扮殑鍚勭RDBMS鎿嶄綔綾?錛?a title="11.4.4. StoredProcedure綾? >StoredProcedure綾婚櫎澶栵級(jí) 閫氬父涔熷彲浠ョ洿鎺ヤ嬌鐢?tt class="classname">JdbcTemplate鐩稿叧鐨勬柟娉曟潵鏇挎崲銆?鐩稿浜庢妸涓涓煡璇㈡搷浣滃皝瑁呮垚涓涓被鑰岃█錛岀洿鎺ヨ皟鐢?tt class="classname">JdbcTemplate鏂規(guī)硶灝嗘洿綆鍗?鑰屼笖鏇村鏄撶悊瑙c?

蹇呴』璇存槑鐨勪竴鐐瑰氨鏄紝榪欎粎浠呭彧鏄竴縐?span class="emphasis">瑙傜偣鑰屽凡錛?濡傛灉浣犺涓轟綘鍙互浠庣洿鎺ヤ嬌鐢≧DBMS鎿嶄綔綾諱腑鑾峰彇涓浜涢澶栫殑濂藉錛?浣犱笉濡ㄦ牴鎹嚜宸辯殑闇瑕佸拰鍠滃ソ榪涜涓嶅悓鐨勯夋嫨銆?

11.4.1. SqlQuery綾?/h3>

SqlQuery鏄竴涓彲閲嶇敤銆佺嚎紼嬪畨鍏ㄧ殑綾伙紝瀹冨皝瑁呬簡(jiǎn)涓涓猄QL鏌ヨ銆?鍏跺瓙綾誨繀欏誨疄鐜?tt class="literal">newResultReader()鏂規(guī)硶錛岃鏂規(guī)硶鐢ㄦ潵鍦ㄩ亶鍘?ResultSet鐨勬椂鍊欒兘浣跨敤涓涓被鏉ヤ繚瀛樼粨鏋溿?鎴戜滑寰堝皯闇瑕佺洿鎺ヤ嬌鐢?tt class="classname">SqlQuery錛屽洜涓哄叾瀛愮被 MappingSqlQuery浣滀負(fù)涓涓洿鍔犳槗鐢ㄧ殑瀹炵幇鑳藉灝嗙粨鏋滈泦涓殑琛屾槧灝勪負(fù)Java瀵硅薄銆?SqlQuery榪樻湁鍙﹀涓や釜鎵╁睍鍒嗗埆鏄?MappingSqlQueryWithParameters鍜?tt class="classname">UpdatableSqlQuery銆?

11.4.2. MappingSqlQuery綾?/h3>

MappingSqlQuery鏄竴涓彲閲嶇敤鐨勬煡璇㈡娊璞$被錛屽叾鍏蜂綋綾誨繀欏誨疄鐜?mapRow(ResultSet, int)鎶借薄鏂規(guī)硶鏉ュ皢緇撴灉闆嗕腑鐨勬瘡涓琛岃漿鎹㈡垚Java瀵硅薄銆?

鍦?tt class="interfacename">SqlQuery鐨勫悇縐嶅疄鐜頒腑錛?MappingSqlQuery鏄渶甯哥敤涔熸槸鏈瀹規(guī)槗浣跨敤鐨勪竴涓?

涓嬮潰榪欎釜渚嬪瓙婕旂ず浜?jiǎn)涓涓畾鍒舵煡璇紝瀹冨皢浠庡鎴瘋〃涓彇寰楃殑鏁版嵁鏄犲皠鍒頒竴涓?Customer綾誨疄渚嬨?

private class CustomerMappingQuery extends MappingSqlQuery {
public CustomerMappingQuery(DataSource ds) {
super(ds, "SELECT id, name FROM customer WHERE id = ?");
super.declareParameter(new SqlParameter("id", Types.INTEGER));
compile();
}
public Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
Customer cust = new Customer();
cust.setId((Integer) rs.getObject("id"));
cust.setName(rs.getString("name"));
return cust;
}
}

鍦ㄤ笂闈㈢殑渚嬪瓙涓紝鎴戜滑涓虹敤鎴鋒煡璇㈡彁渚涗簡(jiǎn)涓涓瀯閫犲嚱鏁板茍涓烘瀯閫犲嚱鏁頒紶閫掍簡(jiǎn)涓涓?DataSource鍙傛暟銆傚湪鏋勯犲嚱鏁伴噷闈㈡垜浠妸 DataSource鍜屼竴涓敤鏉ヨ繑鍥炴煡璇㈢粨鏋滅殑SQL璇彞浣滀負(fù)鍙傛暟 璋冪敤鐖剁被鐨勬瀯閫犲嚱鏁般係QL璇彞灝嗚鐢ㄤ簬鐢熸垚涓涓?tt class="interfacename">PreparedStatement瀵硅薄錛?鍥犳瀹冨彲浠ュ寘鍚崰浣嶇鏉ヤ紶閫掑弬鏁般傝屾瘡涓涓猄QL璇彞鐨勫弬鏁板繀欏婚氳繃璋冪敤 declareParameter鏂規(guī)硶鏉ヨ繘琛屽0鏄庯紝璇ユ柟娉曢渶瑕佷竴涓?SqlParameter錛堝皝瑁呬簡(jiǎn)涓涓瓧孌靛悕瀛楀拰涓涓?java.sql.Types涓畾涔夌殑JDBC綾誨瀷錛夊璞′綔涓哄弬鏁般?鎵鏈夊弬鏁板畾涔夊畬涔嬪悗錛屾垜浠皟鐢?tt class="literal">compile()鏂規(guī)硶鏉ュSQL璇彞榪涜棰勭紪璇戙?

涓嬮潰璁╂垜浠湅鐪嬭瀹氬埗鏌ヨ鍒濆鍖栧茍鎵ц鐨勪唬鐮侊細(xì)

public Customer getCustomer(Integer id) {
CustomerMappingQuery custQry = new CustomerMappingQuery(dataSource);
Object[] parms = new Object[1];
parms[0] = id;
List customers = custQry.execute(parms);
if (customers.size() > 0) {
return (Customer) customers.get(0);
}
else {
return null;
}
}

鍦ㄤ笂闈㈢殑渚嬪瓙涓紝getCustomer鏂規(guī)硶閫氳繃浼犻掓儫涓鍙傛暟id鏉ヨ繑鍥炰竴涓鎴峰璞°?璇ユ柟娉曞唴閮ㄥ湪鍒涘緩CustomerMappingQuery瀹炰緥涔嬪悗錛?鎴戜滑鍒涘緩浜?jiǎn)涓涓璞℃暟緇勭敤鏉ュ寘鍚浼犻掔殑鏌ヨ鍙傛暟銆傝繖閲屾垜浠彧鏈夊敮涓鐨勪竴涓?Integer鍙傛暟銆傛墽琛?tt class="classname">CustomerMappingQuery鐨?execute鏂規(guī)硶涔嬪悗錛屾垜浠緱鍒頒簡(jiǎn)涓涓?tt class="literal">List錛岃List涓寘鍚竴涓?Customer瀵硅薄錛屽鏋滄湁瀵硅薄婊¤凍鏌ヨ鏉′歡鐨勮瘽銆?

11.4.3. SqlUpdate綾?/h3>

SqlUpdate綾誨皝瑁呬簡(jiǎn)涓涓彲閲嶅浣跨敤鐨凷QL鏇存柊鎿嶄綔銆?璺熸墍鏈?tt class="classname">RdbmsOperation綾諱竴鏍鳳紝SqlUpdate鍙互鍦⊿QL涓畾涔夊弬鏁般?

璇ョ被鎻愪緵浜?jiǎn)涓緋誨垪update()鏂規(guī)硶錛屽氨鍍廠qlQuery鎻愪緵鐨勪竴緋誨垪execute()鏂規(guī)硶涓鏍楓?

SqlUpdate鏄竴涓叿浣撶殑綾匯傞氳繃鍦⊿QL璇彞涓畾涔夊弬鏁幫紝榪欎釜綾誨彲浠ユ敮鎸?涓嶅悓鐨勬洿鏂版柟娉曪紝鎴戜滑涓鑸笉闇瑕侀氳繃緇ф壙鏉ュ疄鐜板畾鍒躲?

import java.sql.Types;
import javax.sql.DataSource;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.SqlUpdate;
public class UpdateCreditRating extends SqlUpdate {
public UpdateCreditRating(DataSource ds) {
setDataSource(ds);
setSql("update customer set credit_rating = ? where id = ?");
declareParameter(new SqlParameter(Types.NUMERIC));
declareParameter(new SqlParameter(Types.NUMERIC));
compile();
}
/**
* @param id for the Customer to be updated
* @param rating the new value for credit rating
* @return number of rows updated
*/
public int run(int id, int rating) {
Object[] params =
new Object[] {
new Integer(rating),
new Integer(id)};
return update(params);
}
}

11.4.4. StoredProcedure綾?/h3>

StoredProcedure綾繪槸涓涓娊璞″熀綾伙紝瀹冩槸瀵筊DBMS瀛樺偍榪囩▼鐨勪竴縐嶆娊璞°?璇ョ被鎻愪緵浜?jiǎn)澶毧U?tt class="literal">execute(..)鏂規(guī)硶錛屼笉榪囪繖浜涙柟娉曠殑璁塊棶綾誨瀷閮芥槸protected鐨勩?

浠庣埗綾葷戶鎵跨殑sql灞炴х敤鏉ユ寚瀹歊DBMS瀛樺偍榪囩▼鐨勫悕瀛椼?灝界璇ョ被鎻愪緵浜?jiǎn)璁稿蹇厵逭d湪JDBC3.0涓嬩嬌鐢ㄧ殑鍔熻兘錛屼絾鏄垜浠洿鍏蟲(chóng)敞鐨勬槸JDBC 3.0涓紩鍏ョ殑鍛藉悕鍙傛暟鐗規(guī)с?

涓嬮潰鐨勭▼搴忔紨紺轟簡(jiǎn)濡備綍璋冪敤Oracle涓殑sysdate()鍑芥暟銆?榪欓噷鎴戜滑鍒涘緩浜?jiǎn)涓涓戶鎵?tt class="classname">StoredProcedure鐨勫瓙綾伙紝铏界劧瀹冩病鏈夎緭鍏ュ弬鏁幫紝 浣嗘槸鎴戝繀欏婚氳繃浣跨敤SqlOutParameter鏉ュ0鏄庝竴涓棩鏈熺被鍨嬬殑杈撳嚭鍙傛暟銆?execute()鏂規(guī)硶灝嗚繑鍥炰竴涓猰ap錛宮ap涓殑姣忎釜entry鏄竴涓敤鍙傛暟鍚嶄綔key錛?浠ヨ緭鍑哄弬鏁頒負(fù)value鐨勫悕鍊煎銆?

import java.sql.Types;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.datasource.*;
import org.springframework.jdbc.object.StoredProcedure;
public class TestStoredProcedure {
public static void main(String[] args)  {
TestStoredProcedure t = new TestStoredProcedure();
t.test();
System.out.println("Done!");
}
void test() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("oracle.jdbc.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:mydb");
ds.setUsername("scott");
ds.setPassword("tiger");
MyStoredProcedure sproc = new MyStoredProcedure(ds);
Map results = sproc.execute();
printMap(results);
}
private class MyStoredProcedure extends StoredProcedure {
private static final String SQL = "sysdate";
public MyStoredProcedure(DataSource ds) {
setDataSource(ds);
setFunction(true);
setSql(SQL);
declareParameter(new SqlOutParameter("date", Types.DATE));
compile();
}
public Map execute() {
// the 'sysdate' sproc has no input parameters, so an empty Map is supplied...
return execute(new HashMap());
}
}
private static void printMap(Map results) {
for (Iterator it = results.entrySet().iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
}

涓嬮潰鏄?tt class="classname">StoredProcedure鐨勫彟涓涓緥瀛愶紝瀹冧嬌鐢ㄤ簡(jiǎn)涓や釜Oracle娓告爣綾誨瀷鐨勮緭鍑哄弬鏁般?

import oracle.jdbc.driver.OracleTypes;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.object.StoredProcedure;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
public class TitlesAndGenresStoredProcedure extends StoredProcedure {
private static final String SPROC_NAME = "AllTitlesAndGenres";
public TitlesAndGenresStoredProcedure(DataSource dataSource) {
super(dataSource, SPROC_NAME);
declareParameter(new SqlOutParameter("titles", OracleTypes.CURSOR, new TitleMapper()));
declareParameter(new SqlOutParameter("genres", OracleTypes.CURSOR, new GenreMapper()));
compile();
}
public Map execute() {
// again, this sproc has no input parameters, so an empty Map is supplied...
return super.execute(new HashMap());
}
}

鍊煎緱娉ㄦ剰鐨勬槸TitlesAndGenresStoredProcedure鏋勯犲嚱鏁頒腑 declareParameter(..)鐨?tt class="classname">SqlOutParameter鍙傛暟錛?璇ュ弬鏁頒嬌鐢ㄤ簡(jiǎn)RowMapper鎺ュ彛鐨勫疄鐜般?榪欐槸涓縐嶉潪甯告柟渚胯屽己澶х殑閲嶇敤鏂瑰紡銆?涓嬮潰鎴戜滑鏉ョ湅涓涓?tt class="interfacename">RowMapper鐨勪袱涓叿浣撳疄鐜般?

棣栧厛鏄?tt class="classname">TitleMapper綾伙紝瀹冪畝鍗曠殑鎶?tt class="interfacename">ResultSet涓殑姣忎竴琛屾槧灝勪負(fù)涓涓?tt class="classname">Title Domain Object銆?

import com.foo.sprocs.domain.Title;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public final class TitleMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Title title = new Title();
title.setId(rs.getLong("id"));
title.setName(rs.getString("name"));
return title;
}
}

鍙︿竴涓槸GenreMapper綾伙紝涔熸槸闈炲父綆鍗曠殑灝?tt class="interfacename">ResultSet涓殑姣忎竴琛屾槧灝勪負(fù)涓涓?tt class="classname">Genre Domain Object銆?

import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.foo.domain.Genre;
public final class GenreMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Genre(rs.getString("name"));
}
}

濡傛灉浣犻渶瑕佺粰瀛樺偍榪囩▼浼犺緭鍏ュ弬鏁幫紙榪欎簺杈撳叆鍙傛暟鏄湪RDBMS瀛樺偍榪囩▼涓畾涔夊ソ浜?jiǎn)鐨勫Q夛紝 鍒欓渶瑕佹彁渚涗竴涓寚瀹氱被鍨嬬殑execute(..)鏂規(guī)硶錛?璇ユ柟娉曞皢璋冪敤鍩虹被鐨?tt class="literal">protected execute(Map parameters)鏂規(guī)硶銆?渚嬪錛?

import oracle.jdbc.driver.OracleTypes;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.object.StoredProcedure;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
public class TitlesAfterDateStoredProcedure extends StoredProcedure {
private static final String SPROC_NAME = "TitlesAfterDate";
private static final String CUTOFF_DATE_PARAM = "cutoffDate";
public TitlesAfterDateStoredProcedure(DataSource dataSource) {
super(dataSource, SPROC_NAME);
declaraParameter(new SqlParameter(CUTOFF_DATE_PARAM, Types.DATE);
declareParameter(new SqlOutParameter("titles", OracleTypes.CURSOR, new TitleMapper()));
compile();
}
public Map execute(Date cutoffDate) {
Map inputs = new HashMap();
inputs.put(CUTOFF_DATE_PARAM, cutoffDate);
return super.execute(inputs);
}
}

11.4.5. SqlFunction綾?/h3>

SqlFunction RDBMS鎿嶄綔綾誨皝瑁呬簡(jiǎn)涓涓猄QL“鍑芥暟”鍖呰鍣紙wrapper錛夛紝 璇ュ寘瑁呭櫒閫傜敤浜庢煡璇㈠茍榪斿洖涓涓崟琛岀粨鏋滈泦銆傞粯璁よ繑鍥炵殑鏄竴涓?tt class="literal">int鍊鹼紝 涓嶈繃鎴戜滑鍙互閲囩敤綾諱技JdbcTemplate涓殑queryForXxx 鍋氭硶鑷繁瀹炵幇鏉ヨ繑鍥炲叾瀹冪被鍨嬨?tt class="classname">SqlFunction浼樺娍鍦ㄤ簬鎴戜滑涓嶅繀鍒涘緩 JdbcTemplate錛岃繖浜涘畠閮藉湪鍐呴儴鏇挎垜浠仛浜?jiǎn)銆?

璇ョ被鐨勪富瑕佺敤閫旀槸璋冪敤SQL鍑芥暟鏉ヨ繑鍥炰竴涓崟鍊肩殑緇撴灉闆嗭紝姣斿綾諱技“select user()”銆?“select sysdate from dual”鐨勬煡璇€傚鏋滈渶瑕佽皟鐢ㄦ洿澶嶆潅鐨勫瓨鍌ㄥ嚱鏁幫紝 鍙互浣跨敤StoredProcedure鎴?tt class="classname">SqlCall銆?

SqlFunction鏄竴涓叿浣撶被錛岄氬父鎴戜滑涓嶉渶瑕佸畠鐨勫瓙綾匯?鍏剁敤娉曟槸鍒涘緩璇ョ被鐨勫疄渚嬶紝鐒跺悗澹版槑SQL璇彞浠ュ強(qiáng)鍙傛暟灝卞彲浠ヨ皟鐢ㄧ浉鍏崇殑run鏂規(guī)硶鍘誨嬈℃墽琛屽嚱鏁般?涓嬮潰鐨勪緥瀛愮敤鏉ヨ繑鍥炴寚瀹氳〃鐨勮褰曡鏁幫細(xì)

public int countRows() {
SqlFunction sf = new SqlFunction(dataSource, "select count(*) from mytable");
sf.compile();
return sf.run();
}


椋為 2008-08-12 15:31 鍙戣〃璇勮
]]>
Spring MVC:瑙嗗浘瑙f瀽鍣ㄧ殑璁劇疆http://www.tkk7.com/176142998/archive/2008/08/11/221342.html椋為椋為Mon, 11 Aug 2008 09:20:00 GMThttp://www.tkk7.com/176142998/archive/2008/08/11/221342.htmlhttp://www.tkk7.com/176142998/comments/221342.htmlhttp://www.tkk7.com/176142998/archive/2008/08/11/221342.html#Feedback0http://www.tkk7.com/176142998/comments/commentRss/221342.htmlhttp://www.tkk7.com/176142998/services/trackbacks/221342.html

瑙嗗浘瑙f瀽鍣ㄧ殑涓浜涘睘鎬?/span>

<bean id="viewResolver"

      class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="exposeSpringMacroHelpers" value="true"/>

    <property name="requestContextAttribute" value="rc"/>

    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

    <property name="prefix" value="/"/>

    <property name="suffix" value=".jsp"/>

</bean>

鍦ㄨ鍥捐В鏋愬櫒鐨勫畾涔変腑錛?#8220;exposeSpringMacroHelpers”璁劇疆鏄惁閫氳繃Spring鐨勫畯搴撴毚闇蹭竴涓?/span>RequestContext(鍚嶄負(fù)springBindRequestContext)渚涘閮ㄤ嬌鐢紝榛樿鍊間負(fù)false銆傚畠鏆撮湶浜?jiǎn)澶勭悊琛ㄥ崟鍜岄獙璇侀敊璇俊鎭殑瀹忔搷浣滃Q?/span>

requestContextAttribute”鎶?/span>Spring鐨?/span>RequestContext瀵硅薄鏆撮湶涓哄彉閲?/span>rc銆傚埄鐢?/span>${rc.contextPath}鏉ヨ幏鍙栧簲鐢ㄧ▼搴忕殑contextPath(涔熷氨鏄?/span>/MyUsers)錛涘埄鐢?/span>${rc.getMessage("user.name")}璇誨彇/WEB-INF/classes/messages.properties鏈湴鍖栦俊鎭傛瀵硅薄瀵逛簬閭d簺涓嶈闂?/span>serlvet璇鋒眰鐨?/span>View鎶鏈?/span>(涔熷氨鏄?/span>Velocity鍜?/span>FreeMarker妯℃澘)鏉ヨ鏄繀涓嶅彲灝戠殑銆?/span>

榪樻湁涓浜涘睘鎬э細(xì)

exposeRequestAttributes錛氶粯璁ゅ?/span>false錛岃緗槸鍚︽墍鏈夌殑request灞炴у湪涓庢ā鏉胯繘琛屽悎騫朵箣鍓嶆坊鍔犲埌model涓傦紙鍙互鐞嗚В涓?/span>request鑼冨洿鍐呭寘鍚殑鎵鏈夊璞★紝鑰屼笉鏄竴涓湡姝g殑Request瀵硅薄銆傦級(jí)

exposeSessionAttributes錛氶粯璁ゅ?/span>false錛岃緗槸鍚︽墍鏈夌殑session灞炴у湪涓庢ā鏉胯繘琛屽悎騫朵箣鍓嶆坊鍔犲埌model涓傦紙鐞嗚В鍚屼笂錛?/span>



椋為 2008-08-11 17:20 鍙戣〃璇勮
]]> 主站蜘蛛池模板: 亚洲免费无码在线| 亚洲婷婷第一狠人综合精品| 国产天堂亚洲国产碰碰| 蜜桃视频在线观看免费网址入口| 亚洲Av高清一区二区三区| 很黄很黄的网站免费的| 亚洲一区二区三区免费在线观看| 国产在线观看片a免费观看| 亚洲一区欧洲一区| 国产高清在线免费视频| 国产成人亚洲综合在线| 亚洲高清国产拍精品青青草原| 特黄特色的大片观看免费视频| 久久精品国产精品亚洲人人| 97无码人妻福利免费公开在线视频| 久久精品亚洲综合专区| 永久看日本大片免费35分钟| 亚洲一区中文字幕在线观看| 午夜爱爱免费视频| 一级毛片免费一级直接观看| 亚洲精品国产成人片| 最近中文字幕2019高清免费| 中文文字幕文字幕亚洲色| 国产网站免费观看| 国产线视频精品免费观看视频| 亚洲国产成人久久精品影视| av大片在线无码免费| 黄色免费网站在线看| 亚洲αv久久久噜噜噜噜噜| 免费观看无遮挡www的视频| 精品免费AV一区二区三区| 亚洲第一区精品观看| 亚洲免费在线播放| 亚洲av无码av在线播放| 亚洲乱码中文字幕综合 | 一区在线免费观看| 在线免费观看亚洲| 日本中文一区二区三区亚洲| 免费人成网站在线观看不卡| 亚洲无人区码一二三码区别图片| 在线观看亚洲精品国产|