日期:2014-05-16  浏览次数:20470 次

jdbc通用查询通过map替代实体

发此贴是请大家互相探讨,交流,无聊人事请提前走远。

?

从10年做一个项目时,由于项目中需要做大量的查询功能,所以觉得如果使用传统的方式去做查询的话,就需要构建很多实体,比较繁琐,而且我们项目的特征是只需要做查询,不需要做新增,修改等操作,所以对此我写了一个公共类来处理此问题。

传统方式:传入sql,返回结果集,然后便利结果集封装实体List。

我的方式:传入sql,返回List。List中装的是map,而map中的key对应sql中的列,map中的value对应列的值。

备注:由于部分代码牵扯到公司的一些公共包,所以代码不能直接运行,请大家下载代码后做相应的改动,请谅解。如需我提供可直接运行的实例,请回复此贴联系我。

代码有问题的请批评指正。

?

主要代码:

import java.math.BigDecimal;
import java.sql.Clob;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @描述:利用jdbc进行常见的查询
 * @author richersky
 * @日期:2010-06-27
 */
public class EntityDaoImplJdbc {
	
	private String datasourse;
	
	/**
	 * 根据sql语句查询数据
	 * @param sql
	 * @param page
	 * @return
	 * @throws Exception
	 */
	public Page findSql(String sql, Page page) throws Exception{
		JdbcUtil jdbcUtil = null;
		try {
			StringBuffer ssql = new StringBuffer();
			ssql.append(sql);
			//获取条件对应的值集合
			List valueList = page.getValues();
			LogUtil.infoSql(EntityDaoImplJdbc.class,valueList,"SQL语句:",ssql.toString());
			jdbcUtil = new JdbcUtil(datasourse);
			PreparedStatement preparedStatement = jdbcUtil.createPreparedStatement(ssql.toString());
			int liSQLParamIndex = 1;
			if(valueList!=null){
				for(int i=0;i<valueList.size();i++){
					Object obj = valueList.get(i);
					this.setParameterValue(preparedStatement, i+1, obj);
					liSQLParamIndex++;
				}
			}
			
			ResultSet rs = preparedStatement.executeQuery();
			List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>();
			Map<String,Integer> metaDataMap = null;
			while(rs.next()){
				if(rs.isFirst()){
					metaDataMap = this.getMetaData(rs);
				}
				dataList.add(this.setData(rs,metaDataMap));
			}
			page.setDataList(dataList);
		}catch (Exception e) {
			LogUtil.error(this.getClass(), e,"利用jdbc进行查询时出错!");
			throw e;
		}finally{
			if(jdbcUtil!=null){
				jdbcUtil.freeCon();
			}
		}
		return page;
	}
	
	/**
	 * 根据sql查询出单条记录
	 * @param sql
	 * @return Map<String,Object>
	 * @throws Exception 
	 */
	public Map<String,Object> findUniqueBySql(String sql,List<Object> valueList) throws Exception{
		JdbcUtil jdbcUtil = null;
		Map<String,Object> map = null;
		try {
			LogUtil.infoSql(EntityDaoImplJdbc.class,valueList,"SQL语句:",sql);
			jdbcUtil = new JdbcUtil(datasourse);
			PreparedStatement preparedStatement= jdbcUtil.createPreparedStatement(sql);
			if(valueList!=null){
				for(int i=0;i<valueList.size();i++){
					Object obj = valueList.get(i);
					this.setParameterValue(preparedStatement, i+1, obj);
				}
			}
			ResultSet rs = preparedStatement.executeQuery();
			Map<String,Integer> metaDataMap = null;
			if(rs.next()){
				metaDataMap = this.getMetaData(rs);
				map = this.setData(rs,metaDataMap);
			}
		}catch (Exception e) {
			LogUtil.error(this.getClass(), e,"利用jdbc进行查询时出错!");
			throw e;
		}finally{
			if(jdbcUtil!=null){
				jdbcUtil.freeCon();
			}
		}
		return map;
	}
	
	/**
	 * 设置PreparedStatement预处理sql语句的值
	 * @param pStatement
	 * @param piIndex
	 * @param pValueObject
	 * @throws Exception
	 */
	private void setParameterValue(PreparedStatement pStatement, int piIndex,Object pValueObject) throws Exception {
		if (pValueObject instanceof String) {
			pStatement.setString(piIndex, (String) pValueObject);
		} else if (pValueObject instanceof Boolean) {
			pStatement.setBoolean(piIndex, ((Boolean) pValueObject).booleanValue());
		} else if (pValueObject instanceof Byte) {
			pStatement.setByte(piIndex, ((Byte) pValueObject).byteValue());
		} else if (pValueObject instanceof