发此贴是请大家互相探讨,交流,无聊人事请提前走远。
从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的limit实现分页查询。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
总结来说,"jdbc通用数据库连接"是指通过Java的JDBC API,封装了数据库操作的类或方法,使得在不同项目中可以方便快捷地进行数据库交互。这种封装涵盖了数据库连接的全过程,包括连接建立、SQL执行、结果处理以及...
综上所述,`jdbc通用类`是Java数据库编程中常用的设计模式,它通过统一的接口封装了数据库连接、SQL执行、结果集处理等操作,降低了代码复杂度,提高了代码的可维护性和复用性。理解和掌握这些知识点对于提升Java...
本示例"JDBC查询代码以Student实体类.zip"提供了一个简单的JDBC查询应用,涉及到的关键知识点包括: 1. **JDBC驱动注册**:在Java程序中,我们需要通过`Class.forName()`方法加载并注册JDBC驱动。例如,对于MySQL,...
本资源是对JDBC的封装,方便在项目中使用,其中BaseDao.java是对JDBC操作的封装,使用时让自己的Dao类继承即可,然后调用其中的executeQuery和executeOthe分别执行DQL和DML操作。dbinfo.properties属性文件存储基本...
自己写的一个JDBC通用DAO 有几点需要注意: 1.数据库命明目前只支持没下血杠命名(_) 2.表ID字段名取名有2种方式 (1)ID (2)TableName + ID 例如:user表 则取名为 id 或者 userid 因为没有用xml来映射表结构确定哪一个...
本文将深入探讨如何通过封装JDBC来提高数据库操作的效率,特别是使用Map数据结构实现快速的增删改操作。我们将以`BaseDao`类为例,位于项目的`util`包下。 首先,理解JDBC的基础知识是必要的。JDBC提供了一组接口和...
在Java编程领域,自定义JDBC(Java Database Connectivity)通用类是提高数据库操作效率和代码复用性的重要手段。通过创建这样一个类,开发者可以封装常见的数据库连接、查询、执行SQL语句等操作,使得数据库访问...
本资源主要围绕"JDBC通用增删改查方法"展开,旨在提供一套简单、易用且具有广泛适用性的数据库操作方案。 首先,我们来了解一下JDBC的基本工作流程: 1. 加载驱动:使用`Class.forName()`方法加载数据库驱动,这...
总的来说,神通通用数据库通过JDBC驱动为Java开发者提供了一种方便的接口来操作数据库。正确配置“driver-class-name”和数据库URL是成功连接的关键。而提供的手册和驱动文件则为学习和实践提供了有力的支持。深入...
这是十分十分好用的达梦6jdbc通用驱动,欢迎大家下载啊
**JAVA—JDBC数据库查询小程序** 本程序是一个基于JAVA实现的JDBC数据库操作小程序,它提供了全面的数据库交互功能,包括增(Insert)、删(Delete)、改(Update)和查(Select)。此外,还增加了模糊查询等高级...
在Java编程领域,JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。"jdbc通用连接操作类"是开发者为了简化数据库操作,...
总结来说,“查询系统JDBC+Struts2”是一个使用Java技术实现的Web应用,通过JDBC连接和操作数据库,使用Struts2框架处理用户请求和控制流程,提供分栏展示的查询功能。开发过程中,开发者需要关注数据库设计、JDBC...
通用的jdbc增删改查,仅仅只是两个通用的方法,利用反射和泛型
本篇将详细讲解如何使用JDBC对数据库进行查询。 首先,我们需要理解JDBC的基本工作流程,这通常包括以下步骤: 1. 加载驱动:在Java程序中,我们使用`Class.forName()`方法加载数据库驱动。例如,对于MySQL,我们...
本文将深入探讨如何使用JDBC实现动态查询和分页查询的结合,这对于开发人员来说是一项基础但至关重要的技能。 首先,我们要了解JDBC的基础知识。JDBC是一个Java API,它提供了一系列的接口和类,使得Java程序员能够...
JDBC分页与数据连接通用类 望指教!有问题请指出!
简单易用的数据库封装操作,包含数据库连接池的基本实现,数据库连接可重用,所有的操作都脱离源生JDBC操作,开发人员只需要熟悉Java集合的用法,会写Sql即可轻松的使用该封装好的JDBC API写出合理的代码。...