通用数据库分页 扩展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();
		}
	}
}
 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值