日期:2014-05-16 浏览次数:20545 次
发此贴是请大家互相探讨,交流,无聊人事请提前走远。
?
从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