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