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