需求:最近接触一个项目需要其兼容主流的数据库。
我用到的包: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();
}
}
}