<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-295  評論-26  文章-1  trackbacks-0
    1. /**
    2. * Copyright: Copyright (c) 2005-2005
    3. * Company: JavaResearch(http://www.javaresearch.org)
    4. */
    5. package org.javaresearch.jerch;



    6. import java.lang.reflect.Method;
    7. import java.sql.Connection;
    8. import java.sql.PreparedStatement;
    9. import java.sql.ResultSet;
    10. import java.sql.ResultSetMetaData;
    11. import java.sql.SQLException;
    12. import java.util.ArrayList;
    13. import java.util.List;

    14. import javax.sql.DataSource;

    15. /**
    16. * JDBC的模板定義,包含所有支持的方法。
    17. * 這個類是這個類庫的核心,所有的實際功能差不多都是這個定義并完成的。
    18. * 最后更新日期:2005年5月7日
    19. * @author cherami
    20. */
    21. public class JDBCTemplate {
    22. ? /**
    23. ?? * 數據源。
    24. ?? */
    25. ? privateDataSource datasource;
    26. ? /**
    27. ?? * 構造一個空的JDBCTemplate。
    28. ?? */
    29. ? protectedJDBCTemplate() {

    30. ? }
    31. ? /**
    32. ?? * 以指定的數據源構造一個JDBCTemplate。
    33. ?? * @param datasource 數據源
    34. ?? */
    35. ? protectedJDBCTemplate(DataSource datasource) {
    36. ??? this.datasource = datasource;
    37. ? }
    38. ?
    39. ?
    40. ? /**
    41. ?? * 設置當前JDBCTemplate的數據源。
    42. ?? * @param datasource 數據源
    43. ?? */
    44. ? protectedvoid setDataSource(DataSource datasource) {
    45. ??? this.datasource = datasource;
    46. ? }
    47. ? /**
    48. ?? * 得到當前JDBCTemplate的數據源。
    49. ?? * @return 當前JDBCTemplate的數據源
    50. ?? */
    51. ? protectedDataSource getDataSource() {
    52. ??? return datasource;
    53. ? }
    54. ? /**
    55. ?? * 使用psc創建PreparedStatement并使用pss設置相關的參數最后調用action執行。
    56. ?? * @param psc PreparedStatement的創建器
    57. ?? * @param pss PreparedStatement的參數設置器
    58. ?? * @param action PreparedStatement執行的回掉實現
    59. ?? * @return 執行后的結果
    60. ?? */
    61. ? publicObject execute(PreparedStatementCreator psc,
    62. ????? PreparedStatementSetter pss, PreparedStatementCallback action) {
    63. ??? Connection con = Utils.getConnection(datasource);
    64. ??? PreparedStatement ps = null;
    65. ??? try {
    66. ????? ps = psc.createPreparedStatement(con);
    67. ????? pss.setValues(ps);
    68. ????? Object result = action.doInPreparedStatement(ps);
    69. ????? return result;
    70. ??? }
    71. ??? catch (SQLException ex) {
    72. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", ex);
    73. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",ex);
    74. ??? } finally {
    75. ????? Utils.closeStatement(ps);
    76. ????? Utils.closeConnection(con);
    77. ??? }
    78. ? }
    79. ? /**
    80. ?? * 執行指定的sql并返回更新的記錄數。
    81. ?? * @param sql SQL語句
    82. ?? * @return 更新的記錄數
    83. ?? */
    84. ? publicint update(String sql) {
    85. ??? return update(sql, nullPSS);
    86. ? }
    87. ? /**
    88. ?? * 執行指定的sql并返回更新的記錄數。
    89. ?? * @param sql SQL語句
    90. ?? * @param args 參數中的值
    91. ?? * @return 更新的記錄數
    92. ?? */
    93. ? publicint update(String sql, Object[] args) {
    94. ??? return update(sql, new ArgPreparedStatementSetter(args));
    95. ? }
    96. ? /**
    97. ?? * 執行指定的sql并返回更新的記錄數。
    98. ?? * @param sql SQL語句
    99. ?? * @param args 參數中的值
    100. ?? * @param types 參數類型
    101. ?? * @return 更新的記錄數
    102. ?? */
    103. ? publicint update(String sql, Object[] args, int[] types) {
    104. ??? return update(sql, new ArgTypePreparedStatementSetter(args, types));
    105. ? }
    106. ? /**
    107. ?? * 執行指定的sql并返回更新的記錄數。
    108. ?? * @param sql SQL語句
    109. ?? * @param pss PreparedStatement的參數設置器
    110. ?? * @return 更新的記錄數
    111. ?? */
    112. ? publicint update(String sql, PreparedStatementSetter pss) {
    113. ??? Integer result = (Integer) execute(new SimplePreparedStatementCreator(sql),
    114. ??????? pss, newPreparedStatementCallback() {
    115. ????????? publicObject doInPreparedStatement(PreparedStatement stmt)
    116. ????????????? throwsSQLException {
    117. ??????????? returnnewInteger(stmt.executeUpdate());
    118. ????????? }
    119. ??????? });
    120. ??? return result.intValue();
    121. ? }
    122. ? /**
    123. ?? * 批量執行更新并返回每次的更新記錄數
    124. ?? * @param sql SQL語句
    125. ?? * @param args 每次執行時的參數值
    126. ?? * @return 每次執行更新的記錄數數組
    127. ?? */
    128. ? publicint[] batchUpdate(String sql, Object[][] args) {
    129. ??? return batchUpdate(sql, new ArgBatchPreparedStatementSetter(args));
    130. ? }

    131. ? /**
    132. ?? * 批量執行更新并返回每次的更新記錄數
    133. ?? * @param sql SQL語句
    134. ?? * @param args 每次執行時的參數值
    135. ?? * @param types 參數類型
    136. ?? * @return 每次執行更新的記錄數數組
    137. ?? */
    138. ? publicint[] batchUpdate(String sql, Object[][] args, int[] types) {
    139. ??? return batchUpdate(sql,
    140. ??????? new ArgTypeBatchPreparedStatementSetter(args, types));
    141. ? }

    142. ? /**
    143. ?? * 批量執行更新并返回每次的更新記錄數
    144. ?? * @param sql SQL語句
    145. ?? * @param bpss PreparedStatement的批量參數設置器
    146. ?? * @return 每次執行更新的記錄數數組
    147. ?? */
    148. ? publicint[] batchUpdate(String sql, BatchPreparedStatementSetter bpss) {
    149. ??? return batchUpdate(sql, new BatchPreparedStatementSetterConverter(bpss));
    150. ? }

    151. ? /**
    152. ?? * 批量執行更新并返回每次的更新記錄數
    153. ?? * @param sql SQL語句
    154. ?? * @param pss PreparedStatement的參數設置器
    155. ?? * @return 每次執行更新的記錄數數組
    156. ?? */
    157. ? publicint[] batchUpdate(String sql, PreparedStatementSetter pss) {
    158. ??? return (int[]) execute(new SimplePreparedStatementCreator(sql), pss,
    159. ??????? newPreparedStatementCallback() {
    160. ????????? publicObject doInPreparedStatement(PreparedStatement stmt)
    161. ????????????? throwsSQLException {
    162. ??????????? return stmt.executeBatch();
    163. ????????? }
    164. ??????? });
    165. ? }

    166. ? /**
    167. ?? * 查詢一個整型結果。
    168. ?? * @param sql SQL語句
    169. ?? * @return 查詢的第一行的第一個字段的整型值。
    170. ?? */
    171. ? publicint queryForInt(String sql) {
    172. ??? return queryForInt(sql, nullPSS);
    173. ? }
    174. ? /**
    175. ?? * 查詢一個整型結果。
    176. ?? * @param sql SQL語句
    177. ?? * @param args 參數中的值
    178. ?? * @return 查詢的第一行的第一個字段的整型值。
    179. ?? */
    180. ? publicint queryForInt(String sql, Object[] args) {
    181. ??? return queryForInt(sql, new ArgPreparedStatementSetter(args));
    182. ? }
    183. ? /**
    184. ?? * 查詢一個整型結果。
    185. ?? * @param sql SQL語句
    186. ?? * @param args 參數中的值
    187. ?? * @param types 參數類型
    188. ?? * @return 查詢的第一行的第一個字段的整型值。
    189. ?? */
    190. ? publicint queryForInt(String sql, Object[] args, int[] types) {
    191. ??? return queryForInt(sql, new ArgTypePreparedStatementSetter(args, types));
    192. ? }
    193. ? /**
    194. ?? *? 查詢一個整型結果。
    195. ?? * @param sql SQL語句
    196. ?? * @param pss PreparedStatement的參數設置器
    197. ?? * @return 查詢的第一行的第一個字段的整型值。
    198. ?? */
    199. ? publicint queryForInt(String sql, PreparedStatementSetter pss) {
    200. ??? Number result = (Number) queryObject(sql, pss,
    201. ??????? new ObjectResultRowExtractor());
    202. ??? if (result==null) {
    203. ????? return 0;
    204. ??? }
    205. ??? return result.intValue();
    206. ? }

    207. ? /**
    208. ?? * 查詢一個長整型結果。
    209. ?? * @param sql SQL語句
    210. ?? * @return 查詢的第一行的第一個字段的長整型值。
    211. ?? */
    212. ? publiclong queryForLong(String sql) {
    213. ??? return queryForLong(sql, nullPSS);
    214. ? }

    215. ? /**
    216. ?? * 查詢一個長整型結果。
    217. ?? * @param sql SQL語句
    218. ?? * @param args 參數中的值
    219. ?? * @return 查詢的第一行的第一個字段的長整型值。
    220. ?? */
    221. ? publiclong queryForLong(String sql, Object[] args) {
    222. ??? return queryForLong(sql, new ArgPreparedStatementSetter(args));
    223. ? }

    224. ? /**
    225. ?? * 查詢一個長整型結果。
    226. ?? * @param sql SQL語句
    227. ?? * @param args 參數中的值
    228. ?? * @param types 參數類型
    229. ?? * @return 查詢的第一行的第一個字段的長整型值。
    230. ?? */
    231. ? publiclong queryForLong(String sql, Object[] args, int[] types) {
    232. ??? return queryForLong(sql, new ArgTypePreparedStatementSetter(args, types));
    233. ? }

    234. ? /**
    235. ?? *? 查詢一個長整型結果。
    236. ?? * @param sql SQL語句
    237. ?? * @param pss PreparedStatement的參數設置器
    238. ?? * @return 查詢的第一行的第一個字段的長整型值。
    239. ?? */
    240. ? publiclong queryForLong(String sql, PreparedStatementSetter pss) {
    241. ??? Number result = (Number) queryObject(sql, pss,
    242. ??????? new ObjectResultRowExtractor());
    243. ??? if (result==null) {
    244. ????? return 0;
    245. ??? }
    246. ??? return result.longValue();
    247. ? }

    248. ? /**
    249. ?? * 查詢一個字符串結果。
    250. ?? * @param sql SQL語句
    251. ?? * @return 查詢的第一行的第一個字段的字符串值。
    252. ?? */
    253. ? publicString queryString(String sql) {
    254. ??? return queryString(sql, nullPSS);
    255. ? }

    256. ? /**
    257. ?? * 查詢一個字符串結果。
    258. ?? * @param sql SQL語句
    259. ?? * @param args 參數中的值
    260. ?? * @return 查詢的第一行的第一個字段的字符串值。
    261. ?? */
    262. ? publicString queryString(String sql, Object[] args) {
    263. ??? return queryString(sql, new ArgPreparedStatementSetter(args));
    264. ? }

    265. ? /**
    266. ?? * 查詢一個字符串結果。
    267. ?? * @param sql SQL語句
    268. ?? * @param args 參數中的值
    269. ?? * @param types 參數類型
    270. ?? * @return 查詢的第一行的第一個字段的字符串值。
    271. ?? */
    272. ? publicString queryString(String sql, Object[] args, int[] types) {
    273. ??? return queryString(sql, new ArgTypePreparedStatementSetter(args, types));
    274. ? }

    275. ? /**
    276. ?? *? 查詢一個字符串結果。
    277. ?? * @param sql SQL語句
    278. ?? * @param pss PreparedStatement的參數設置器
    279. ?? * @return 查詢的第一行的第一個字段的字符串值。
    280. ?? */
    281. ? publicString queryString(String sql, PreparedStatementSetter pss) {
    282. ??? return (String) queryObject(sql, pss, new StringResultRowExtractor());
    283. ? }

    284. ? /**
    285. ?? * 查詢一個對象結果。
    286. ?? * @param sql SQL語句
    287. ?? * @param rre 單行結果提取器
    288. ?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
    289. ?? */
    290. ? publicObject queryObject(String sql, ResultRowExtractor rre) {
    291. ??? return queryObject(sql, nullPSS, rre);
    292. ? }

    293. ? /**
    294. ?? * 查詢一個對象結果。
    295. ?? * @param sql SQL語句
    296. ?? * @param args 參數中的值
    297. ?? * @param rre 單行結果提取器
    298. ?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
    299. ?? */
    300. ? publicObject queryObject(String sql, Object[] args, ResultRowExtractor rre) {
    301. ??? return queryObject(sql, new ArgPreparedStatementSetter(args), rre);
    302. ? }

    303. ? /**
    304. ?? * 查詢一個對象結果。
    305. ?? * @param sql SQL語句
    306. ?? * @param args 參數中的值
    307. ?? * @param types 參數類型
    308. ?? * @param rre 單行結果提取器
    309. ?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
    310. ?? */
    311. ? publicObject queryObject(String sql, Object[] args, int[] types,
    312. ????? ResultRowExtractor rre) {
    313. ??? return queryObject(sql, new ArgTypePreparedStatementSetter(args, types),
    314. ??????? rre);
    315. ? }

    316. ? /**
    317. ?? * 查詢一個對象結果。
    318. ?? * @param sql SQL語句
    319. ?? * @param pss PreparedStatement的參數設置器
    320. ?? * @param rre 單行結果提取器
    321. ?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
    322. ?? */
    323. ? publicObject queryObject(String sql, PreparedStatementSetter pss,
    324. ????? finalResultRowExtractor rre) {
    325. ??? Object result = (Object) execute(new SimplePreparedStatementCreator(sql),
    326. ??????? pss, newPreparedStatementCallback() {
    327. ????????? publicObject doInPreparedStatement(PreparedStatement ps)
    328. ????????????? throwsSQLException {
    329. ??????????? ResultSet rs = null;
    330. ??????????? try {
    331. ????????????? rs = ps.executeQuery();
    332. ????????????? if (rs.next()) {
    333. ??????????????? return rre.extractRow(rs);
    334. ????????????? } else {
    335. ??????????????? returnnull;
    336. ????????????? }
    337. ??????????? }
    338. ??????????? catch (SQLException e) {
    339. ????????????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    340. ????????????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    341. ??????????? } finally {
    342. ????????????? Utils.closeResultSet(rs);
    343. ??????????? }
    344. ????????? }
    345. ??????? });
    346. ??? return result;
    347. ? }

    348. ? /**
    349. ?? * 查詢一個對象列表結果。
    350. ?? * @param sql SQL語句
    351. ?? * @param rre 單行結果提取器
    352. ?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
    353. ?? */
    354. ? publicList query(String sql, ResultRowExtractor rre) {
    355. ??? return (List) execute(new SimplePreparedStatementCreator(sql), nullPSS,
    356. ??????? new ResultRowListPreparedStatementCallback(rre));
    357. ? }
    358. ? /**
    359. ?? * 查詢結果。
    360. ?? * @param sql SQL語句
    361. ?? * @param rse 全部結果提取器。
    362. ?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
    363. ?? */
    364. ? publicObject query(String sql, finalResultSetExtractor rse) {
    365. ??? return (Object) execute(new SimplePreparedStatementCreator(sql), nullPSS,
    366. ??????? new ResultSetPreparedStatementCallback(rse));
    367. ? }

    368. ? /**
    369. ?? * 查詢一個對象列表結果。
    370. ?? * @param sql SQL語句
    371. ?? * @param args 參數中的值
    372. ?? * @param types 參數類型
    373. ?? * @param rre 單行結果提取器
    374. ?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
    375. ?? */
    376. ? publicList query(String sql, Object[] args, int[] types, ResultRowExtractor rre) {
    377. ??? return (List) execute(new SimplePreparedStatementCreator(sql),
    378. ??????? new ArgTypePreparedStatementSetter(args,types),
    379. ??????? new ResultRowListPreparedStatementCallback(rre));
    380. ? }

    381. ? /**
    382. ?? * 查詢結果。
    383. ?? * @param sql SQL語句
    384. ?? * @param args 參數中的值
    385. ?? * @param types 參數類型
    386. ?? * @param rse 全部結果提取器。
    387. ?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
    388. ?? */
    389. ? publicObject query(String sql, Object[] args, int[] types, ResultSetExtractor rse) {
    390. ??? return (Object) execute(new SimplePreparedStatementCreator(sql),
    391. ??????? new ArgTypePreparedStatementSetter(args,types),
    392. ??????? new ResultSetPreparedStatementCallback(rse));
    393. ? }

    394. ? /**
    395. ?? * 查詢一個對象列表結果。
    396. ?? * @param sql SQL語句
    397. ?? * @param args 參數中的值
    398. ?? * @param rre 單行結果提取器
    399. ?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
    400. ?? */
    401. ? publicList query(String sql, Object[] args, ResultRowExtractor rre) {
    402. ??? return (List) execute(new SimplePreparedStatementCreator(sql),
    403. ??????? new ArgPreparedStatementSetter(args),
    404. ??????? new ResultRowListPreparedStatementCallback(rre));
    405. ? }

    406. ? /**
    407. ?? * 查詢結果。
    408. ?? * @param sql SQL語句
    409. ?? * @param args 參數中的值
    410. ?? * @param rse 全部結果提取器。
    411. ?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
    412. ?? */
    413. ? publicObject query(String sql, Object[] args, ResultSetExtractor rse) {
    414. ??? return (Object) execute(new SimplePreparedStatementCreator(sql),
    415. ??????? new ArgPreparedStatementSetter(args),
    416. ??????? new ResultSetPreparedStatementCallback(rse));
    417. ? }

    418. ? /**
    419. ?? * 查詢一個對象列表結果。
    420. ?? * @param sql SQL語句
    421. ?? * @param pss PreparedStatement的參數設置器
    422. ?? * @param rre 單行結果提取器
    423. ?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
    424. ?? */
    425. ? publicList query(String sql, PreparedStatementSetter pss,
    426. ????? ResultRowExtractor rre) {
    427. ??? return (List) execute(new SimplePreparedStatementCreator(sql), pss,
    428. ??????? new ResultRowListPreparedStatementCallback(rre));
    429. ? }

    430. ? /**
    431. ?? * 查詢結果。
    432. ?? * @param sql SQL語句
    433. ?? * @param pss PreparedStatement的參數設置器
    434. ?? * @param rse 全部結果提取器。
    435. ?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
    436. ?? */
    437. ? publicObject query(String sql, PreparedStatementSetter pss,
    438. ????? ResultSetExtractor rse) {
    439. ??? return (Object) execute(new SimplePreparedStatementCreator(sql), pss,
    440. ??????? new ResultSetPreparedStatementCallback(rse));
    441. ? }
    442. ? /**
    443. ?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
    444. ?? * @param sql SQL語句
    445. ?? * @param bean 結果Bean的類型
    446. ?? * @return 第一行的結果并轉換為Bean實例。
    447. ?? */
    448. ? publicObject queryForBean(String sql, Class bean) {
    449. ??? try {
    450. ????? Object obj = bean.newInstance();
    451. ????? if (obj instanceofMappable) {
    452. ??????? return queryObject(sql, nullPSS, new MappableResultRowExtractor(obj,
    453. ??????????? (Mappable) obj));
    454. ????? } else {
    455. ??????? return queryObject(sql, nullPSS, new MappableResultRowExtractor(obj,
    456. ??????????? newNameMatchMappable()));
    457. ????? }
    458. ??? }
    459. ??? catch (Exception e) {
    460. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    461. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    462. ??? }
    463. ? }

    464. ? /**
    465. ?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
    466. ?? * @param sql SQL語句
    467. ?? * @param args 參數中的值
    468. ?? * @param bean 結果Bean的類型
    469. ?? * @return 第一行的結果并轉換為Bean實例。
    470. ?? */
    471. ? publicObject queryForBean(String sql, Object[] args, Class bean) {
    472. ??? try {
    473. ????? Object obj = bean.newInstance();
    474. ????? if (obj instanceofMappable) {
    475. ??????? return queryObject(sql, new ArgPreparedStatementSetter(args),
    476. ??????????? new MappableResultRowExtractor(obj, (Mappable) obj));
    477. ????? } else {
    478. ??????? return queryObject(sql, new ArgPreparedStatementSetter(args),
    479. ??????????? new MappableResultRowExtractor(obj, newNameMatchMappable()));
    480. ????? }
    481. ??? }
    482. ??? catch (Exception e) {
    483. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    484. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    485. ??? }
    486. ? }

    487. ? /**
    488. ?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
    489. ?? * @param sql SQL語句
    490. ?? * @param args 參數中的值
    491. ?? * @param types 參數類型
    492. ?? * @param bean 結果Bean的類型
    493. ?? * @return 第一行的結果并轉換為Bean實例。
    494. ?? */
    495. ? publicObject queryForBean(String sql, Object[] args, int[] types, Class bean) {
    496. ??? try {
    497. ????? Object obj = bean.newInstance();
    498. ????? if (obj instanceofMappable) {
    499. ??????? return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
    500. ??????????? new MappableResultRowExtractor(obj, (Mappable) obj));
    501. ????? } else {
    502. ??????? return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
    503. ??????????? new MappableResultRowExtractor(obj, newNameMatchMappable()));
    504. ????? }
    505. ??? }
    506. ??? catch (Exception e) {
    507. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    508. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    509. ??? }
    510. ? }

    511. ? /**
    512. ?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
    513. ?? * @param sql SQL語句
    514. ?? * @param pss PreparedStatement的參數設置器
    515. ?? * @param bean 結果Bean的類型
    516. ?? * @return 第一行的結果并轉換為Bean實例。
    517. ?? */
    518. ? publicObject queryForBean(String sql, PreparedStatementSetter pss, Class bean) {
    519. ??? try {
    520. ????? Object obj = bean.newInstance();
    521. ????? if (obj instanceofMappable) {
    522. ??????? return queryObject(sql, pss,
    523. ??????????? new MappableResultRowExtractor(obj, (Mappable) obj));
    524. ????? } else {
    525. ??????? return queryObject(sql, pss,
    526. ??????????? new MappableResultRowExtractor(obj, newNameMatchMappable()));
    527. ????? }
    528. ??? }
    529. ??? catch (Exception e) {
    530. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    531. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    532. ??? }
    533. ? }

    534. ? /**
    535. ?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
    536. ?? * @param sql SQL語句
    537. ?? * @param bean 結果Bean的類型
    538. ?? * @param m 字段-屬性映射器
    539. ?? * @return 第一行的結果并使用m將其轉換為Bean實例。
    540. ?? */
    541. ? publicObject queryForBean(String sql, Class bean, Mappable m) {
    542. ??? try {
    543. ????? return queryObject(sql, nullPSS, new MappableResultRowExtractor(bean
    544. ????????? .newInstance(), m));
    545. ??? }
    546. ??? catch (Exception e) {
    547. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    548. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    549. ??? }
    550. ? }

    551. ? /**
    552. ?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
    553. ?? * @param sql SQL語句
    554. ?? * @param args 參數中的值
    555. ?? * @param bean 結果Bean的類型
    556. ?? * @param m 字段-屬性映射器
    557. ?? * @return 第一行的結果并使用m將其轉換為Bean實例。
    558. ?? */
    559. ? publicObject queryForBean(String sql, Object[] args, Class bean, Mappable m) {
    560. ??? try {
    561. ????? return queryObject(sql, new ArgPreparedStatementSetter(args),
    562. ????????? new MappableResultRowExtractor(bean.newInstance(), m));
    563. ??? }
    564. ??? catch (Exception e) {
    565. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    566. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    567. ??? }
    568. ? }

    569. ? /**
    570. ?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
    571. ?? * @param sql SQL語句
    572. ?? * @param args 參數中的值
    573. ?? * @param types 參數類型
    574. ?? * @param bean 結果Bean的類型
    575. ?? * @param m 字段-屬性映射器
    576. ?? * @return 第一行的結果并使用m將其轉換為Bean實例。
    577. ?? */
    578. ? publicObject queryForBean(String sql, Object[] args, int[] types, Class bean, Mappable m) {
    579. ??? try {
    580. ????? return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
    581. ????????? new MappableResultRowExtractor(bean.newInstance(), m));
    582. ??? }
    583. ??? catch (Exception e) {
    584. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    585. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
    586. ??? }
    587. ? }

    588. ? /**
    589. ?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
    590. ?? * @param sql SQL語句
    591. ?? * @param pss PreparedStatement的參數設置器
    592. ?? * @param bean 結果Bean的類型
    593. ?? * @param m 字段-屬性映射器
    594. ?? * @return 第一行的結果并使用m將其轉換為Bean實例。
    595. ?? */
    596. ? publicObject queryForBean(String sql, PreparedStatementSetter pss,
    597. ????? Class bean, Mappable m) {
    598. ??? try {
    599. ????? return queryObject(sql, pss, new MappableResultRowExtractor(bean
    600. ????????? .newInstance(), m));
    601. ??? }
    602. ??? catch (Exception e) {
    603. ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    604. ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
    605. ??? }
    606. ? }
    607. ? /**
    608. ?? * 無任何參數的PreparedStatement設置器實例。
    609. ?? */
    610. ? privatestaticfinalPreparedStatementSetter nullPSS = newPreparedStatementSetter() {
    611. ??? publicvoid setValues(PreparedStatement ps) {
    612. ??? }
    613. ? };

    614. ? /**
    615. ?? * 將參數數組轉換為PreparedStatement的設置器的簡單適配器。
    616. ?? */
    617. ? privatestaticclass ArgPreparedStatementSetter implements
    618. ????? PreparedStatementSetter {

    619. ??? privatefinalObject[] args;

    620. ??? public ArgPreparedStatementSetter(Object[] args) {
    621. ????? this.args = args;
    622. ??? }

    623. ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
    624. ????? if (this.args != null) {
    625. ??????? for (int i = 0; i < this.args.length; i++) {
    626. ????????? ps.setObject(i + 1, this.args[i]);
    627. ??????? }
    628. ????? }
    629. ??? }
    630. ? }

    631. ? /**
    632. ?? * 將參數數組和其類型轉換為PreparedStatement的設置器的簡單適配器。
    633. ?? */
    634. ? privatestaticclass ArgTypePreparedStatementSetter implements
    635. ????? PreparedStatementSetter {

    636. ??? privatefinalObject[] args;

    637. ??? privatefinalint[] types;

    638. ??? public ArgTypePreparedStatementSetter(Object[] args, int[] types) {
    639. ????? if ((args != null && types == null)
    640. ????????? || (args == null && types != null)
    641. ????????? || (args != null && args.length != types.length)) {
    642. ??????? thrownewJerchException("ArgTypePreparedStatementSetter.ARG_NOT_MATCH");
    643. ????? }
    644. ????? this.args = args;
    645. ????? this.types = types;
    646. ??? }

    647. ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
    648. ????? if (this.args != null) {
    649. ??????? for (int i = 0; i < this.args.length; i++) {
    650. ????????? ps.setObject(i + 1, this.args[i], this.types[i]);
    651. ??????? }
    652. ????? }
    653. ??? }
    654. ? }

    655. ? /**
    656. ?? * 將sql語句轉換為PreparedStatement的創建器的簡單適配器。
    657. ?? */
    658. ? privatestaticclass SimplePreparedStatementCreator implements
    659. ????? PreparedStatementCreator {

    660. ??? privatefinalString sql;

    661. ??? public SimplePreparedStatementCreator(String sql) {
    662. ????? this.sql = sql;
    663. ??? }

    664. ??? publicPreparedStatement createPreparedStatement(Connection con)
    665. ??????? throwsSQLException {
    666. ????? return con.prepareStatement(this.sql);
    667. ??? }
    668. ? }

    669. ? /**
    670. ?? * 將第一個字段作為String類型提取的單行結果提取器。
    671. ?? */
    672. ? privatestaticclass StringResultRowExtractor implementsResultRowExtractor {
    673. ??? publicObject extractRow(java.sql.ResultSet rs) throwsSQLException {
    674. ????? return rs.getString(1);
    675. ??? }
    676. ? }

    677. ? /**
    678. ?? * 將第一個字段作為Object類型提取的單行結果提取器。
    679. ?? */
    680. ? privatestaticclass ObjectResultRowExtractor implementsResultRowExtractor {
    681. ??? publicObject extractRow(java.sql.ResultSet rs) throwsSQLException {
    682. ????? return rs.getObject(1);
    683. ??? }
    684. ? }

    685. ? /**
    686. ?? * 將BatchPreparedStatement設置其轉換為PreparedStatement設置器的適配器。
    687. ?? */
    688. ? privatestaticclass BatchPreparedStatementSetterConverter implements
    689. ????? PreparedStatementSetter {
    690. ??? BatchPreparedStatementSetter bpss;

    691. ??? public BatchPreparedStatementSetterConverter(
    692. ??????? BatchPreparedStatementSetter bpss) {
    693. ????? this.bpss = bpss;
    694. ??? }

    695. ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
    696. ????? for (int i = 0; i < bpss.getBatchSize(); i++) {
    697. ??????? bpss.setValues(ps, i);
    698. ??????? ps.addBatch();
    699. ????? }
    700. ??? }
    701. ? }

    702. ? /**
    703. ?? * 將批量參數數組轉換為PreparedStatement設置器的適配器。
    704. ?? */
    705. ? privatestaticclass ArgBatchPreparedStatementSetter implements
    706. ????? PreparedStatementSetter {

    707. ??? privatefinalObject[][] args;

    708. ??? public ArgBatchPreparedStatementSetter(Object[][] args) {
    709. ????? this.args = args;
    710. ??? }

    711. ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
    712. ????? if (this.args != null) {
    713. ??????? for (int i = 0; i < this.args.length; i++) {
    714. ????????? Object[] arg = args[i];
    715. ????????? for (int j = 0; j < arg.length; j++) {
    716. ??????????? ps.setObject(j + 1, arg[j]);
    717. ????????? }
    718. ????????? ps.addBatch();
    719. ??????? }
    720. ????? }
    721. ??? }
    722. ? }

    723. ? /**
    724. ?? * 將批量參數數組和對應類型轉換為PreparedStatement設置器的適配器。
    725. ?? */
    726. ? privatestaticclass ArgTypeBatchPreparedStatementSetter implements
    727. ????? PreparedStatementSetter {

    728. ??? privatefinalObject[][] args;

    729. ??? privatefinalint[] types;

    730. ??? public ArgTypeBatchPreparedStatementSetter(Object[][] args, int[] types) {
    731. ????? if ((args != null && types == null)
    732. ????????? || (args == null && types != null)
    733. ????????? || (args != null && args.length != types.length)) {
    734. ??????? thrownewJerchException("ArgTypePreparedStatementSetter.ARG_NOT_MATCH");
    735. ????? }
    736. ????? this.args = args;
    737. ????? this.types = types;
    738. ??? }

    739. ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
    740. ????? if (this.args != null) {
    741. ??????? for (int i = 0; i < this.args.length; i++) {
    742. ????????? Object[] arg = args[i];
    743. ????????? for (int j = 0; j < arg.length; j++) {
    744. ??????????? ps.setObject(j + 1, arg[j], types[j]);
    745. ????????? }
    746. ????????? ps.addBatch();
    747. ??????? }
    748. ????? }
    749. ??? }
    750. ? }

    751. ? /**
    752. ?? * 使用ResultRowExtractor提取單行結果并將全部結果添加到List的PreparedStatement回調實現。
    753. ?? */
    754. ? privatestaticclass ResultRowListPreparedStatementCallback implements
    755. ????? PreparedStatementCallback {
    756. ??? ResultRowExtractor rre;

    757. ??? public ResultRowListPreparedStatementCallback(ResultRowExtractor rre) {
    758. ????? this.rre = rre;
    759. ??? }

    760. ??? publicObject doInPreparedStatement(PreparedStatement ps)
    761. ??????? throwsSQLException {
    762. ????? ResultSet rs = null;
    763. ????? List result = newArrayList();
    764. ????? try {
    765. ??????? rs = ps.executeQuery();
    766. ??????? while (rs.next()) {
    767. ????????? result.add(rre.extractRow(rs));
    768. ??????? }
    769. ????? }
    770. ????? catch (SQLException e) {
    771. ??????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    772. ??????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
    773. ????? } finally {
    774. ??????? Utils.closeResultSet(rs);
    775. ????? }
    776. ????? return result;
    777. ??? }
    778. ? }

    779. ? /**
    780. ?? * 使用ResultSetExtractor提取全部結果的PreparedStatement回調實現。
    781. ?? */
    782. ? privatestaticclass ResultSetPreparedStatementCallback implements
    783. ????? PreparedStatementCallback {
    784. ??? ResultSetExtractor rse;

    785. ??? public ResultSetPreparedStatementCallback(ResultSetExtractor rse) {
    786. ????? this.rse = rse;
    787. ??? }

    788. ??? publicObject doInPreparedStatement(PreparedStatement ps)
    789. ??????? throwsSQLException {
    790. ????? ResultSet rs = null;
    791. ????? try {
    792. ??????? rs = ps.executeQuery();
    793. ??????? return rse.extractSet(rs);
    794. ????? }
    795. ????? catch (SQLException e) {
    796. ??????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    797. ??????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
    798. ????? } finally {
    799. ??????? Utils.closeResultSet(rs);
    800. ????? }
    801. ??? }
    802. ? }

    803. ? /**
    804. ?? * 使用Mappable將單行結果轉換為對象實例的ResultRow提取器實現。
    805. ?? */
    806. ? privatestaticclass MappableResultRowExtractor implementsResultRowExtractor {
    807. ??? privateMappable map;

    808. ??? privateObject obj;

    809. ??? public MappableResultRowExtractor(Object obj, Mappable map) {
    810. ????? this.obj = obj;
    811. ????? this.map = map;
    812. ??? }

    813. ??? publicObject extractRow(ResultSet rs) throwsSQLException {
    814. ????? Class c = obj.getClass();
    815. ????? ResultSetMetaData metaData = rs.getMetaData();
    816. ????? int count = metaData.getColumnCount();
    817. ????? try {
    818. ??????? for (int i = 0; i < count; i++) {
    819. ????????? String fieldName = metaData.getColumnName(i + 1);
    820. ????????? int type = metaData.getColumnType(i + 1);
    821. ????????? Class[] types = { map.getMethodParameterType(fieldName, type) };
    822. ????????? Method m = c.getMethod(map.getMapMethod(fieldName), types);
    823. ????????? Object[] args = { ValueConverterFactory.convert(rs
    824. ????????????? .getObject(fieldName), types[0]) };
    825. ????????? m.invoke(obj, args);
    826. ??????? }
    827. ????? }
    828. ????? catch (Exception e) {
    829. ??????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
    830. ??????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
    831. ????? }
    832. ????? return obj;
    833. ??? }
    834. ? }
    835. }


    大盤預測 國富論
    posted on 2007-09-10 11:24 華夢行 閱讀(2383) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲欧美日韩综合久久久久 | 亚洲国产a级视频| 国产亚洲国产bv网站在线| 久久久国产精品无码免费专区| 亚洲一区二区视频在线观看 | 国产一级a毛一级a看免费视频 | 久久国产乱子伦精品免费不卡 | 无码区日韩特区永久免费系列| 国产亚洲一区二区在线观看| jizz在线免费播放| 国产精品久久免费视频| 亚洲国产欧美一区二区三区| 歪歪漫画在线观看官网免费阅读 | 日韩激情淫片免费看| 中文字幕亚洲男人的天堂网络| 亚洲国产成人精品无码区花野真一| 国产91色综合久久免费分享| 久久精品国产亚洲av麻豆| 97超高清在线观看免费视频| 亚洲真人日本在线| 一级a性色生活片久久无少妇一级婬片免费放 | 免费视频精品一区二区三区| 亚洲欧洲美洲无码精品VA| 中国一级全黄的免费观看| 伊人久久综在合线亚洲91| 精品无码国产污污污免费网站国产| 久久亚洲高清综合| 在线免费视频你懂的| 永久亚洲成a人片777777| 三年片免费观看大全国语| 亚洲精品乱码久久久久66| 中文字幕在线免费看| 亚洲区小说区图片区QVOD| 3344在线看片免费| 亚洲电影国产一区| 最近中文字幕免费2019| 亚洲一级毛片免费观看| 好男人视频在线观看免费看片| 亚洲精品国产av成拍色拍| 又粗又大又猛又爽免费视频| 色爽黄1000部免费软件下载|