-
/**
-
* Copyright: Copyright (c) 2005-2005
-
* Company: JavaResearch(http://www.javaresearch.org)
-
*/
-
package
org.javaresearch.jerch;
-
-
-
-
import
java.lang.reflect.Method;
-
import
java.sql.Connection;
-
import
java.sql.PreparedStatement;
-
import
java.sql.ResultSet;
-
import
java.sql.ResultSetMetaData;
-
import
java.sql.SQLException;
-
import
java.util.ArrayList;
-
import
java.util.List;
-
-
import
javax.sql.DataSource;
-
-
/**
-
* JDBC的模板定義,包含所有支持的方法。
-
* 這個類是這個類庫的核心,所有的實際功能差不多都是這個定義并完成的。
-
* 最后更新日期:2005年5月7日
-
* @author cherami
-
*/
-
public
class
JDBCTemplate
{
- ? /**
-
?? * 數據源。
-
?? */
- ? privateDataSource datasource;
- ? /**
-
?? * 構造一個空的JDBCTemplate。
-
?? */
- ? protectedJDBCTemplate() {
-
- ? }
- ? /**
-
?? * 以指定的數據源構造一個JDBCTemplate。
-
?? * @param datasource 數據源
-
?? */
- ? protectedJDBCTemplate(DataSource datasource) {
- ??? this.datasource = datasource;
- ? }
- ?
- ?
- ? /**
-
?? * 設置當前JDBCTemplate的數據源。
-
?? * @param datasource 數據源
-
?? */
- ? protectedvoid setDataSource(DataSource datasource) {
- ??? this.datasource = datasource;
- ? }
- ? /**
-
?? * 得到當前JDBCTemplate的數據源。
-
?? * @return 當前JDBCTemplate的數據源
-
?? */
- ? protectedDataSource getDataSource() {
- ??? return datasource;
- ? }
- ? /**
-
?? * 使用psc創建PreparedStatement并使用pss設置相關的參數最后調用action執行。
-
?? * @param psc PreparedStatement的創建器
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @param action PreparedStatement執行的回掉實現
-
?? * @return 執行后的結果
-
?? */
- ? publicObject execute(PreparedStatementCreator psc,
- ????? PreparedStatementSetter pss, PreparedStatementCallback action) {
- ??? Connection con = Utils.getConnection(datasource);
- ??? PreparedStatement ps = null;
- ??? try {
- ????? ps = psc.createPreparedStatement(con);
- ????? pss.setValues(ps);
- ????? Object result = action.doInPreparedStatement(ps);
- ????? return result;
- ??? }
- ??? catch (SQLException ex) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", ex);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",ex);
- ??? } finally {
- ????? Utils.closeStatement(ps);
- ????? Utils.closeConnection(con);
- ??? }
- ? }
- ? /**
-
?? * 執行指定的sql并返回更新的記錄數。
-
?? * @param sql SQL語句
-
?? * @return 更新的記錄數
-
?? */
- ? publicint update(String sql) {
- ??? return update(sql, nullPSS);
- ? }
- ? /**
-
?? * 執行指定的sql并返回更新的記錄數。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @return 更新的記錄數
-
?? */
- ? publicint update(String sql, Object[] args) {
- ??? return update(sql, new ArgPreparedStatementSetter(args));
- ? }
- ? /**
-
?? * 執行指定的sql并返回更新的記錄數。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @return 更新的記錄數
-
?? */
- ? publicint update(String sql, Object[] args, int[] types) {
- ??? return update(sql, new ArgTypePreparedStatementSetter(args, types));
- ? }
- ? /**
-
?? * 執行指定的sql并返回更新的記錄數。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @return 更新的記錄數
-
?? */
- ? publicint update(String sql, PreparedStatementSetter pss) {
- ??? Integer result = (Integer) execute(new SimplePreparedStatementCreator(sql),
- ??????? pss, newPreparedStatementCallback() {
- ????????? publicObject doInPreparedStatement(PreparedStatement stmt)
- ????????????? throwsSQLException {
- ??????????? returnnewInteger(stmt.executeUpdate());
- ????????? }
- ??????? });
- ??? return result.intValue();
- ? }
- ? /**
-
?? * 批量執行更新并返回每次的更新記錄數
-
?? * @param sql SQL語句
-
?? * @param args 每次執行時的參數值
-
?? * @return 每次執行更新的記錄數數組
-
?? */
- ? publicint[] batchUpdate(String sql, Object[][] args) {
- ??? return batchUpdate(sql, new ArgBatchPreparedStatementSetter(args));
- ? }
-
- ? /**
-
?? * 批量執行更新并返回每次的更新記錄數
-
?? * @param sql SQL語句
-
?? * @param args 每次執行時的參數值
-
?? * @param types 參數類型
-
?? * @return 每次執行更新的記錄數數組
-
?? */
- ? publicint[] batchUpdate(String sql, Object[][] args, int[] types) {
- ??? return batchUpdate(sql,
- ??????? new ArgTypeBatchPreparedStatementSetter(args, types));
- ? }
-
- ? /**
-
?? * 批量執行更新并返回每次的更新記錄數
-
?? * @param sql SQL語句
-
?? * @param bpss PreparedStatement的批量參數設置器
-
?? * @return 每次執行更新的記錄數數組
-
?? */
- ? publicint[] batchUpdate(String sql, BatchPreparedStatementSetter bpss) {
- ??? return batchUpdate(sql, new BatchPreparedStatementSetterConverter(bpss));
- ? }
-
- ? /**
-
?? * 批量執行更新并返回每次的更新記錄數
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @return 每次執行更新的記錄數數組
-
?? */
- ? publicint[] batchUpdate(String sql, PreparedStatementSetter pss) {
- ??? return (int[]) execute(new SimplePreparedStatementCreator(sql), pss,
- ??????? newPreparedStatementCallback() {
- ????????? publicObject doInPreparedStatement(PreparedStatement stmt)
- ????????????? throwsSQLException {
- ??????????? return stmt.executeBatch();
- ????????? }
- ??????? });
- ? }
-
- ? /**
-
?? * 查詢一個整型結果。
-
?? * @param sql SQL語句
-
?? * @return 查詢的第一行的第一個字段的整型值。
-
?? */
- ? publicint queryForInt(String sql) {
- ??? return queryForInt(sql, nullPSS);
- ? }
- ? /**
-
?? * 查詢一個整型結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @return 查詢的第一行的第一個字段的整型值。
-
?? */
- ? publicint queryForInt(String sql, Object[] args) {
- ??? return queryForInt(sql, new ArgPreparedStatementSetter(args));
- ? }
- ? /**
-
?? * 查詢一個整型結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @return 查詢的第一行的第一個字段的整型值。
-
?? */
- ? publicint queryForInt(String sql, Object[] args, int[] types) {
- ??? return queryForInt(sql, new ArgTypePreparedStatementSetter(args, types));
- ? }
- ? /**
-
?? *? 查詢一個整型結果。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @return 查詢的第一行的第一個字段的整型值。
-
?? */
- ? publicint queryForInt(String sql, PreparedStatementSetter pss) {
- ??? Number result = (Number) queryObject(sql, pss,
- ??????? new ObjectResultRowExtractor());
- ??? if (result==null) {
- ????? return 0;
- ??? }
- ??? return result.intValue();
- ? }
-
- ? /**
-
?? * 查詢一個長整型結果。
-
?? * @param sql SQL語句
-
?? * @return 查詢的第一行的第一個字段的長整型值。
-
?? */
- ? publiclong queryForLong(String sql) {
- ??? return queryForLong(sql, nullPSS);
- ? }
-
- ? /**
-
?? * 查詢一個長整型結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @return 查詢的第一行的第一個字段的長整型值。
-
?? */
- ? publiclong queryForLong(String sql, Object[] args) {
- ??? return queryForLong(sql, new ArgPreparedStatementSetter(args));
- ? }
-
- ? /**
-
?? * 查詢一個長整型結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @return 查詢的第一行的第一個字段的長整型值。
-
?? */
- ? publiclong queryForLong(String sql, Object[] args, int[] types) {
- ??? return queryForLong(sql, new ArgTypePreparedStatementSetter(args, types));
- ? }
-
- ? /**
-
?? *? 查詢一個長整型結果。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @return 查詢的第一行的第一個字段的長整型值。
-
?? */
- ? publiclong queryForLong(String sql, PreparedStatementSetter pss) {
- ??? Number result = (Number) queryObject(sql, pss,
- ??????? new ObjectResultRowExtractor());
- ??? if (result==null) {
- ????? return 0;
- ??? }
- ??? return result.longValue();
- ? }
-
- ? /**
-
?? * 查詢一個字符串結果。
-
?? * @param sql SQL語句
-
?? * @return 查詢的第一行的第一個字段的字符串值。
-
?? */
- ? publicString queryString(String sql) {
- ??? return queryString(sql, nullPSS);
- ? }
-
- ? /**
-
?? * 查詢一個字符串結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @return 查詢的第一行的第一個字段的字符串值。
-
?? */
- ? publicString queryString(String sql, Object[] args) {
- ??? return queryString(sql, new ArgPreparedStatementSetter(args));
- ? }
-
- ? /**
-
?? * 查詢一個字符串結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @return 查詢的第一行的第一個字段的字符串值。
-
?? */
- ? publicString queryString(String sql, Object[] args, int[] types) {
- ??? return queryString(sql, new ArgTypePreparedStatementSetter(args, types));
- ? }
-
- ? /**
-
?? *? 查詢一個字符串結果。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @return 查詢的第一行的第一個字段的字符串值。
-
?? */
- ? publicString queryString(String sql, PreparedStatementSetter pss) {
- ??? return (String) queryObject(sql, pss, new StringResultRowExtractor());
- ? }
-
- ? /**
-
?? * 查詢一個對象結果。
-
?? * @param sql SQL語句
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
-
?? */
- ? publicObject queryObject(String sql, ResultRowExtractor rre) {
- ??? return queryObject(sql, nullPSS, rre);
- ? }
-
- ? /**
-
?? * 查詢一個對象結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
-
?? */
- ? publicObject queryObject(String sql, Object[] args, ResultRowExtractor rre) {
- ??? return queryObject(sql, new ArgPreparedStatementSetter(args), rre);
- ? }
-
- ? /**
-
?? * 查詢一個對象結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
-
?? */
- ? publicObject queryObject(String sql, Object[] args, int[] types,
- ????? ResultRowExtractor rre) {
- ??? return queryObject(sql, new ArgTypePreparedStatementSetter(args, types),
- ??????? rre);
- ? }
-
- ? /**
-
?? * 查詢一個對象結果。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢的第一行的結果并使用rre轉換為結果對象。
-
?? */
- ? publicObject queryObject(String sql, PreparedStatementSetter pss,
- ????? finalResultRowExtractor rre) {
- ??? Object result = (Object) execute(new SimplePreparedStatementCreator(sql),
- ??????? pss, newPreparedStatementCallback() {
- ????????? publicObject doInPreparedStatement(PreparedStatement ps)
- ????????????? throwsSQLException {
- ??????????? ResultSet rs = null;
- ??????????? try {
- ????????????? rs = ps.executeQuery();
- ????????????? if (rs.next()) {
- ??????????????? return rre.extractRow(rs);
- ????????????? } else {
- ??????????????? returnnull;
- ????????????? }
- ??????????? }
- ??????????? catch (SQLException e) {
- ????????????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????????????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??????????? } finally {
- ????????????? Utils.closeResultSet(rs);
- ??????????? }
- ????????? }
- ??????? });
- ??? return result;
- ? }
-
- ? /**
-
?? * 查詢一個對象列表結果。
-
?? * @param sql SQL語句
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
-
?? */
- ? publicList query(String sql, ResultRowExtractor rre) {
- ??? return (List) execute(new SimplePreparedStatementCreator(sql), nullPSS,
- ??????? new ResultRowListPreparedStatementCallback(rre));
- ? }
- ? /**
-
?? * 查詢結果。
-
?? * @param sql SQL語句
-
?? * @param rse 全部結果提取器。
-
?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
-
?? */
- ? publicObject query(String sql, finalResultSetExtractor rse) {
- ??? return (Object) execute(new SimplePreparedStatementCreator(sql), nullPSS,
- ??????? new ResultSetPreparedStatementCallback(rse));
- ? }
-
- ? /**
-
?? * 查詢一個對象列表結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
-
?? */
- ? publicList query(String sql, Object[] args, int[] types, ResultRowExtractor rre) {
- ??? return (List) execute(new SimplePreparedStatementCreator(sql),
- ??????? new ArgTypePreparedStatementSetter(args,types),
- ??????? new ResultRowListPreparedStatementCallback(rre));
- ? }
-
- ? /**
-
?? * 查詢結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @param rse 全部結果提取器。
-
?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
-
?? */
- ? publicObject query(String sql, Object[] args, int[] types, ResultSetExtractor rse) {
- ??? return (Object) execute(new SimplePreparedStatementCreator(sql),
- ??????? new ArgTypePreparedStatementSetter(args,types),
- ??????? new ResultSetPreparedStatementCallback(rse));
- ? }
-
- ? /**
-
?? * 查詢一個對象列表結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
-
?? */
- ? publicList query(String sql, Object[] args, ResultRowExtractor rre) {
- ??? return (List) execute(new SimplePreparedStatementCreator(sql),
- ??????? new ArgPreparedStatementSetter(args),
- ??????? new ResultRowListPreparedStatementCallback(rre));
- ? }
-
- ? /**
-
?? * 查詢結果。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param rse 全部結果提取器。
-
?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
-
?? */
- ? publicObject query(String sql, Object[] args, ResultSetExtractor rse) {
- ??? return (Object) execute(new SimplePreparedStatementCreator(sql),
- ??????? new ArgPreparedStatementSetter(args),
- ??????? new ResultSetPreparedStatementCallback(rse));
- ? }
-
- ? /**
-
?? * 查詢一個對象列表結果。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @param rre 單行結果提取器
-
?? * @return 查詢所有結果并使用rre將每行結果轉換為結果對象元素。
-
?? */
- ? publicList query(String sql, PreparedStatementSetter pss,
- ????? ResultRowExtractor rre) {
- ??? return (List) execute(new SimplePreparedStatementCreator(sql), pss,
- ??????? new ResultRowListPreparedStatementCallback(rre));
- ? }
-
- ? /**
-
?? * 查詢結果。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @param rse 全部結果提取器。
-
?? * @return 查詢結果并根據自定義的結果提取器提取數據并返回。
-
?? */
- ? publicObject query(String sql, PreparedStatementSetter pss,
- ????? ResultSetExtractor rse) {
- ??? return (Object) execute(new SimplePreparedStatementCreator(sql), pss,
- ??????? new ResultSetPreparedStatementCallback(rse));
- ? }
- ? /**
-
?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
-
?? * @param sql SQL語句
-
?? * @param bean 結果Bean的類型
-
?? * @return 第一行的結果并轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, Class bean) {
- ??? try {
- ????? Object obj = bean.newInstance();
- ????? if (obj instanceofMappable) {
- ??????? return queryObject(sql, nullPSS, new MappableResultRowExtractor(obj,
- ??????????? (Mappable) obj));
- ????? } else {
- ??????? return queryObject(sql, nullPSS, new MappableResultRowExtractor(obj,
- ??????????? newNameMatchMappable()));
- ????? }
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param bean 結果Bean的類型
-
?? * @return 第一行的結果并轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, Object[] args, Class bean) {
- ??? try {
- ????? Object obj = bean.newInstance();
- ????? if (obj instanceofMappable) {
- ??????? return queryObject(sql, new ArgPreparedStatementSetter(args),
- ??????????? new MappableResultRowExtractor(obj, (Mappable) obj));
- ????? } else {
- ??????? return queryObject(sql, new ArgPreparedStatementSetter(args),
- ??????????? new MappableResultRowExtractor(obj, newNameMatchMappable()));
- ????? }
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @param bean 結果Bean的類型
-
?? * @return 第一行的結果并轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, Object[] args, int[] types, Class bean) {
- ??? try {
- ????? Object obj = bean.newInstance();
- ????? if (obj instanceofMappable) {
- ??????? return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
- ??????????? new MappableResultRowExtractor(obj, (Mappable) obj));
- ????? } else {
- ??????? return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
- ??????????? new MappableResultRowExtractor(obj, newNameMatchMappable()));
- ????? }
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并根據字段名自動轉換為bean的對應屬性。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @param bean 結果Bean的類型
-
?? * @return 第一行的結果并轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, PreparedStatementSetter pss, Class bean) {
- ??? try {
- ????? Object obj = bean.newInstance();
- ????? if (obj instanceofMappable) {
- ??????? return queryObject(sql, pss,
- ??????????? new MappableResultRowExtractor(obj, (Mappable) obj));
- ????? } else {
- ??????? return queryObject(sql, pss,
- ??????????? new MappableResultRowExtractor(obj, newNameMatchMappable()));
- ????? }
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
-
?? * @param sql SQL語句
-
?? * @param bean 結果Bean的類型
-
?? * @param m 字段-屬性映射器
-
?? * @return 第一行的結果并使用m將其轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, Class bean, Mappable m) {
- ??? try {
- ????? return queryObject(sql, nullPSS, new MappableResultRowExtractor(bean
- ????????? .newInstance(), m));
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param bean 結果Bean的類型
-
?? * @param m 字段-屬性映射器
-
?? * @return 第一行的結果并使用m將其轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, Object[] args, Class bean, Mappable m) {
- ??? try {
- ????? return queryObject(sql, new ArgPreparedStatementSetter(args),
- ????????? new MappableResultRowExtractor(bean.newInstance(), m));
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
-
?? * @param sql SQL語句
-
?? * @param args 參數中的值
-
?? * @param types 參數類型
-
?? * @param bean 結果Bean的類型
-
?? * @param m 字段-屬性映射器
-
?? * @return 第一行的結果并使用m將其轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, Object[] args, int[] types, Class bean, Mappable m) {
- ??? try {
- ????? return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
- ????????? new MappableResultRowExtractor(bean.newInstance(), m));
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR", e);
- ??? }
- ? }
-
- ? /**
-
?? * 查詢并返回第一行的結果并使用m將其轉換為bean。
-
?? * @param sql SQL語句
-
?? * @param pss PreparedStatement的參數設置器
-
?? * @param bean 結果Bean的類型
-
?? * @param m 字段-屬性映射器
-
?? * @return 第一行的結果并使用m將其轉換為Bean實例。
-
?? */
- ? publicObject queryForBean(String sql, PreparedStatementSetter pss,
- ????? Class bean, Mappable m) {
- ??? try {
- ????? return queryObject(sql, pss, new MappableResultRowExtractor(bean
- ????????? .newInstance(), m));
- ??? }
- ??? catch (Exception e) {
- ????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
- ??? }
- ? }
- ? /**
-
?? * 無任何參數的PreparedStatement設置器實例。
-
?? */
- ? privatestaticfinalPreparedStatementSetter nullPSS = newPreparedStatementSetter() {
- ??? publicvoid setValues(PreparedStatement ps) {
- ??? }
- ? };
-
- ? /**
-
?? * 將參數數組轉換為PreparedStatement的設置器的簡單適配器。
-
?? */
- ? privatestaticclass ArgPreparedStatementSetter implements
- ????? PreparedStatementSetter {
-
- ??? privatefinalObject[] args;
-
- ??? public ArgPreparedStatementSetter(Object[] args) {
- ????? this.args = args;
- ??? }
-
- ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
- ????? if (this.args != null) {
- ??????? for (int i = 0; i < this.args.length; i++) {
- ????????? ps.setObject(i + 1, this.args[i]);
- ??????? }
- ????? }
- ??? }
- ? }
-
- ? /**
-
?? * 將參數數組和其類型轉換為PreparedStatement的設置器的簡單適配器。
-
?? */
- ? privatestaticclass ArgTypePreparedStatementSetter implements
- ????? PreparedStatementSetter {
-
- ??? privatefinalObject[] args;
-
- ??? privatefinalint[] types;
-
- ??? public ArgTypePreparedStatementSetter(Object[] args, int[] types) {
- ????? if ((args != null && types == null)
- ????????? || (args == null && types != null)
- ????????? || (args != null && args.length != types.length)) {
- ??????? thrownewJerchException("ArgTypePreparedStatementSetter.ARG_NOT_MATCH");
- ????? }
- ????? this.args = args;
- ????? this.types = types;
- ??? }
-
- ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
- ????? if (this.args != null) {
- ??????? for (int i = 0; i < this.args.length; i++) {
- ????????? ps.setObject(i + 1, this.args[i], this.types[i]);
- ??????? }
- ????? }
- ??? }
- ? }
-
- ? /**
-
?? * 將sql語句轉換為PreparedStatement的創建器的簡單適配器。
-
?? */
- ? privatestaticclass SimplePreparedStatementCreator implements
- ????? PreparedStatementCreator {
-
- ??? privatefinalString sql;
-
- ??? public SimplePreparedStatementCreator(String sql) {
- ????? this.sql = sql;
- ??? }
-
- ??? publicPreparedStatement createPreparedStatement(Connection con)
- ??????? throwsSQLException {
- ????? return con.prepareStatement(this.sql);
- ??? }
- ? }
-
- ? /**
-
?? * 將第一個字段作為String類型提取的單行結果提取器。
-
?? */
- ? privatestaticclass StringResultRowExtractor implementsResultRowExtractor {
- ??? publicObject extractRow(java.sql.ResultSet rs) throwsSQLException {
- ????? return rs.getString(1);
- ??? }
- ? }
-
- ? /**
-
?? * 將第一個字段作為Object類型提取的單行結果提取器。
-
?? */
- ? privatestaticclass ObjectResultRowExtractor implementsResultRowExtractor {
- ??? publicObject extractRow(java.sql.ResultSet rs) throwsSQLException {
- ????? return rs.getObject(1);
- ??? }
- ? }
-
- ? /**
-
?? * 將BatchPreparedStatement設置其轉換為PreparedStatement設置器的適配器。
-
?? */
- ? privatestaticclass BatchPreparedStatementSetterConverter implements
- ????? PreparedStatementSetter {
- ??? BatchPreparedStatementSetter bpss;
-
- ??? public BatchPreparedStatementSetterConverter(
- ??????? BatchPreparedStatementSetter bpss) {
- ????? this.bpss = bpss;
- ??? }
-
- ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
- ????? for (int i = 0; i < bpss.getBatchSize(); i++) {
- ??????? bpss.setValues(ps, i);
- ??????? ps.addBatch();
- ????? }
- ??? }
- ? }
-
- ? /**
-
?? * 將批量參數數組轉換為PreparedStatement設置器的適配器。
-
?? */
- ? privatestaticclass ArgBatchPreparedStatementSetter implements
- ????? PreparedStatementSetter {
-
- ??? privatefinalObject[][] args;
-
- ??? public ArgBatchPreparedStatementSetter(Object[][] args) {
- ????? this.args = args;
- ??? }
-
- ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
- ????? if (this.args != null) {
- ??????? for (int i = 0; i < this.args.length; i++) {
- ????????? Object[] arg = args[i];
- ????????? for (int j = 0; j < arg.length; j++) {
- ??????????? ps.setObject(j + 1, arg[j]);
- ????????? }
- ????????? ps.addBatch();
- ??????? }
- ????? }
- ??? }
- ? }
-
- ? /**
-
?? * 將批量參數數組和對應類型轉換為PreparedStatement設置器的適配器。
-
?? */
- ? privatestaticclass ArgTypeBatchPreparedStatementSetter implements
- ????? PreparedStatementSetter {
-
- ??? privatefinalObject[][] args;
-
- ??? privatefinalint[] types;
-
- ??? public ArgTypeBatchPreparedStatementSetter(Object[][] args, int[] types) {
- ????? if ((args != null && types == null)
- ????????? || (args == null && types != null)
- ????????? || (args != null && args.length != types.length)) {
- ??????? thrownewJerchException("ArgTypePreparedStatementSetter.ARG_NOT_MATCH");
- ????? }
- ????? this.args = args;
- ????? this.types = types;
- ??? }
-
- ??? publicvoid setValues(PreparedStatement ps) throwsSQLException {
- ????? if (this.args != null) {
- ??????? for (int i = 0; i < this.args.length; i++) {
- ????????? Object[] arg = args[i];
- ????????? for (int j = 0; j < arg.length; j++) {
- ??????????? ps.setObject(j + 1, arg[j], types[j]);
- ????????? }
- ????????? ps.addBatch();
- ??????? }
- ????? }
- ??? }
- ? }
-
- ? /**
-
?? * 使用ResultRowExtractor提取單行結果并將全部結果添加到List的PreparedStatement回調實現。
-
?? */
- ? privatestaticclass ResultRowListPreparedStatementCallback implements
- ????? PreparedStatementCallback {
- ??? ResultRowExtractor rre;
-
- ??? public ResultRowListPreparedStatementCallback(ResultRowExtractor rre) {
- ????? this.rre = rre;
- ??? }
-
- ??? publicObject doInPreparedStatement(PreparedStatement ps)
- ??????? throwsSQLException {
- ????? ResultSet rs = null;
- ????? List result = newArrayList();
- ????? try {
- ??????? rs = ps.executeQuery();
- ??????? while (rs.next()) {
- ????????? result.add(rre.extractRow(rs));
- ??????? }
- ????? }
- ????? catch (SQLException e) {
- ??????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ??????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
- ????? } finally {
- ??????? Utils.closeResultSet(rs);
- ????? }
- ????? return result;
- ??? }
- ? }
-
- ? /**
-
?? * 使用ResultSetExtractor提取全部結果的PreparedStatement回調實現。
-
?? */
- ? privatestaticclass ResultSetPreparedStatementCallback implements
- ????? PreparedStatementCallback {
- ??? ResultSetExtractor rse;
-
- ??? public ResultSetPreparedStatementCallback(ResultSetExtractor rse) {
- ????? this.rse = rse;
- ??? }
-
- ??? publicObject doInPreparedStatement(PreparedStatement ps)
- ??????? throwsSQLException {
- ????? ResultSet rs = null;
- ????? try {
- ??????? rs = ps.executeQuery();
- ??????? return rse.extractSet(rs);
- ????? }
- ????? catch (SQLException e) {
- ??????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ??????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
- ????? } finally {
- ??????? Utils.closeResultSet(rs);
- ????? }
- ??? }
- ? }
-
- ? /**
-
?? * 使用Mappable將單行結果轉換為對象實例的ResultRow提取器實現。
-
?? */
- ? privatestaticclass MappableResultRowExtractor implementsResultRowExtractor {
- ??? privateMappable map;
-
- ??? privateObject obj;
-
- ??? public MappableResultRowExtractor(Object obj, Mappable map) {
- ????? this.obj = obj;
- ????? this.map = map;
- ??? }
-
- ??? publicObject extractRow(ResultSet rs) throwsSQLException {
- ????? Class c = obj.getClass();
- ????? ResultSetMetaData metaData = rs.getMetaData();
- ????? int count = metaData.getColumnCount();
- ????? try {
- ??????? for (int i = 0; i < count; i++) {
- ????????? String fieldName = metaData.getColumnName(i + 1);
- ????????? int type = metaData.getColumnType(i + 1);
- ????????? Class[] types = { map.getMethodParameterType(fieldName, type) };
- ????????? Method m = c.getMethod(map.getMapMethod(fieldName), types);
- ????????? Object[] args = { ValueConverterFactory.convert(rs
- ????????????? .getObject(fieldName), types[0]) };
- ????????? m.invoke(obj, args);
- ??????? }
- ????? }
- ????? catch (Exception e) {
- ??????? Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
- ??????? thrownewJerchException("JDBCTemplate.EXECUTE_ERROR",e);
- ????? }
- ????? return obj;
- ??? }
- ? }
- }
大盤預測
國富論
posted on 2007-09-10 11:24
華夢行 閱讀(2383)
評論(0) 編輯 收藏