`

通用数据库分页 扩展dbutil (附代码下载)

阅读更多

需求:最近接触一个项目需要其兼容主流的数据库。

 

我用到的包:common-dbutils.jar;log4j;c3p0所需要的包还有什么忘了,大概就这2个

 

看了下dbutil之前会hibernate,学完hibernate觉得其有点庞大,用来做通用插件不方便。之前看了dbutil源码总结下,发表出来。大家看了后给点改进方案。

 

 

问题一:Oracle、mysql、mssql数据库大字段如何做到通用,提高我们程序的兼容性?

 

问题二:Oracle、mysql、mssql如何统一分页功能,提高我们程序的兼容性?

 

 

我的解决思路是:

 

问题一:对于各家不同的字段统一均用String来代替,让我们的程序中没有乱七八遭的数据类型,像苍蝇一样在你身边乱飞(哦对不起不是一只……)。

问题二:老实说要想做到统一的分页方法,我觉得在sql不确定的情况下很难。这个问题hibernate也是这样想的。hibernate是配置参数,来判断你是使用的什么数据库

从而根据xml配置文件中的你的数据表结构的描述,来分别套用写好的分页方法。对于这点hibernate值得我膜拜。

 

 

我的代码处理思路:

在网上找了许多插件,最终觉定改造dbutil,因为其轻量级,让我喜欢得非常。

 

 

1、过滤乱七八遭的数据类型(目前我只知道clob类型不好处理,首先将其结果查询出来转换为String,其它的类型你自己扩展)

 WebSite/src/org/apache/commons/dbutils/JDBCPaginRunner.java

 

 

 2、对于分页的问题,我目前只写了针对jdbc中的指针分页功能。其实各家数据库老板都提供了相当不错的接口。比如oracle、mysql这些都是比较不错的,受咱们程序员的喜爱、但是使用方法不同,给我们带来了不便,导致代码不能很好的移植。

于是我只有通过JDBC的指针来实现分页了。当然,你也可以自己写基于其它数据库的扩展的分页插件。只需要替换以下程序就行。还是来看看我写的基于指针的分页

 

   局限性:

             1、sql中使用的聚合函数比较难处理。

     2、sql中的查询语法 要除掉数据库厂家的分页语句(如果你不把它去除,那该怎么移植到其它数据库上呢?又如何做到程序能够适应主流数据库呢?)

/WebSite/src/org/apache/commons/dbutils/NoClobRowProcessor.java

 

 

3、使用篇

   提供2个方法便捷开发:一个是我在网上借鉴了一个网友的方法,稍作修改(使用基于c3p0来开发)

   使用的时候有2种方法:

           1、普通查询:(细分传值与传sql)

/WebSite/src/org/apache/commons/dbutils/DbUtils.java

 

           2、分页查询:(细分为需要返回总数与不需要返回总数的情况,封装结果为bean或者封装Map与List,Object,Array等均支持。)

 

/WebSite/src/org/apache/commons/dbutils/pagin/Page.java

/WebSite/src/org/apache/commons/dbutils/pagin/PagingUtil.java

 

package db;

import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.pagin.Page;
import org.apache.commons.dbutils.pagin.PagingUtil;

import baidu.UP_INFO;
/*我封装的数据库
create table INFO_LINK( 
resource_id   VARCHAR2(50) not null,
info_title VARCHAR2(50),default '0'
)
*/

public class TestApp {
	public static void main(String[] args) {
		String sql="select * from up_info";
		String sql2="select * from up_info where resource_id=? or info_title=?";//分页时不能用特殊的分页语法(Oracle、Mssql)
		Object[] objects=new Object[]{"59","abc"};//参数
		try{
			/*
			 * 普通查询--------返回map
			 */
			//不带参数查询
			List<Map<String, Object>> listMap=new DbUtils().queryToArrayList(sql);
			//带参数查询
			listMap=new DbUtils().queryToMapList(sql2,objects);

			/*
			 * 普通查询--------返回bean
			 */
			//带参数
			List<UP_INFO> listBean=new DbUtils().queryToBeanList(UP_INFO.class,sql2,objects);
			//不带参数
			listBean=new DbUtils().queryToBeanList(UP_INFO.class,sql);

			//######### 展示分页功能  #########(第一页:0至5)
			/*
			 * 不带返回值分页
			 */
			//不返回总记录分页-返回List of map
			listMap=new DbUtils().queryToMapList(sql2,objects,0,5);
			//不返回总记录分页-返回List of bean
			listBean=new DbUtils().queryToBeanList(UP_INFO.class,sql2,objects,0,5);
			
			/*
			 * 带返回值分页
			 */
			//带参数不带返回值
			Page<Map<String,Object>> page=PagingUtil.toMapList(true,sql2, objects,0,5);
			System.out.println("总记录:"+page.getRowCount()+"\t内容:"+page.getList());
			
			//不带参数分页
			page=PagingUtil.toMapList(true,sql,null,0,5);
			System.out.println("总记录:"+page.getRowCount()+"\t内容:"+page.getList());
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 
 

 

  • org.zip (14.8 KB)
  • 下载次数: 209
分享到:
评论
2 楼 qingmuxiang 2016-03-02  
学无止境 
1 楼 haiyangyiba 2012-02-13  
你好,下载了你的例子,主要看了如下方法:
public <T> T limit(boolean getMaxRow,Connection conn, String sql,Object[]params,ResultSetHandler<T> rsh,int...limit)throws  Exception{
int start=0;
int end=1;
if(limit!=null){
if(limit.length==1){
start=0;
end=limit[0]<0?0:limit[0];
}else{
start=limit[0];
end=limit[1]<0?0:limit[1];
}
}
start=start<0?0:start;
PreparedStatement stmt = null;
        ResultSet rs = null;
        T result = null;
        try {
        if(getMaxRow){
        getCount(conn, sql, params);
        }
            stmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
            this.fillStatement(stmt, params);
            stmt.setMaxRows(end);
            rs = this.wrap(stmt.executeQuery());
            if(rs.next()){
            rs.absolute(start);
            result = rsh.handle(rs);
            }
        } catch (SQLException e) {
        e.printStackTrace();
            this.rethrow(e, sql, params);
        } finally {
            try {
                close(rs);
            } finally {
                close(stmt);
            }
        }

        return result;
}

我个人认为,这种查询是一次性加载所有的数据到内存,然后再从内存中游标定位,最后获取maxRows记录,maxRows为pageSize了,是不是一次性加载到内存呢?

相关推荐

    数据库操作的DBUtil包,SQL2005驱动包,ASCII编码字符集

    在IT行业中,数据库操作是核心任务之一,而DBUtil包作为一种通用的数据库操作工具,能够极大地简化编程工作。本文将详细解析DBUtil包的使用、SQL Server 2005驱动包的功能,以及ASCII编码字符集的相关知识。 首先,...

    DBUtil(ASP。NET数据库连接工具类)

    DBUtil 是一个在ASP.NET开发环境中常用的数据库连接工具类,它的设计目的是为了简化数据库操作,减少程序员编写重复的连接和断开数据库的代码,从而提高开发效率和代码的可维护性。通过使用DBUtil,开发者可以快速地...

    数据库通用操作类源码

    数据库通用操作类源码是软件开发中常见的工具,主要用于简化对数据库的访问,提高代码的复用性和可维护性。在.NET框架下,C#语言提供了丰富的库来支持数据库交互,如ADO.NET、Entity Framework等。本文将深入探讨C#...

    通用数据库操作。支持Sql Server_Oracle_MySQL_Sqlite

    DBUtil可能是一个包含以上功能的实用工具类或库,它封装了针对这四种数据库的常见操作,简化了开发者的工作,提高了代码的复用性。使用这样的工具可以大大减少开发和维护跨平台数据库应用的复杂度。通过合理利用...

    DButil 封装 包括模糊查询 分页Count 普通增删改查方法

    DButil 是一个数据库操作工具类,它封装了常见的SQL操作,如模糊查询、分页查询、数据的增删改查等。这样的工具类在实际开发中非常常见,它简化了数据库交互的代码,提高了开发效率。下面将详细介绍DButil封装中的...

    Oracle JDBC DbUtil jdbc数据库连接

    Oracle JDBC DbUtil 是一个用于简化Java应用程序与Oracle数据库交互的工具包。这个工具包通过提供便利的类和方法,使得开发者能够更高效地执行SQL语句、管理数据库连接以及处理结果集。在给定的文件中,我们可以看到...

    DBUtil工具类jar包

    在提供的压缩包文件"DBUtil"中,可能包含了DBUtil工具类的源代码、相关的配置文件(如数据库连接配置)以及使用示例。学习这个jar包,可以深入了解其内部实现原理,如何集成到自己的项目中,以及如何自定义配置以...

    C# 数据库操作封装类

    首先,"COleDbOperate.cs"文件可能包含一个通用的数据库操作类,它使用ADO.NET中的System.Data.OleDb命名空间,支持多种类型的数据库,如Microsoft Access、Excel等。此类通常会提供一些基础方法,如连接数据库、...

    Laravel开发-dbutil

    在Laravel框架中,`dbutil`通常指的是数据库操作的实用工具或自定义库,它扩展了Laravel原生的数据库处理能力,提供了一系列便利的方法,以帮助开发者更高效地进行数据操作。本文将深入探讨Laravel开发中的`dbutil`...

    补丁MySQL+JDBC+DBUtil+c3p0史上最全数据库讲义.rar

    DBUtil和c3p0则是两个在Java开发中常用的数据库连接池工具,它们可以提高数据库操作的效率和性能。 **MySQL** MySQL是一个开源、免费的SQL数据库,提供了强大的数据存储和查询能力。它的优点包括高效、稳定、易于...

    JAVA 使用数据库连接池连接Oracle数据库全代码

    ### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...

    DBUtil工具类

    DBUtil工具类是Java开发中常见的一种设计,用于简化数据库操作,提高开发效率。它通常包含了一系列静态方法,可以执行SQL语句,处理结果集,进行数据库连接的创建、管理和关闭等。这样的工具类在DAO(数据访问对象)...

    C#编写的集dao+dbUtil+分页+自定义验证+自定义控件的asp.net网站实例

    4、分页代码,完全依据通用代码写成的分页程序,不是依赖控件,整个案例的登陆、验证、注册、分页等全部使用代码完成,所以很容易移植,而不是程序中杂乱的控件名称,所以我比较偏爱用代码来写asp.net网站;...

    韩顺平SqlHelper,DBUtil工具类

    DBUtil工具类则更进一步,它通常包含更多的数据库操作辅助方法,如分页查询、事务管理、存储过程调用等。DBUtil可能会扩展SqlHelper的功能,提供更加便利的API来处理常见的数据库任务。例如,它可能有一个`...

    Dbutil使用jar包

    DbUtil的设计目标是简化传统的JDBC编程,通过减少样板代码,使开发者能够更加专注于业务逻辑,而无需过多地关注底层的数据库交互细节。 DbUtils的核心功能包括数据库连接管理、查询结果处理、事务处理等。在使用...

    DButil.java

    * 数据库功能类 * @author parddu * @version Sep 29, 2010 9:49:31 AM */ class DButil { private String driver=null; //驱动 private String dbName=null; //数据库名 private String host=null; //主机...

    链接数据库工具类

    DBUtil是一个常用的数据库连接池工具类,它封装了JDBC的基本操作,如建立和关闭数据库连接,执行SQL语句等,以提高代码的可读性和复用性。在Java开发中,使用DBUtil可以避免频繁地创建和关闭数据库连接,从而提高...

    JSP连接数据库和登录数据库代码

    在实际项目中,为了提高代码的可维护性和扩展性,可以考虑使用框架如Spring MVC,它提供了更高级的数据库连接池管理、事务处理以及模型-视图-控制器的完整解决方案。Spring Security则能帮助你轻松实现安全的用户...

    Struts2+displaytag+dbutil

    开发者通常会在Struts2的Action类中编写数据库查询代码,使用DbUtil进行数据操作,然后在JSP页面上使用DisplayTag标签来展示查询结果。 总结来说,"Struts2+displaytag+dbutil"的组合提供了一个强大的平台,用于...

Global site tag (gtag.js) - Google Analytics