`
liukai
  • 浏览: 706335 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

jdbcTemplate的封装

阅读更多
转载http://www.iteye.com/topic/368070
感谢陈志平

package com.cnc.erp.jdbc;

import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet;
import org.springframework.util.Assert;

import com.cnc.erp.cfg.Globals;
import com.cnc.erp.jdbc.permission.RecordPermissionChecker;
import com.cnc.erp.jdbc.support.QueryObject;
import com.cnc.erp.jdbc.support.QueryParam;
import com.cnc.erp.jdbc.support.QuerySqlParser;
import com.cnc.erp.jdbc.support.QueryWebParameter;
import com.cnc.erp.jdbc.support.QueryWebUtils;
import com.cnc.erp.util.Log;
import com.cnc.erp.util.SqlUtil;
import com.cnc.erp.util.StringUtil;

/**
 * 基于spring NamedParameterJdbcTemplate封装的jdbc操作
 * 
 * 待补充的功能:TODO 1)、中间需要增加sql 函数的转换;日志、异常的处理 <br>
 * 2)、另外结合实际需要直接给出xml数据格式
 * 
 * @author 陈志平 chenzp
 * @desc CriteriaPage.java
 * 
 * @说明: web 应用基础平台
 * @date Aug 1, 2006 4:57:47 PM
 * @版权所有: All Right Reserved 2006-2008
 */
public class JdbcDAOImpl extends NamedParameterJdbcDaoSupport implements
		IJdbcDAO {

	// protected Log log = LogFactory.getLog(getClass());

	public JdbcDAOImpl() {
	}

	public JdbcOperations getJdbcOperations() {
		return getNamedParameterJdbcTemplate().getJdbcOperations();
	}

	/**
	 * 直接执行一条sql
	 * 
	 * @param sql
	 */
	public void execute(String sql) {
		Assert.hasText(sql, "sql must be not null");
		getJdbcOperations().execute(sql);
	}

	/**
	 * 可直接运行的sql语句数组
	 * 
	 * @param sql
	 *            update ca_user set a ='newea' ,b=3 where c = 5
	 * @return
	 */
	public int[] batchUpdate(String[] sql) {
		return getJdbcOperations().batchUpdate(sql);
	}

	/**
	 * 注意:这里的sql不支持 命名参数,只能用 ? 代替
	 * 
	 * @param sql
	 *            update ca_user set a =? ,b=? where c = ?
	 * @param dataSet
	 *            List<String[]>
	 * @return
	 */
	public int[] batchUpdate(String sql, final List<String[]> dataSet) {
		BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {

			public int getBatchSize() {
				return dataSet.size();
			}

			public void setValues(PreparedStatement psmt, int i) {
				String[] obj = dataSet.get(i);
				try {
					for (int j = 0; j < obj.length; j++) {
						psmt.setString(j + 1, obj[j]);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};

		return getJdbcOperations().batchUpdate(sql, setter);

	}

	/**
	 * 更新sql语句的执行,没有参数的情况
	 * 
	 * @param sql
	 * @return 受影响的行数
	 */
	public boolean update(String sql) {
		Assert.hasText(sql, "sql must be not null");
		return getJdbcOperations().update(sql) > 0;
	}

	/**
	 * 只有一个参数更新语句执行
	 * 
	 * @param sql:更新语句
	 * @param paramMap:命名参数
	 * @return 受影响的行数
	 */
	public boolean update(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return update(sql, paramMap);
	}

	/**
	 * 更新语句执行
	 * 
	 * @param sql:更新语句
	 * @param paramMap:命名参数
	 * @return 受影响的行数
	 */
	public boolean update(String sql, Map paramMap) {
		// sql = DBSqlParse.parseSql(sql, paramMap);
		getLogInfo(sql, paramMap);
		return getNamedParameterJdbcTemplate().update(sql,
				new MapSqlParameterSource(paramMap)) > 0;
	}

	/**
	 * 单个参数的情况
	 * 
	 * @param sql
	 *            select count(*) from demo where a =: a and b =: b<br>
	 *            select nid from demo where a =: a and b =: b ;其中nid 为数值型
	 * @param namedParam
	 * @param value
	 * @return 返回一个整数值
	 */
	public int queryForInt(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForInt(sql, paramMap);
	}

	/**
	 * 查询单列(类型为整型),返回一个整数值<br>
	 * 多个参数的情况
	 * 
	 * @param sql
	 *            :select count(*) from demo where a =: a and b =: b<br>
	 *            select nid from demo where a =: a and b =: b ;其中nid 为数值型
	 * @param paramMap
	 *            命名参数为key;参数值为value的Map
	 * @return 整数值
	 */
	public int queryForInt(String sql, Map paramMap) {
		getLogInfo(sql, paramMap);
		int i = -1;
		try {
			i = getNamedParameterJdbcTemplate().queryForInt(sql,
					new MapSqlParameterSource(paramMap));
		} catch (EmptyResultDataAccessException ex) {
			logger
					.error("忽略此类错误[EmptyResultDataAccessException],允许查询为空时,返回-1!");
		}
		return i;
	}

	/**
	 * 没有参数的情况,查询单列(类型为整型),返回一个整数值<br>
	 * 
	 * @param sql
	 *            :select count(*) from demo where a =: a and b =: b<br>
	 *            select nid from demo where a =: a and b =: b ;其中nid 为数值型
	 * @return 整数值
	 */
	public int queryForInt(String sql) {
		return queryForInt(sql, null);
	}

	/**
	 * 查询单列(类型为整型),返回一个长整数值<br>
	 * 单个参数的情况
	 * 
	 * @param sql
	 *            :select count(*) from demo where a =: a <br>
	 *            select nid from demo where a =: a ;其中nid 为数值型
	 * @param namedParam
	 *            命名参数
	 * @param value
	 *            参数值
	 * @return
	 */
	public long queryForLong(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForLong(sql, paramMap);
	}

	/**
	 * 查询单列(类型为整型),返回一个整数值<br>
	 * 
	 * @param sql
	 *            :select count(*) from demo where a =: a and b =: b <br>
	 *            select nid from demo where a =: a and b =: b ;其中nid 为数值型
	 * @param paramMap
	 *            命名参数为key;参数值为value的Map
	 * @return 长整数值
	 */
	public long queryForLong(String sql, Map paramMap) {
		getLogInfo(sql, paramMap);
		long l = -1L;
		try {
			l = getNamedParameterJdbcTemplate().queryForLong(sql,
					new MapSqlParameterSource(paramMap));
		} catch (EmptyResultDataAccessException ex) {
			logger
					.error("忽略此类错误[EmptyResultDataAccessException],允许查询为空时,返回-1!");
		}
		return l;
	}

	/**
	 * 查询单列(类型为整型),返回一个整数值<br>
	 * 
	 * @param sql
	 *            :select count(*) from demo where a =: a and b =: b <br>
	 *            select nid from demo where a =: a and b =: b ;其中nid 为数值型
	 * @return 长整数值
	 */
	public long queryForLong(String sql) {
		return queryForLong(sql, null);
	}

	/**
	 * 只取一列的值
	 * 
	 * @param sql
	 *            :select cname from demo where a =: a and b =: b <br>
	 * @param paramMap
	 *            命名参数为key;参数值为value的Map
	 * @return 返回 字符串,或者""
	 */
	public String queryForString(String sql, Map paramMap) {
		getLogInfo(sql, paramMap);
		String str = null;
		try {
			str = (String) getNamedParameterJdbcTemplate().queryForObject(sql,
					paramMap, String.class);
		} catch (EmptyResultDataAccessException ex) {
			logger
					.error("忽略此类错误[EmptyResultDataAccessException],允许查询为空时,返回空字符串!");
		}

		return (str != null ? str : "");
	}

	/**
	 * 只取一列值,返回字符串类型
	 * 
	 * @param sql
	 *            :select cname from demo where nid = 1 <br>
	 * @return 返回 字符串,或者""
	 */
	public String queryForString(String sql) {
		return queryForString(sql, null);
	}

	/**
	 * 单个参数的情况,只取一列的值
	 * 
	 * @param sql
	 *            :select cname from demo where nid = 1 <br>
	 * @param namedParam:命名参数
	 * @param value:参数值
	 * @return 返回 字符串,或者""
	 */
	public String queryForString(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForString(sql, paramMap);
	}

	/**
	 * 取得单表的xml格式数据
	 * 
	 * @param sql:select *
	 *            from demo where nid =: nid and ... <br>
	 * @param paramMap
	 *            命名参数为key;参数值为value的Map
	 * @return &lt;data&gt;&lt;colName&gt;![CDATA[colValues]]&lt;/colName&gt;...&lt;/data&gt;
	 */
	public String selectSingleXml(String sql, Map paramMap, final String pkcol) {
		// sql = DBSqlParse.parseSql(sql, paramMap);
		getLogInfo(sql, paramMap);
		RowMapper mapper = new RowMapper() {
			public Object mapRow(ResultSet rset, int rowNum)
					throws SQLException {
				return row2Xml(rset, pkcol);
			}
		};
		StringBuffer sbuf = new StringBuffer(xmlHead);
		return sbuf.append(
				getNamedParameterJdbcTemplate().queryForObject(sql, paramMap,
						mapper)).toString();
	}

	/**
	 * 没有参数的情况
	 * 
	 * @param sql:select *
	 *            from demo where nid = 1 <br>
	 * @return &lt;data&gt;&lt;colName&gt;![CDATA[colValues]]&lt;/colName&gt;...&lt;/data&gt;
	 */
	public String selectSingleXml(String sql, final String pkcol) {
		return selectSingleXml(sql, null, pkcol);
	}

	/**
	 * 单个参数的情况
	 * 
	 * @param sql
	 *            sql:select * from demo where nid =: nid <br>
	 * @param namedParam
	 *            命名参数nid
	 * @param value
	 *            参数值
	 * @return &lt;data&gt;&lt;colName&gt;![CDATA[colValues]]&lt;/colName&gt;...&lt;/data&gt;
	 */
	public String selectSingleXml(String sql, String namedParam, Object value,
			final String pkcol) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return selectSingleXml(sql, paramMap, pkcol);
	}

	/**
	 * 查询数据库列表,返回多行xml字符串<br>
	 * 
	 * @param sql:
	 *            select * from demo where nid =: nid and ... <br>
	 * @param paramMap
	 *            命名参数为key;参数值为value的Map
	 */
	public String selectXmlList(String sql, Map paramMap, final String pkcol) {
		// sql = DBSqlParse.parseSql(sql, paramMap);
		getLogInfo(sql, paramMap);
		RowMapper mapper = new RowMapper() {
			public Object mapRow(ResultSet rset, int rowNum)
					throws SQLException {
				return row2Xml(rset, pkcol);
			}
		};
		List xmlList = getNamedParameterJdbcTemplate().query(sql, paramMap,
				mapper);
		StringBuffer sbuf = new StringBuffer(
				"<?xml version='1.0' encoding='UTF-8'?><rows>");
		int size = (xmlList != null ? xmlList.size() : 0);
		if (size == 0) {
			return "<?xml version='1.0' encoding='UTF-8'?><rows></rows>";
		}
		for (int i = 0; i < size; i++) {
			sbuf.append(xmlList.get(i)).append("\n");
		}
		return sbuf.append("</rows>").toString();
	}

	/**
	 * 没有参数的情况,返回多行xml字符串
	 * 
	 * @param sql
	 *            select * from demo where nid = 1 <br>
	 * @return grid所用的xml
	 */
	public String selectXmlList(String sql, final String pkcol) {
		return selectXmlList(sql, null, pkcol);
	}

	/**
	 * 单个参数的情况<br>
	 * 不处理blob列情况<br>
	 * 
	 * @param sql
	 *            sql:select * from demo where nid =: nid <br>
	 * @param namedParam
	 *            命名参数nid
	 * @param value
	 *            参数值
	 * @return grid所用的xml
	 */
	public String selectXmlList(String sql, String namedParam, Object value,
			final String pkcol) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return selectXmlList(sql, paramMap, pkcol);
	}

	/**
	 * 转换结果集成xml
	 * 
	 * @param rset
	 * @return
	 * @throws SQLException
	 */
	private static StringBuffer row2Xml(ResultSet rset, String pkcol) {
		try {
			ResultSetMetaData mdRset = rset.getMetaData();

			String colTypeName = null;
			int columnCount = mdRset.getColumnCount();
			StringBuffer xmlStr = new StringBuffer();
			xmlStr.append("<row id='").append(rset.getString(pkcol)).append(
					"'>");
			for (int i = 1; i <= columnCount; i++) {
				// 增加对CLOB的处理
				colTypeName = mdRset.getColumnTypeName(i);
				// 全部转化为小写
				String colName = mdRset.getColumnName(i).toLowerCase();
				String tmp = Globals.EMPTYSTR;
				xmlStr.append("<").append(colName).append("><![CDATA[");
				if ("CLOB".equalsIgnoreCase(colTypeName)
						|| "LONGTEXT".equalsIgnoreCase(colTypeName)
						|| "TEXT".equalsIgnoreCase(colTypeName)) {
					java.sql.Clob clob = rset.getClob(i);
					if (null != clob) {
						tmp = clob.getSubString((long) 1, (int) clob.length());
					}
				} else {
					tmp = (rset.getString(i) == null) ? Globals.EMPTYSTR : rset
							.getString(i);
				}
				try {
					xmlStr.append(tmp);
				} catch (Exception ex) {
					xmlStr.append(Globals.EMPTYSTR);
				}
				xmlStr.append("]]></").append(colName).append(">");
			}
			xmlStr.append("</row>");
			return xmlStr;
		} catch (SQLException e) {
			return new StringBuffer("error " + e.getMessage());
		}
	}

	/**
	 * 转换结果集成xml
	 * 
	 * @param rset
	 * @return
	 * @throws SQLException
	 */
	private static StringBuffer row2Xml(ResultSet rset, String pkcol,
			String[] cols) {
		try {
			if (cols == null) {
				return row2Xml(rset, pkcol);
			}
			ResultSetMetaData mdRset = rset.getMetaData();

			String colTypeName = null;
			int columnCount = mdRset.getColumnCount();
			StringBuffer xmlStr = new StringBuffer();
			xmlStr.append("<row id='").append(rset.getString(pkcol)).append(
					"'>");
			for (int i = 0; i < cols.length && i <= columnCount; i++) {
				// 增加对CLOB的处理
				colTypeName = mdRset.getColumnTypeName(i + 1);
				String tmp = Globals.EMPTYSTR;
				xmlStr.append("<cell><![CDATA[");
				if ("CLOB".equalsIgnoreCase(colTypeName)) {
					java.sql.Clob clob = rset.getClob(cols[i]);
					if (null != clob) {
						tmp = clob.getSubString((long) 1, (int) clob.length());
					}
				} else {
					tmp = (rset.getString(cols[i]) == null) ? Globals.EMPTYSTR
							: rset.getString(cols[i]);
				}
				try {
					xmlStr.append(tmp);
				} catch (Exception ex) {
					xmlStr.append(Globals.EMPTYSTR);
				}
				xmlStr.append("]]></cell>");
			}
			xmlStr.append("</row>");
			return xmlStr;
		} catch (SQLException e) {
			return new StringBuffer("error " + e.getMessage());
		}
	}

	/**
	 * 解析结果集 成 Map对象
	 * 
	 * @param rset
	 * @return 结果集的hashMap
	 * @throws SQLException
	 */
	private static Map row2Map(ResultSet rset) {
		try {
			ResultSetMetaData mdRset = rset.getMetaData();
			String colTypeName = null;
			int columnCount = mdRset.getColumnCount();
			Map<String, Object> paramMap = new HashMap<String, Object>(
					columnCount);

			for (int i = 1; i <= columnCount; i++) {
				// 增加对BLOB\CLOB的处理
				colTypeName = mdRset.getColumnTypeName(i);
				if ("BLOB".equalsIgnoreCase(colTypeName)
						|| "MEDIUMBLOB".equalsIgnoreCase(colTypeName)
						|| "LONGBLOB".equalsIgnoreCase(colTypeName)) {
					Blob tmp = rset.getBlob(i);
					if (null != tmp) {
						byte[] bytes = tmp.getBytes(1, (int) (tmp.length()));
						paramMap.put("hasPicture", "1");
						paramMap.put(
								StringUtil.strnull(mdRset.getColumnName(i))
										.toLowerCase(), bytes);
					} else {
						paramMap.put("hasPicture", "0");
						paramMap.put(
								StringUtil.strnull(mdRset.getColumnName(i))
										.toLowerCase(), new byte[0]);
					}
				} else if ("LONG RAW".equalsIgnoreCase(colTypeName)) {
					byte[] data = rset.getBytes(i);
					if (null != data) {
						paramMap.put("hasPicture", "1");
						paramMap.put(
								StringUtil.strnull(mdRset.getColumnName(i))
										.toLowerCase(), data);
					} else {
						paramMap.put("hasPicture", "0");
						paramMap.put(
								StringUtil.strnull(mdRset.getColumnName(i))
										.toLowerCase(), new byte[0]);
					}
				} else if ("CLOB".equalsIgnoreCase(colTypeName)
						|| "LONGTEXT".equalsIgnoreCase(colTypeName)) {
					java.sql.Clob clob = rset.getClob(i);
					if (null != clob) {
						String tmp = clob.getSubString((long) 1, (int) clob
								.length());
						paramMap.put(
								StringUtil.strnull(mdRset.getColumnName(i))
										.toLowerCase(), tmp);
					} else {
						paramMap.put(
								StringUtil.strnull(mdRset.getColumnName(i))
										.toLowerCase(), "");
					}
				} else {
					String tmp = (rset.getString(i) == null) ? "" : rset
							.getString(i);
					paramMap.put(StringUtil.strnull(mdRset.getColumnName(i))
							.toLowerCase(), tmp);
				}
			}
			return paramMap;
		} catch (SQLException e) {
			Log.error(JdbcDAOImpl.class, "滚动查询分页数据出现错误:" + e.getMessage());
			return null;
		}

	}

	/**
	 * 取得HashMap封装的数据结果集<br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 * @param paramMap:命名参数Map
	 * @return HashMap:[key=colName,value=colValues]
	 */
	public HashMap selectSingleMap(String sql, Map paramMap) {
		getLogInfo(sql, paramMap);
		RowMapper mapper = new RowMapper() {
			public Object mapRow(ResultSet rset, int rowNum)
					throws SQLException {
				return row2Map(rset);
			}
		};
		return (HashMap) getNamedParameterJdbcTemplate().queryForObject(sql,
				paramMap, mapper);

	}

	/**
	 * 取得HashMap封装的数据结果集<br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 * @return HashMap:[key=colName,value=colValues]
	 */
	public HashMap selectSingleMap(String sql) {
		return selectSingleMap(sql, null);
	}

	/**
	 * 没有参数的情况<br>
	 * 取得HashMap封装的数据结果集<br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 * @return HashMap:[key=colName,value=colValues]
	 */
	public HashMap selectSingleMap(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return selectSingleMap(sql, paramMap);
	}

	/**
	 * 只有一个参数的情况 取得HashMap封装的数据结果集<br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 *            "SELECT AGE FROM CUSTMR WHERE ID = :id"
	 * @param namedParam
	 *            "id"
	 * @param value
	 *            133
	 * @return HashMap:[key=colName,value=colValues]
	 */
	public HashMap selectSingleMap(String sql, String namedParam, Object[] value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(value));
		return selectSingleMap(sql, paramMap);
	}

	/**
	 * 只有一个数组参数的情况
	 * 
	 * 取得HashMap封装的数据结果集<br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 *            "SELECT AGE FROM CUSTMR WHERE ID NOT IN (:ids)"
	 * @param namedParam
	 *            "ids"
	 * @param value
	 *            133
	 * @return HashMap:[key=colName,value=colValues]
	 */
	public List selectMapList(String sql, Map paramMap) {
		getLogInfo(sql, paramMap);
		RowMapper mapper = new RowMapper() {
			public Object mapRow(ResultSet rset, int rowNum)
					throws SQLException {
				return row2Map(rset);
			}
		};
		Log.info(JdbcDAOImpl.class, sql);
		return getNamedParameterJdbcTemplate().query(sql, paramMap, mapper);
	}

	/**
	 * 没有参数的情况,获取封装了HashMap的list列表 <br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 *            "SELECT AGE FROM CUSTMR"
	 * @return list 封装了HashMap的list列表
	 */
	public List selectMapList(String sql) {
		return selectMapList(sql, null);
	}

	/**
	 * 获取封装了HashMap的list列表 <br>
	 * 有blob列情况,追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 *            "SELECT AGE FROM CUSTMR WHERE ID = :id"
	 * @param paramMap
	 *            HashMap paramMap = new HashMap(1); paramMap.put("id", new
	 *            Integer(3));
	 * @return list 封装了HashMap的list列表
	 */
	public List selectMapList(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return selectMapList(sql, paramMap);
	}

	/**
	 * 只有一个参数的情况 有blob列情况 <br>
	 * 追加一个key="hasPicture", value="1"、"0"<br>
	 * 
	 * @param sql
	 *            "SELECT AGE FROM CUSTMR WHERE ID in (:id)"
	 * @param namedParam
	 *            "id"
	 * @param value
	 *            133
	 * @return list 封装了HashMap的list列表
	 */
	public List selectMapList(String sql, String namedParam, Object[] value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(value));
		return selectMapList(sql, paramMap);
	}

	/**
	 * 允许用户自己定义返回的行对象类型
	 * 
	 * @param sql
	 * @param paramMap
	 * @param mapper
	 * @return
	 */
	public List selectList(String sql, Map paramMap, RowMapper mapper) {
		getLogInfo(sql, paramMap);
		if (mapper == null) {
			mapper = new RowMapper() {
				public Object mapRow(ResultSet rset, int rowNum)
						throws SQLException {
					return row2Map(rset);
				}
			};
		}
		Log.info(JdbcDAOImpl.class, sql);
		return getNamedParameterJdbcTemplate().query(sql, paramMap, mapper);
	}

	/**
	 * 查询单列的情况
	 * 
	 * @param sql
	 * @param paramMap
	 * @param elementType
	 * @return
	 */
	public List selectSingleColList(String sql, Map paramMap, Class elementType) {
		getLogInfo(sql, paramMap);
		// Log.info(JdbcDAOImpl.class, sql);
		return getNamedParameterJdbcTemplate().queryForList(sql, paramMap,
				elementType);
	}

	/**
	 * 根据动态条件查询返回一个断开连接的结果集,不占用数据库连接资源
	 * 
	 * @param sql-原来的sql
	 * @param paramMap-原有的条件
	 * @param queryObject-动态拼装的查询条件对象
	 * @return ResultSetWrappingSqlRowSet
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql, Map paramMap,
			QueryObject queryObject) {
		Assert.hasText(sql);
		Assert.notNull(queryObject, "queryObject must not be null");
		Map queryMap = queryObject.getParamsMap();
		String querySql = queryObject.getQuerySql().toString();

		// 构造新的sql语句
		String newSql = QuerySqlParser.getQuerySql(sql, querySql);

		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		// 增加动态命名条件
		sqlParam.addValues(queryMap);
		// 日志打印
		getLogInfo(newSql, sqlParam.getValues());
		return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
	}

	/**
	 * 查询返回一个断开连接的结果集,不占用数据库连接资源
	 * 
	 * @param sql
	 * @param paramMap
	 * @return ResultSetWrappingSqlRowSet
	 * 
	 * <pre>
	 *         处理方式参看以下方法:
	 *         getXmlPage(ResultSetWrappingSqlRowSet sqlRowSet, int startIndex, int pageSize){}
	 *         &lt;pre&gt;
	 * 
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql, Map paramMap) {
		Assert.hasText(sql);
		// 日志打印
		getLogInfo(sql, paramMap);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
	}

	/**
	 * 只有一个参数的情况
	 * 
	 * @param sql:查询的sql语句
	 * @param namedParam:命名参数
	 * @param value:参数值
	 * @return 返回一个断开连接的结果集,不占用数据库连接资源
	 * @see ResultSetWrappingSqlRowSet.java
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
			String namedParam, Object value) {
		Assert.hasText(sql);
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForRowSet(sql, paramMap);
	}

	/**
	 * 根据动态条件查询返回一个断开连接的结果集,不占用数据库连接资源
	 * 
	 * @param sql-原来的sql
	 * @param namedParam:命名参数
	 * @param value:参数值
	 * @param queryObject-动态拼装的查询条件对象
	 * @return ResultSetWrappingSqlRowSet
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
			String namedParam, Object value, QueryObject queryObject) {
		Assert.hasText(sql);
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForRowSet(sql, paramMap, queryObject);
	}

	/**
	 * 只有一个参数的情况
	 * 
	 * @param sql:查询的sql语句
	 * @param namedParam:命名参数
	 * @param values:参数数组,用在in的情况
	 * @return 返回一个断开连接的结果集,不占用数据库连接资源
	 * @see ResultSetWrappingSqlRowSet.java
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
			String namedParam, Object[] values) {
		Assert.hasText(sql);
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(values));
		return queryForRowSet(sql, paramMap);
	}

	/**
	 * 根据动态条件查询返回一个断开连接的结果集,不占用数据库连接资源
	 * 
	 * @param sql-原来的sql
	 * @param namedParam:命名参数
	 * @param value:参数数组
	 *            用在in的情况
	 * @param queryObject-动态拼装的查询条件对象
	 * @return ResultSetWrappingSqlRowSet
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
			String namedParam, Object[] values, QueryObject queryObject) {
		Assert.hasText(sql);
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), Arrays.asList(values));
		return queryForRowSet(sql, paramMap, queryObject);
	}

	/**
	 * 没有参数的情况
	 * 
	 * @param sql:查询的sql语句
	 * @param queryObject-动态拼装的查询条件对象
	 * 
	 * @return 返回一个断开连接的结果集,不占用数据库连接资源
	 * @see ResultSetWrappingSqlRowSet.java
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql,
			QueryObject queryObject) {
		Assert.hasText(sql);
		Assert.notNull(queryObject, "queryObject must not be null");
		Map queryMap = queryObject.getParamsMap();
		String querySql = queryObject.getQuerySql().toString();

		// 构造新的sql语句
		String newSql = QuerySqlParser.getQuerySql(sql, querySql);
		Assert.hasText(newSql);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(queryMap);
		// 日志打印
		getLogInfo(newSql, queryMap);
		return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
	}

	/**
	 * 没有参数的情况
	 * 
	 * @param sql:查询的sql语句
	 * @return 返回一个断开连接的结果集,不占用数据库连接资源 see ResultSetWrappingSqlRowSet.java
	 */
	public ResultSetWrappingSqlRowSet queryForRowSet(String sql) {
		Assert.hasText(sql);
		return (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, new MapSqlParameterSource());
	}

	/**
	 * 分页查询<BR>
	 * 1、sql, pageNO, pageSize, mode, Map <BR>
	 * 2、总记录数totalCount的计算:()<BR>
	 * A)count(*)-- queryForInt <BR>
	 * B)滚动指针 -- <BR>
	 * 3、返回结果集SqlRowSet <BR>
	 * A)分不同数据库的情况:转换sql分页语句 <BR>
	 * B)<BR>
	 * 4、取结果集,封装成List(HashMap)<BR>
	 * 5、返回page
	 * 
	 */
	public Page pagedQuery(String sql, int pageNo, int pageSize) {
		return pagedQuery(sql, pageNo, pageSize, null, Constants.COUNT_MODE);
	}

	public Page pagedQuery(String sql, int pageNo, int pageSize,
			String namedParam, Object value) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return pagedQuery(sql, pageNo, pageSize, paramMap, Constants.COUNT_MODE);
	}

	public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap) {
		return pagedQuery(sql, pageNo, pageSize, paramMap, Constants.COUNT_MODE);
	}

	/**
	 * 分页查询
	 */
	public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
			int mode) {
		Assert.hasText(sql);
		// 日志打印
		getLogInfo(sql, paramMap);

		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);

		return getPage(sql, sqlParam, pageNo, pageSize, mode);

		// NamedParameterJdbcTemplate jdbcTemplate =
		// getNamedParameterJdbcTemplate();
		// if (mode == Constants.COUNT_MODE) {
		// // 这个计算支持 group
		// String countQueryString = QuerySqlParser.getCountSql(sql);
		//
		// getLogInfo(countQueryString, paramMap);
		// String tmpsql = countQueryString.toLowerCase().replaceAll("\\s+",
		// " ");
		// int totalCount = 0;
		// // try {
		// // 判断是否有group by
		// if (QuerySqlParser.isFilterGroupBy(tmpsql)) {
		// List ls = jdbcTemplate.queryForList(countQueryString, sqlParam);
		// if (ls != null) {
		// totalCount = ls.size();
		// }
		// } else {
		// totalCount = jdbcTemplate.queryForInt(countQueryString,
		// sqlParam);
		// }
		// return getPageInstanceByCount(sql, totalCount, pageNo, pageSize,
		// sqlParam, jdbcTemplate);
		// } else {
		// return getPageInstanceByScroll(sql, pageNo, pageSize, sqlParam,
		//					jdbcTemplate);
		//		}
	}

	/**
	 * 动态拼装条件的分页查询
	 * 
	 * @param sql
	 * @param paramMap
	 * @param webParam:查询条件,从HTTP
	 *            Request中生成,请参照<br>
	 * @see com.westsnow.base.jdbc.support.QueryWebUtils#generateQueryWebParameter
	 * @return 分页对象
	 */
	public Page pagedQuery(String sql, QueryWebParameter webParam) {
		return pagedQuery(sql, null, webParam);
	}

	/**
	 * 约束条件
	 * 
	 * @param sql
	 * @param webParam
	 * @param gridkey:查询列表命名常量
	 * @return
	 */
	public Page pagedQuery(String sql, QueryWebParameter webParam,
			String gridkey) {
		return pagedQuery(sql, null, webParam, gridkey);
	}

	public Page pagedQuery(String sql, Map paramMap, QueryWebParameter webParam) {
		return pagedQuery(sql, paramMap, webParam, null);
	}

	/**
	 * 动态拼装条件的分页查询
	 * 
	 * @param sql
	 * @param paramMap
	 * @param webParam:查询条件,从HTTP
	 *            Request中生成,请参照<br>
	 * @see com.westsnow.base.jdbc.support.QueryWebUtils#generateQueryWebParameter
	 * @return 分页对象
	 */
	public Page pagedQuery(String sql, Map paramMap,
			QueryWebParameter webParam, String gridkey) {
		Assert.notNull(webParam, "QueryWebParameter must not be null");

		QueryParam queryParam = QueryWebUtils.generateQueryParam(webParam
				.getName(), webParam.getOperator(), webParam.getActualValues());

		QueryObject queryObject = queryParam.toQueryObject();
		// 增加排序条件
		queryObject.setOrderby(webParam.getSortfield(), webParam.getSorttype());

		return pagedQuery(sql, webParam.getPageNo(), webParam.getPageSize(),
				paramMap, queryObject, Constants.COUNT_MODE, gridkey);
	}

	/**
	 * 动态拼装条件的分页查询,默认采用先查询总数,再获取数据的方式
	 * 
	 * @param sql
	 * @param pageNo
	 * @param pageSize
	 * @param paramMap
	 * @param queryObject
	 * @return
	 */
	public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
			QueryObject queryObject) {
		Assert.notNull(queryObject, "queryObject must not be null");
		return pagedQuery(sql, pageNo, pageSize, paramMap, queryObject,
				Constants.COUNT_MODE);
	}

	public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
			QueryObject queryObject, int mode) {

		return pagedQuery(sql, pageNo, pageSize, paramMap, queryObject, mode,
				null);
	}

	/**
	 * 
	 * 分页查询<BR>
	 * 1、sql, pageNO, pageSize, mode, Map <BR>
	 * 2、总记录数totalCount的计算:()<BR>
	 * A)count(*)-- queryForInt <BR>
	 * B)滚动指针 -- <BR>
	 * 3、返回结果集SqlRowSet <BR>
	 * A)分不同数据库的情况:转换sql分页语句 <BR>
	 * B)<BR>
	 * 4、取结果集,封装成List(HashMap)<BR>
	 * 5、返回page
	 * 
	 * @param sql:select
	 *            a.* ,b.name,c.nid from a,b,c where a.bid = b.nid and b.cid =
	 *            c.nid
	 * @param pageNo
	 * @param pageSize
	 * @param paramMap
	 * @param queryObject
	 *            动态条件
	 * @param mode
	 *            <br/> 1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据<br/>
	 *            2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集<br/>
	 * @return Page
	 */
	public Page pagedQuery(String sql, int pageNo, int pageSize, Map paramMap,
			QueryObject queryObject, int mode, String gridkey) {
		Assert.hasText(sql);
		Assert.notNull(queryObject, "queryObject must not be null");
		Map queryMap = queryObject.getParamsMap();

		String orderSql = queryObject.getOrderbySql();

		String querySql = queryObject.getQuerySql().append(" ")
				.append(orderSql).toString();

		// 构造新的sql语句
		String newSql = QuerySqlParser.getQuerySql(sql, querySql);

		// 增加约束条件
		if (StringUtil.isNotEmpty(gridkey)) {
			String limitconf = RecordPermissionChecker.getRecordLimit(gridkey);
			if (logger.isInfoEnabled()) {
				logger.info("列表[" + gridkey + "]的约束条件=" + limitconf);
			}

			if (StringUtil.isNotEmpty(limitconf)) {
				newSql = QuerySqlParser.getQuerySql(newSql, limitconf);
			}
		}

		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		// 增加动态命名条件
		if (null != queryMap && queryMap.size() > 0) {
			sqlParam.addValues(queryMap);
		}
		// 日志打印
		getLogInfo(newSql, sqlParam.getValues());
		return getPage(newSql, sqlParam, pageNo, pageSize, mode);
	}

	/**
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @param mode
	 * @param newSql
	 * @param sqlParam
	 * @return
	 */
	private Page getPage(String newSql, MapSqlParameterSource sqlParam,
			int pageNo, int pageSize, int mode) {
		NamedParameterJdbcTemplate jdbcTemplate = getNamedParameterJdbcTemplate();
		if (mode == Constants.COUNT_MODE) {
			// 这个计算支持 group
			String countQueryString = QuerySqlParser.getCountSql(newSql);
			getLogInfo(countQueryString, sqlParam.getValues());

			int totalCount = 0;
			// try {
			// 判断是否有group by
			String tmpsql = countQueryString.toLowerCase().replaceAll("\\s+",
					" ");
			if (QuerySqlParser.isFilterGroupBy(tmpsql)) {
				List ls = jdbcTemplate.queryForList(countQueryString, sqlParam);
				if (ls != null) {
					totalCount = ls.size();
				}
			} else {
				totalCount = jdbcTemplate.queryForInt(countQueryString,
						sqlParam);
			}
			// } catch (Exception ex) {
			//
			// }

			return getPageInstanceByCount(newSql, totalCount, pageNo, pageSize,
					sqlParam, jdbcTemplate);
		} else {
			return getPageInstanceByScroll(newSql, pageNo, pageSize, sqlParam,
					jdbcTemplate);
		}
	}

	/**
	 * 分页查询
	 * 
	 * @param sql:查询的sql语句
	 *            <br/>
	 * @param pageNo:页号
	 *            <br/>
	 * @param pageSize:每页显示的数目
	 *            <br/>
	 * @param namedParam:命名参数
	 *            <br/>
	 * @param value:参数值
	 *            <br/>
	 * @param mode
	 *            <br/> 1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据<br/>
	 *            2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集<br/>
	 * 
	 * @return 分页对象Page
	 */
	public Page pagedQuery(String sql, int pageNo, int pageSize,
			String namedParam, Object value, int mode) {
		Assert.hasText(sql);
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		getLogInfo(sql, paramMap);
		return pagedQuery(sql, pageNo, pageSize, paramMap, mode);
	}

	/**
	 * 分页查询--滚动分页
	 * 
	 * @param sql:查询的sql语句
	 *            <br/>
	 * @param pageNo:页号
	 *            <br/>
	 * @param pageSize:每页显示的数目
	 *            <br/>
	 * @param namedParam:命名参数
	 *            <br/>
	 * @param value:参数值
	 *            <br/>
	 * @param mode
	 *            <br/> 1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据<br/>
	 *            2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集<br/>
	 * @return 分页对象Page
	 */
	public Page pagedQuery(String sql, int pageNo, int pageSize, int mode) {
		Assert.hasText(sql);
		getLogInfo(sql, null);
		return pagedQuery(sql, pageNo, pageSize, null, mode);
	}

	/**
	 * 内部方法,不建议外部调用;返回分页数据
	 * 
	 * @param sql
	 *            查询sql语句
	 * @param totalSize
	 *            总记录数
	 * @param pageNo
	 *            第几页
	 * @param pageSize
	 *            每页显示记录数
	 * @param MapSqlParameterSource
	 *            参数Map
	 * @param jdbcTemplate
	 *            命名参数模版
	 * @return 返回分页数据
	 */
	protected static Page getPageInstanceByCount(String sql, int totalSize,
			int pageNo, int pageSize, MapSqlParameterSource sqlParam,
			NamedParameterJdbcTemplate jdbcTemplate) {
		if (totalSize < 1)
			return new Page();
		pageSize = pageSize <= 0 ? Constants.DEFAULT_PAGE_SIZE : pageSize;// 20
		pageNo = pageNo <= 0 ? 1 : pageNo;// 1
		int startIndex = (pageNo - 1) * pageSize;
		int endIndex = startIndex + pageSize;
		String pagingSql = SqlUtil.getLimitString(sql, startIndex, endIndex);

		List results = jdbcTemplate.queryForList(pagingSql, sqlParam);
		return new Page(startIndex, totalSize, pageSize, results);

	}

	/**
	 * 内部方法,不建议外部调用;返回分页数据 采用滚动指针方式查询
	 * 
	 * @param sql
	 *            查询sql语句
	 * @param totalSize
	 *            总记录数
	 * @param pageNo
	 *            第几页
	 * @param pageSize
	 *            每页显示记录数
	 * @param MapSqlParameterSource
	 *            参数Map
	 * @param jdbcTemplate
	 *            命名参数模版
	 * @return 返回分页数据
	 */
	protected static Page getPageInstanceByScroll(String sql, int pageNo,
			int pageSize, MapSqlParameterSource sqlParam,
			NamedParameterJdbcTemplate jdbcTemplate) {
		pageSize = pageSize <= 0 ? Constants.DEFAULT_PAGE_SIZE : pageSize;// 20
		pageNo = pageNo <= 0 ? 1 : pageNo;// 1
		int startIndex = (pageNo - 1) * pageSize;

		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) jdbcTemplate
				.queryForRowSet(sql, sqlParam);
		return getPageInstance(sqlRowSet, startIndex, pageSize);

	}

	/**
	 * 内部方法,不建议外部调用;返回分页数据 采用滚动指针方式查询
	 * 
	 * @param sqlRowSet
	 *            结果集
	 * @param startIndex
	 *            起始行
	 * @param pageSize
	 *            每页显示记录数
	 * @return 返回分页数据
	 */
	private static Page getPageInstance(ResultSetWrappingSqlRowSet sqlRowSet,
			int startIndex, int pageSize) {
		int count = 0;
		sqlRowSet.last();
		int totalSize = sqlRowSet.getRow();
		if (totalSize < 1) {
			return new Page();
		}
		if (startIndex > totalSize) {
			return new Page(startIndex, totalSize, pageSize, new ArrayList());
		}
		sqlRowSet.first();
		sqlRowSet.relative(startIndex - 1);
		List<Map> list = new ArrayList<Map>();
		while (sqlRowSet.next()) {
			count++;
			list.add(row2Map(sqlRowSet.getResultSet()));
			if (count == pageSize) {
				break;
			}
		}
		return new Page(startIndex, totalSize, pageSize, list);
	}

	/**
	 * 返回xml格式的分页数据
	 * 
	 * @param sql
	 *            查询sql语句
	 * @param pageNo:页号
	 *            <br/>
	 * @param pageSize:每页显示的数目
	 *            <br/>
	 * @param paramMap
	 *            命名参数为key;参数值为value的map
	 * @return
	 */
	public String pagedXmlQuery(String sql, int pageNo, int pageSize,
			String pkcol, String[] cols) {
		return pagedXmlQuery(sql, pageNo, pageSize, null, pkcol, cols);

	}

	/**
	 * 分页查询,返回xml数据
	 * 
	 * @param sql:查询的sql语句
	 *            <br/>
	 * @param pageNo:页号
	 *            <br/>
	 * @param pageSize:每页显示的数目
	 *            <br/>
	 * @param namedParam:命名参数
	 *            <br/>
	 * @param value:参数值
	 *            <br/>
	 * @param mode
	 *            <br/> 1) Contants.COUNT_MODE:采用count(*)查询出总记录数,再分不同数据库查询分页数据<br/>
	 *            2) Contants.SCROLL_MODE:采用滚动指针,断开连接后处理结果集<br/>
	 * @return 分页对象Page
	 */
	public String pagedXmlQuery(String sql, int pageNo, int pageSize,
			String namedParam, Object value, String pkcol, String[] cols) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return pagedXmlQuery(sql, pageNo, pageSize, paramMap, pkcol, cols);
	}

	/**
	 * 分页查询
	 * 
	 * @param sql:select
	 *            t1.a,t2.b,t3.c,d from t1,t2,t3,t4 <br>
	 *            where ... t1.evalue = :evalue and t3.username like :username
	 * @param pageNo:当前页码,从1开始
	 * @param pageSize:本页显示的条数
	 * @param paramMap:命名参数的Map对象,just
	 *            like map.put("evalue","e3");<br>
	 *            map.put("username","e3");<br>
	 * @return xml 格式的StringBuffer
	 */
	public String pagedXmlQuery(String sql, int pageNo, int pageSize,
			Map paramMap, String pkcol, String[] cols) {
		Assert.hasText(sql);
		// 日志打印
		getLogInfo(sql, paramMap);

		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		pageSize = pageSize <= 0 ? Constants.DEFAULT_PAGE_SIZE : pageSize;// 20
		pageNo = pageNo <= 0 ? 1 : pageNo;// 1
		int startIndex = (pageNo - 1) * pageSize;

		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
		return getXmlPage(sqlRowSet, startIndex, pageSize, pkcol, cols);
	}

	/**
	 * 解析结果集,返回一个xml格式的分页数据
	 * 
	 * @param sqlRowSet
	 * @param startIndex
	 * @param pageSize
	 * @return xml格式的分页数据
	 */
	private static String getXmlPage(ResultSetWrappingSqlRowSet sqlRowSet,
			int startIndex, int pageSize, String pkcol, String[] cols) {
		int count = 0;
		// 移动到最后一行
		sqlRowSet.last();
		// 取得结果集最大行
		int totalSize = sqlRowSet.getRow();
		// 总页数
		int totalPage = (totalSize % pageSize == 0) ? totalSize / pageSize
				: (totalSize / pageSize + 1);
		if (totalSize < 1) {
			return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rows></rows>";
		}

		StringBuffer sbuf = new StringBuffer(128);
		sbuf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
		sbuf.append("<rows total_count='").append(totalSize).append(
				"' totalPages='").append(totalPage).append("' ");
		sbuf.append(" pageNo='").append(startIndex / pageSize + 1).append(
				"' pageSize='").append(pageSize).append("' ");
		sbuf.append(" rowStart='").append(startIndex + 1).append("' rowEnd='")
				.append(startIndex + pageSize).append("'>");
		if (startIndex > totalSize) {
			sbuf.append("</rows>");
			return sbuf.toString();
		}
		sqlRowSet.first();
		sqlRowSet.relative(startIndex - 1);
		while (sqlRowSet.next()) {
			count++;
			sbuf.append(row2Xml(sqlRowSet.getResultSet(), pkcol, cols));
			if (count == pageSize) {
				break;
			}
		}
		sbuf.append("</rows>");
		return sbuf.toString();
	}

	/**
	 * 打印相应的日志信息
	 * 
	 * @param sql
	 * @param paramMap:命名参数值对
	 */
	@SuppressWarnings("unchecked")
	private final void getLogInfo(String sql, Map paramMap) {
		try {
			if (logger.isInfoEnabled()) {
				StringBuffer sbuf = new StringBuffer(" JDBC查询的sql语句是:")
						.append(sql);
				if (null == paramMap) {
					sbuf.append(" ; 参数为空!");
				} else {
					sbuf.append("\n 命名参数以及对应的数值:\n");
					Set<String> keys = paramMap.keySet();
					for (String key : keys) {
						sbuf.append("  {").append(key).append("} = ").append(
								paramMap.get(key)).append("\n");
					}
				}
				logger.info(sbuf);
			}
		} catch (Exception ex) {
			logger.error("日志打印出现错误:" + ex.getMessage());
		}
	}

	/**
	 * 
	 */
	public Map queryForMap(String sql, String namedParam, Object value,
			String[] keyColumns, String column) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return this.queryForMap(sql, paramMap, keyColumns, column);
	}

	/**
	 * 
	 */
	public Map queryForMap(String sql, Map paramMap, String[] keyColumns,
			String column) {
		Assert.hasText(sql);
		Assert.notEmpty(keyColumns, "Must set the keyColumn");
		// 日志打印
		getLogInfo(sql, paramMap);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
		return getMapRow(sqlRowSet, keyColumns, column);
	}

	public Map queryForMapMap(String sql, Map paramMap, String[] keyColumns) {
		Assert.hasText(sql);
		Assert.notEmpty(keyColumns, "Must set the keyColumn");
		// 日志打印
		getLogInfo(sql, paramMap);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
		return getMapRow(sqlRowSet, keyColumns);
	}

	public Map queryForMapMap(String sql, String namedParam, Object value,
			String[] keyColumns) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return this.queryForMapMap(sql, paramMap, keyColumns);
	}

	private static Map getMapRow(ResultSetWrappingSqlRowSet sqlRowSet,
			String[] keyColumns) {
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		try {
			sqlRowSet.last();
			int totalSize = sqlRowSet.getRow();
			if (totalSize < 1) {
				return resultMap;
			}
			sqlRowSet.beforeFirst();
			while (sqlRowSet.next()) {
				java.sql.ResultSet rset = sqlRowSet.getResultSet();
				String key = "";
				for (String keyColumn : keyColumns) {
					key += rset.getString(keyColumn);
				}
				resultMap.put(key, row2Map(rset));
			}
			return resultMap;
		} catch (SQLException e) {
			Log.error(JdbcDAOImpl.class, "滚动查询分页数据出现错误:" + e.getMessage());
			return null;
		}
	}

	private static Map getMapRow(ResultSetWrappingSqlRowSet sqlRowSet,
			String[] keyColumns, String column) {
		Map<String, String> resultMap = new HashMap<String, String>();
		try {
			sqlRowSet.last();
			int totalSize = sqlRowSet.getRow();
			if (totalSize < 1) {
				return resultMap;
			}
			sqlRowSet.beforeFirst();
			while (sqlRowSet.next()) {
				java.sql.ResultSet rset = sqlRowSet.getResultSet();
				String key = "";
				for (String keyColumn : keyColumns) {
					key += rset.getString(keyColumn);
				}

				resultMap.put(key, rset.getString(column));
			}
			return resultMap;
		} catch (SQLException e) {
			Log.error(JdbcDAOImpl.class, "滚动查询分页数据出现错误:" + e.getMessage());
			return null;
		}
	}

	public Map queryForMapMap(String sql, Map paramMap, String[] keyColumns,
			boolean isFirst) {
		Assert.hasText(sql);
		Assert.notEmpty(keyColumns, "Must set the keyColumn");
		// 日志打印
		getLogInfo(sql, paramMap);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);

		return getMapRow(sqlRowSet, keyColumns, isFirst);
	}

	public Map queryForMapMap(String sql, String namedParam, Object value,
			String[] keyColumns, boolean isFirst) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		getLogInfo(sql, paramMap);
		return this.queryForMapMap(sql, paramMap, keyColumns);
	}

	private static Map getMapRow(ResultSetWrappingSqlRowSet sqlRowSet,
			String[] keyColumns, boolean isFirst) {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		try {
			sqlRowSet.last();
			int totalSize = sqlRowSet.getRow();
			if (totalSize < 1) {
				return resultMap;
			}
			sqlRowSet.beforeFirst();
			while (sqlRowSet.next()) {
				java.sql.ResultSet rset = sqlRowSet.getResultSet();
				String key = "";
				for (String keyColumn : keyColumns) {
					key += rset.getString(keyColumn);
				}
				if (isFirst) {
					if (resultMap.containsKey(key)) {
						continue;
					} else {
						resultMap.put(key, row2Map(rset));
					}
				} else {
					resultMap.put(key, row2Map(rset));
				}
			}
			return resultMap;
		} catch (SQLException e) {
			Log.error(JdbcDAOImpl.class, "滚动查询分页数据出现错误:" + e.getMessage());
			return null;
		}
	}

	public Map queryForListMap(String sql, Map paramMap, String[] keyColumns) {
		Assert.hasText(sql);
		Assert.notEmpty(keyColumns, "Must set the keyColumn");
		// 日志打印
		getLogInfo(sql, paramMap);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
		return getListMapRow(sqlRowSet, keyColumns);
	}

	public Map queryForListMap(String sql, String namedParam, Object value,
			String[] keyColumns) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForListMap(sql, paramMap, keyColumns);
	}

	private static Map getListMapRow(ResultSetWrappingSqlRowSet sqlRowSet,
			String[] keyColumns) {
		Map<String, List<Map>> resultMap = new HashMap<String, List<Map>>();
		try {
			sqlRowSet.last();
			int totalSize = sqlRowSet.getRow();
			if (totalSize < 1) {
				return resultMap;
			}
			sqlRowSet.beforeFirst();
			while (sqlRowSet.next()) {
				java.sql.ResultSet rset = sqlRowSet.getResultSet();
				String key = "";
				for (String keyColumn : keyColumns) {
					key += rset.getString(keyColumn);
				}
				if (resultMap.containsKey(key)) {
					List<Map> list = resultMap.get(key);
					list.add(row2Map(rset));
				} else {
					List<Map> list = new LinkedList<Map>();
					list.add(row2Map(rset));
					resultMap.put(key, list);
				}
			}
			return resultMap;
		} catch (SQLException e) {
			Log.error(JdbcDAOImpl.class, "滚动查询分页数据出现错误:" + e.getMessage());
			return null;
		}
	}

	public Map queryForMapMap(String sql, Map paramMap, String[] keyColumns1,
			String[] keyColumns2) {
		Assert.hasText(sql);
		Assert.notEmpty(keyColumns1, "Must set the keyColumn1");
		Assert.notEmpty(keyColumns2, "Must set the keyColumn2");
		// 日志打印
		getLogInfo(sql, paramMap);
		MapSqlParameterSource sqlParam = new MapSqlParameterSource(paramMap);
		ResultSetWrappingSqlRowSet sqlRowSet = (ResultSetWrappingSqlRowSet) getNamedParameterJdbcTemplate()
				.queryForRowSet(sql, sqlParam);
		return getMapMapRow(sqlRowSet, keyColumns1, keyColumns2);
	}

	public Map queryForMapMap(String sql, String namedParam, Object value,
			String[] keyColumns1, String[] keyColumns2) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return queryForMapMap(sql, paramMap, keyColumns1, keyColumns2);
	}

	private static Map getMapMapRow(ResultSetWrappingSqlRowSet sqlRowSet,
			String[] keyColumns1, String[] keyColumns2) {
		Map<String, Map<String, Map>> resultMap = new HashMap<String, Map<String, Map>>();
		try {
			sqlRowSet.last();
			int totalSize = sqlRowSet.getRow();
			if (totalSize < 1) {
				return resultMap;
			}
			sqlRowSet.beforeFirst();
			while (sqlRowSet.next()) {
				java.sql.ResultSet set = sqlRowSet.getResultSet();
				String key1 = "";
				for (String keyColumn : keyColumns1) {
					key1 += set.getString(keyColumn);
				}
				String key2 = "";
				for (String keyColumn : keyColumns2) {
					key2 += set.getString(keyColumn);
				}
				if (resultMap.containsKey(key1)) {
					Map<String, Map> map = resultMap.get(key1);
					map.put(key2, row2Map(set));
				} else {
					Map<String, Map> map = new HashMap<String, Map>();
					map.put(key2, row2Map(set));
					resultMap.put(key1, map);
				}
			}
			return resultMap;
		} catch (SQLException e) {
			Log.error(JdbcDAOImpl.class, "滚动查询分页数据出现错误:" + e.getMessage());
			return null;
		}
	}

	/**
	 * 判断是否在其它表中存在关联的记录
	 * 
	 * @param tabArr
	 *            表数组
	 * @param isNotnull
	 *            关联的外键不能为空
	 * @param fieldName
	 *            外键字段名
	 * @return
	 */
	public boolean isExistRelationInOtherTab(String[] tabArr,
			String[] fieldNameArr, String value) {
		if (tabArr != null && fieldNameArr != null && tabArr.length > 0
				&& tabArr.length == fieldNameArr.length) {
			StringBuffer sql = new StringBuffer();
			sql.append("select sum(num) from (");
			for (int i = 0, len = tabArr.length; i < len; i++) {
				if (StringUtil.isNotEmpty(tabArr[i])
						&& StringUtil.isNotEmpty(fieldNameArr[i])) {
					sql.append("( select count(*)as num from ").append(
							tabArr[i]);

					sql.append(" where ").append(fieldNameArr[i]).append(
							" =:tmpValue ");

					sql.append(" )");
					if (i != len - 1) {
						sql.append(" union ");
					}
				}
			}
			sql.append(")tmp");
			int sum = this.queryForInt(sql.toString(), "tmpValue", value);
			if (sum > 0) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	/**
	 * 判断是否在其它表中存在关联的记录
	 * 
	 * @param tabArr
	 *            表数组
	 * @return
	 */
	public boolean isExistRelationInOtherTab(String[] tabArr, String fieldName,
			String value) {
		if (tabArr != null) {
			String[] fieldNameArr = new String[tabArr.length];
			for (int i = 0, len = tabArr.length; i < len; i++) {
				fieldNameArr[i] = fieldName;
			}

			return isExistRelationInOtherTab(tabArr, fieldNameArr, value);
		}
		return false;
	}

	/**
	 * 获取树的下一个编码
	 * 
	 * @param tablename:树形表的名称,如Organization_
	 * @param treecodename:
	 *            树形表的树形编码字段名称,如treecode
	 * @param pkcolname:树形表的主键字段名称,如organizationid
	 * @param parentcolname:上级关联字段ID,如parentOrganizationid
	 * @param parentidvalue:上级节点id的值
	 * @return
	 * @throws Exception
	 */
	public String getNextTreeCode(String tablename, String treecodename,
			String pkcolname, String parentcolname, String parentidvalue) {
		String returnStr = "";
		String maxccode = null;
		String sql = StringUtil.formate("select max({0}) from {1} where {2} ",
				new String[] { treecodename, tablename, parentcolname });
		if (StringUtil.isNotEmpty(parentidvalue)) {
			maxccode = this.queryForString(sql + " =:" + parentcolname,
					parentcolname, parentidvalue);
		} else {
			maxccode = this.queryForString(sql + " is null");
		}

		if (StringUtil.isNotEmpty(maxccode)) {
			String str = maxccode.substring(maxccode.length() - 2, maxccode
					.length());// 取编号的最后两位
			returnStr = maxccode.substring(0, maxccode.length() - 2)
					+ StringUtil.intToStr(StringUtil.toInt(str) + 1, 2);
		} else if (StringUtil.isNotEmpty(parentidvalue)) {
			String selparent = StringUtil.formate(
					"select {0} from {1} where {2} =:{2} ", new String[] {
							treecodename, tablename, pkcolname });
			returnStr = StringUtil.strnull(this.queryForString(selparent,
					pkcolname, parentidvalue))
					+ "01";
		} else {
			returnStr = "01";
		}
		return returnStr;
	}

	/**
	 * 删除节点后调用该函数
	 * 
	 * @param tablename:树形表的名称,如Organization_
	 * @param treecodename:
	 *            树形表的树形编码字段名称,如treecode
	 * @param pkcolname:树形表的主键字段名称,如organizationid
	 * @param parentcolname:上级关联字段ID,如parentOrganizationid
	 * @param treelevelcol:树形级别字段名,如treelevel
	 * @param parentidvalue:上级节点id的值
	 * @param treecode:
	 *            树形编码值
	 * @param treelevelval:
	 *            树形级别值
	 */
	public void updateTreecode(String tablename, String treecodename,
			String pkcolname, String parentcolname, String treelevelcol,
			String parentidvalue, String treecode, Integer treelevelval) {
		String parentcode = "";
		int seq = 0;
		if (StringUtil.isNotEmpty(parentidvalue)) {
			String sql = StringUtil.formate(
					"select {0} from {1} where {2} =:{2} ", new String[] {
							treecodename, tablename, pkcolname });
			parentcode = StringUtil.strnull(this.queryForString(sql, pkcolname,
					parentidvalue));
			// {0}tablename,{1}level,{2},parent,{3}treecode
			String sqlformate = "select count(*) from {0} where {1} =:{1} and {2} = :{2} and {3} < :{3}";

			String sql2 = StringUtil.formate(sqlformate, new String[] {
					tablename, treelevelcol, parentcolname, treecodename });
			Map paramMap = new HashMap();
			paramMap.put(treelevelcol, treelevelval);
			paramMap.put(parentcolname, parentidvalue);
			paramMap.put(treecodename, treecode);
			seq = this.queryForInt(sql2, paramMap);
		} else {
			String sqlformate = "select count(*) from {0} where {1} =:{1} and {2} is null and {3} < :{3}";

			String sql2 = StringUtil.formate(sqlformate, new String[] {
					tablename, treelevelcol, parentcolname, treecodename });
			Map paramMap = new HashMap();
			paramMap.put(treelevelcol, treelevelval);
			paramMap.put(treecodename, treecode);
			seq = this.queryForInt(sql2, paramMap);
		}
		// select nid,csyscode,nlevelno from ca_company where nlevelno
		// =:nLevelno and csyscode > :csyscode and csyscode like :likecsyscode
		// order by csyscode
		String sql = "select {0} as pkcol,{1} as treecode,{2} as treelevel from {3} where {2} =:{2} and {1} > :{1} and {1} like :liketreecode order by {1}";

		String sql2 = StringUtil.formate(sql, new String[] { pkcolname,
				treecodename, treelevelcol, tablename });

		Map paramMap = new HashMap();
		paramMap.put(treelevelcol, treelevelval);
		paramMap.put(treecodename, treecode);
		paramMap.put("liketreecode", parentcode + "%");

		List ls = this.selectMapList(sql2, paramMap);
		if (ls != null && ls.size() > 0) {
			// "update ca_company set csyscode = :csyscode where nid = :nid";
			String updatecode = StringUtil.formate(
					"update {0} set {1} = :{1} where {2} = :{2}", new String[] {
							tablename, treecodename, pkcolname });

			for (int i = 0, len = ls.size(); i < len; i++) {
				Map tmp = (Map) ls.get(i);
				seq = seq + 1;
				String csyscodenew = parentcode.concat(StringUtil
						.appendZeroBefore(2, "" + seq));
				String csyscodeold = StringUtil.strnull(tmp.get("treecode"));
				String nlevelno = StringUtil.strnull(tmp.get("treelevel"));
				Map param = new HashMap();
				param.put(treecodename, csyscodenew);
				param.put(pkcolname, StringUtil.strnull(tmp.get("pkcol")));
				this.update(updatecode, param);
				this
						.updateCode(tablename, treecodename, treelevelcol,
								csyscodenew, csyscodeold, StringUtil
										.toInt(nlevelno), 0);
			}
		}
	}

	/**
	 * 更新下级子节点 所有编号,适用于拖放到不同级别
	 * 
	 * @param tablename:树形表的名称,如Organization_
	 * @param treecodename:
	 *            树形表的树形编码字段名称,如treecode
	 * @param treelevelcol:树形级别字段名,如treelevel
	 * @param asClassCodeNew
	 *            ---修改后节点classcode
	 * @param asClassCodeOld
	 *            ---原有的classcode
	 * @param anClasslevel
	 *            ---节点的当前级别
	 * @param anClasslevelDiff---节点前后的级别差
	 */
	public void updateCode(String tablename, String treecodename,
			String treelevelcol, String asClassCodeNew, String csyscodeold,
			int anClasslevel, int anClasslevelDiff) {
		int li_pos = (anClasslevel * 2) + 1;

		StringBuffer sqlformate = new StringBuffer(64);
		sqlformate.append(" update {0} set {1} = ");
		// 格式化字符串,需要对已有的字符特殊处理时,需要用俩单引号括起来 ''特殊字符''
		sqlformate.append(SqlUtil.linkColumn("''" + asClassCodeNew + "''",
				SqlUtil.substr("{1}", li_pos)));
		sqlformate.append(", {2} = {2} + ").append(anClasslevelDiff);
		sqlformate
				.append("  where {1} like :likecsyscode and {1} <> :csyscodeold");

		String updatesql = St
      
分享到:
评论
2 楼 laijavatoo 2012-04-19  
楼主可以将其他的文件共享下吗?谢谢
1 楼 zzl99mail 2009-12-21  
不完整啊,其他的类呢,能上传源文件吗

相关推荐

    SpringJdbcTemplate封装工具类

    "更新记录.docx"文件可能是项目开发过程中对SpringJdbcTemplate封装工具类的修改日志,记录了每次更新的功能改进、bug修复或性能优化等内容,这对于版本管理和问题排查非常有帮助。 通过上述分析,我们可以看到...

    jdbcTemplate封装工程需要的jar包

    这个`jdbcTemplate封装工程需要的jar包`显然包含了执行SQL查询、更新、存储过程等任务所需的核心库。以下是对这个主题的详细阐述: 1. **Spring JDBC模块**:`JdbcTemplate`位于Spring的JDBC模块中,它简化了数据库...

    lucene+jdbcTemplate封装API+缓存实现索引精确刷新

    总的来说,"lucene+jdbcTemplate封装API+缓存实现索引精确刷新"这个项目展示了如何结合多种技术来优化数据检索流程,提高了系统的响应速度和数据一致性。这样的实践对于处理大数据量的系统尤为有价值,同时也展现了...

    JDBCtemplate封装类的jar包.zip

    ​ JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC...

    Spring jdbctemplate + mysql 分页封装

    本文将深入探讨如何利用Spring的JdbcTemplate进行MySQL数据库的分页查询,并对其进行封装,提高代码的复用性和可维护性。 首先,了解Spring JdbcTemplate的基本用法。JdbcTemplate是Spring提供的一个模板类,用于...

    java基于jdbctemplate数据持久层操作封装

    - "基于jdbctemplate封装"可能包含一个或多个类文件,如BaseJdbcDao.java,它定义了通用的方法,以及针对特定业务的子DAO类,如UserDao.java,实现了用户相关的数据库操作。 7. **使用示例**: - 创建一个新的...

    spring jdbctemplate 封裝

    import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet; import org.springframework.jdbc.support.rowset.SqlRowSet; import org....

    JdbcTemplate,自己封装的jdbc小框架

    自封装的JdbcTemplate框架的核心目标是实现CRUD(Create, Read, Update, Delete)操作的便捷化,同时支持批量处理,以提高开发效率。设计模式在这里起到了关键作用,通过面向对象的设计,将数据库操作的复杂性封装在...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    2、基于spring jdbc的上层封装,底层jdbc操作基于JdbcTemplate,对于使用spring jdbc的人会有一点价值,比较简洁的封装可以节省很多重复劳动,具体节省多少可以看看example; 3、实现一套简单的ORM(直接使用...

    打印JdbcTemplate执行sql

    `JdbcTemplate`是Spring对JDBC的轻量级封装,它消除了手动管理连接、事务和结果集的繁琐过程,提高了代码的可读性和可维护性。通过使用模板方法设计模式,`JdbcTemplate`提供了一系列静态和非静态的方法来执行各种...

    spring-jdbcTemplate实例工程

    Spring JDBC Template是Spring框架中用于简化JDBC操作的一个核心组件,它是Spring对JDBC API的封装,旨在提供一个更加简洁、健壮且可测试的数据库访问层。在这个实例工程中,我们将深入探讨Spring JdbcTemplate的...

    Spring--JdbcTemplate.pdf

    标题中提到的"JdbcTemplate"是Spring框架中提供的一个用于简化数据库操作的JDBC抽象库。它是对Java标准数据库编程接口JDBC的一种封装,旨在简化JDBC编程,减少样板代码,使得开发者在使用Spring框架时能够更便捷地对...

    jdbcTemplate分页彻底解决,使用游标滚动

    它可能包含了一个或多个方法,用于封装上述步骤,使代码更加简洁易用。 在实际应用中,我们可能还需要考虑并发和性能优化,例如,如果多个线程同时访问,可能需要使用连接池来管理数据库连接,以提高效率并避免资源...

    Spring技术内幕 学习笔记

    4. **JdbcTemplate封装Jdbc**: - JdbcTemplate是Spring提供的一个数据库访问工具,它简化了JDBC的使用,减少了代码中的错误。这部分内容将介绍如何使用JdbcTemplate进行数据库操作,包括查询、插入、更新和删除,...

    JdbcTemplate教程

    JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。 除了大量...

    jdbcTemplate

    项目经理编写的这个`JDBCTemplate`框架,可能是基于Spring的`JdbcTemplate`进行了二次开发或者封装,以适应项目的特定需求。 `JdbcTemplate`的主要功能包括: 1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句...

    Spring JdbcTemplate 常用方法整理

    `JdbcUtils.java`可能是提供了一些数据库连接和JdbcTemplate使用的辅助方法,如数据库连接池的配置,或者封装了JdbcTemplate的执行方法,以提高代码复用性。例如: ```java public class JdbcUtils { private ...

    spring jdbcTemplate 源码

    此外,JdbcTemplate对JDBC的异常进行了封装,统一转换为Spring的DataAccessException,提供了更友好的异常处理机制。这使得错误信息更容易理解和处理,也保持了代码的一致性。 总结来说,Spring JDBCTemplate通过...

    JdbcTemplate示例

    这个模板类封装了大部分与JDBC相关的低级细节,使开发者能够更专注于业务逻辑,而不是数据访问代码。 ### 创建(Create) 创建新记录通常涉及插入操作。使用`JdbcTemplate`,你可以通过调用`update()`方法来执行...

    jdbcTemplate相关jar包.zip

    它是Spring框架的一个数据访问抽象层,它封装了JDBC(Java Database Connectivity)API,提供了更加简单易用的接口和方法。通过使用JdbcTemplate,开发者可以避免编写大量重复的代码,如打开和关闭连接、处理结果集...

Global site tag (gtag.js) - Google Analytics