`
richer
  • 浏览: 2010 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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 Short) {
			pStatement.setShort(piIndex, ((Short) pValueObject).shortValue());
		} else if (pValueObject instanceof Integer) {
			pStatement.setInt(piIndex, ((Integer) pValueObject).intValue());
		} else if (pValueObject instanceof Long) {
			pStatement.setLong(piIndex, ((Long) pValueObject).longValue());
		} else if (pValueObject instanceof Float) {
			pStatement.setFloat(piIndex, ((Float) pValueObject).floatValue());
		} else if (pValueObject instanceof Double) {
			pStatement.setDouble(piIndex, ((Double) pValueObject).doubleValue());
		} else if (pValueObject instanceof BigDecimal) {
			pStatement.setBigDecimal(piIndex, (BigDecimal) pValueObject);
		} else if (pValueObject instanceof Date) {
			pStatement.setDate(piIndex, (Date) pValueObject);
		} else if (pValueObject instanceof Time) {
			pStatement.setTime(piIndex, (Time) pValueObject);
		} else if (pValueObject instanceof Timestamp) {
			pStatement.setTimestamp(piIndex, (Timestamp) pValueObject);
		} else {
			pStatement.setObject(piIndex, pValueObject);
		}
	}

	/**
	 * 根据传入的结果集返回结果集的元数据,以列名为键以列类型为值的map对象
	 * @param rs
	 * @return 
	 * @throws SQLException
	 */
	private Map<String,Integer> getMetaData(ResultSet rs) throws SQLException{
		Map<String,Integer> map = new HashMap<String,Integer>();
		ResultSetMetaData metaData = rs.getMetaData();
        int numberOfColumns =  metaData.getColumnCount();
        for(int column = 0; column < numberOfColumns; column++) {
        	String columnName = metaData.getColumnLabel(column+1);
        	int colunmType = metaData.getColumnType(column+1);
        	columnName = columnName.toLowerCase();
            map.put(columnName, colunmType);
        }
        return map;
	}
	
	/**
	 * 将结果集封装为以列名存储的map对象
	 * @param rs
	 * @param metaDataMap元数据集合
	 * @return
	 * @throws Exception
	 */
	private Map<String,Object> setData(ResultSet rs,Map<String,Integer> metaDataMap) throws Exception {
		Map<String,Object> map = new HashMap<String,Object>();
		for (String columnName : metaDataMap.keySet()) {
			int columnType = metaDataMap.get(columnName);
			Object object = rs.getObject(columnName);
			if(object==null){
				map.put(columnName, null);
				continue;
			}
			//以下并为对所有的数据类型做处理,未特殊处理的数据类型将以object的形式存储。
			switch (columnType) {
			case java.sql.Types.VARCHAR:
				map.put(columnName, object);
				break;
			case java.sql.Types.DATE:
				map.put(columnName, DateUtil.format(object.toString()));
				break;
			case java.sql.Types.TIMESTAMP:
				map.put(columnName, DateUtil.format(object.toString()));
				break;
			case java.sql.Types.TIME:
				map.put(columnName, DateUtil.format(object.toString()));
				break;
			case java.sql.Types.CLOB:
				try{
					if(object!=null){
						Clob clob = (Clob)object;
						long length = clob.length();
						map.put(columnName, clob.getSubString(1L, (int)length));
					}
				}catch(Exception e){
					LogUtil.error(this.getClass(), e,"将字段值从clob转换为字符串时出错@!");
				}
				break;
			case java.sql.Types.BLOB:
				map.put(columnName, "");
				break;
			default:
				map.put(columnName, object);
				break;
			}
		}
        return map;
	}
}
 
分享到:
评论

相关推荐

    JDBC分页查询(MySQL的)

    jdbc分页查询,利用mysql的limit实现分页查询。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    jdbc通用数据库连接

    总结来说,"jdbc通用数据库连接"是指通过Java的JDBC API,封装了数据库操作的类或方法,使得在不同项目中可以方便快捷地进行数据库交互。这种封装涵盖了数据库连接的全过程,包括连接建立、SQL执行、结果处理以及...

    jdbc通用类

    综上所述,`jdbc通用类`是Java数据库编程中常用的设计模式,它通过统一的接口封装了数据库连接、SQL执行、结果集处理等操作,降低了代码复杂度,提高了代码的可维护性和复用性。理解和掌握这些知识点对于提升Java...

    JDBC查询代码以Student实体类.zip

    本示例"JDBC查询代码以Student实体类.zip"提供了一个简单的JDBC查询应用,涉及到的关键知识点包括: 1. **JDBC驱动注册**:在Java程序中,我们需要通过`Class.forName()`方法加载并注册JDBC驱动。例如,对于MySQL,...

    JDBC通用封装类

    本资源是对JDBC的封装,方便在项目中使用,其中BaseDao.java是对JDBC操作的封装,使用时让自己的Dao类继承即可,然后调用其中的executeQuery和executeOthe分别执行DQL和DML操作。dbinfo.properties属性文件存储基本...

    JDBC通用DAO CRUD(不是Hibernate)

    自己写的一个JDBC通用DAO 有几点需要注意: 1.数据库命明目前只支持没下血杠命名(_) 2.表ID字段名取名有2种方式 (1)ID (2)TableName + ID 例如:user表 则取名为 id 或者 userid 因为没有用xml来映射表结构确定哪一个...

    封装jdbc,采用Map方式快速增删改数据库例子

    本文将深入探讨如何通过封装JDBC来提高数据库操作的效率,特别是使用Map数据结构实现快速的增删改操作。我们将以`BaseDao`类为例,位于项目的`util`包下。 首先,理解JDBC的基础知识是必要的。JDBC提供了一组接口和...

    自定义jdbc通用类

    在Java编程领域,自定义JDBC(Java Database Connectivity)通用类是提高数据库操作效率和代码复用性的重要手段。通过创建这样一个类,开发者可以封装常见的数据库连接、查询、执行SQL语句等操作,使得数据库访问...

    JDBC通用增删改查方法

    本资源主要围绕"JDBC通用增删改查方法"展开,旨在提供一套简单、易用且具有广泛适用性的数据库操作方案。 首先,我们来了解一下JDBC的基本工作流程: 1. 加载驱动:使用`Class.forName()`方法加载数据库驱动,这...

    神州通用数据库JDBC驱动和手册

    总的来说,神通通用数据库通过JDBC驱动为Java开发者提供了一种方便的接口来操作数据库。正确配置“driver-class-name”和数据库URL是成功连接的关键。而提供的手册和驱动文件则为学习和实践提供了有力的支持。深入...

    达梦6jdbc通用驱动

    这是十分十分好用的达梦6jdbc通用驱动,欢迎大家下载啊

    JAVA—JDBC数据库查询小程序

    **JAVA—JDBC数据库查询小程序** 本程序是一个基于JAVA实现的JDBC数据库操作小程序,它提供了全面的数据库交互功能,包括增(Insert)、删(Delete)、改(Update)和查(Select)。此外,还增加了模糊查询等高级...

    jdbc通用连接操作类

    在Java编程领域,JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。"jdbc通用连接操作类"是开发者为了简化数据库操作,...

    查询系统JDBC+struts2

    总结来说,“查询系统JDBC+Struts2”是一个使用Java技术实现的Web应用,通过JDBC连接和操作数据库,使用Struts2框架处理用户请求和控制流程,提供分栏展示的查询功能。开发过程中,开发者需要关注数据库设计、JDBC...

    通用的jdbc增删改查

    通用的jdbc增删改查,仅仅只是两个通用的方法,利用反射和泛型

    java 通过JDBC对数据库进行查询

    本篇将详细讲解如何使用JDBC对数据库进行查询。 首先,我们需要理解JDBC的基本工作流程,这通常包括以下步骤: 1. 加载驱动:在Java程序中,我们使用`Class.forName()`方法加载数据库驱动。例如,对于MySQL,我们...

    jdbc实现动态查询与分页查询的结合

    本文将深入探讨如何使用JDBC实现动态查询和分页查询的结合,这对于开发人员来说是一项基础但至关重要的技能。 首先,我们要了解JDBC的基础知识。JDBC是一个Java API,它提供了一系列的接口和类,使得Java程序员能够...

    JDBC分页与数据连接通用类.ppt

    JDBC分页与数据连接通用类 望指教!有问题请指出!

    通用JDBC基本操作封装源代码

    简单易用的数据库封装操作,包含数据库连接池的基本实现,数据库连接可重用,所有的操作都脱离源生JDBC操作,开发人员只需要熟悉Java集合的用法,会写Sql即可轻松的使用该封装好的JDBC API写出合理的代码。...

Global site tag (gtag.js) - Google Analytics