OSChina 使用的是 dbutils 这个JDBC的封装类库来进行数据库操作。

而 QueryHelper 则是在 dbutils 的基础上进行一级简单的封装,提供一些经常使用的数据库操作方法和对数据缓存的支持。

数据库连接的释放方法请看这里

[1].[代码] QueryHelper.java 跳至 [1]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package

my.db;
 
import

java.io.Serializable;
import

java.math.BigInteger;
import

java.sql.*;
import

java.util.*;
 
import

my.cache.CacheManager;
import

net.oschina.Configurations;
 
import

org.apache.commons.dbutils.QueryRunner;
import

org.apache.commons.dbutils.handlers.*;
import

org.apache.commons.lang.ArrayUtils;
 
/**
 *
数据库查询助手
 *
@author Winter Lau<br> */
@SuppressWarnings("unchecked")
public

class

QueryHelper {
     
    private

final

static

QueryRunner _g_runner =
new

QueryRunner();
    private

final

static

ColumnListHandler _g_columnListHandler =
new

ColumnListHandler(){
        @Override
        protected

Object handleRow(ResultSet rs)
throws

SQLException {
            Object
obj =
super.handleRow(rs);
            if(obj
instanceof

BigInteger)
                return

((BigInteger)obj).longValue();
            return

obj;
        }
         
    };
    private

final

static

ScalarHandler _g_scaleHandler =
new

ScalarHandler(){
        @Override
        public

Object handle(ResultSet rs)
throws

SQLException {
            Object
obj =
super.handle(rs);
            if(obj
instanceof

BigInteger)
                return

((BigInteger)obj).longValue();
            return

obj;
        }      
    };
     
    private

final

static

List<Class<?>> PrimitiveClasses =
new

ArrayList<Class<?>>(){{
        add(Long.class);
        add(Integer.class);
        add(String.class);
        add(java.util.Date.class);
        add(java.sql.Date.class);
        add(java.sql.Timestamp.class);
    }};
     
    private

final

static

boolean

_IsPrimitive(Class<?> cls) {
        return

cls.isPrimitive() || PrimitiveClasses.contains(cls) ;
    }
     
    /**
     *
获取数据库连接
     *
@return
     */
    public

static

Connection getConnection() {
        try{
            return

Configurations.getConnection();
        }catch(SQLException
e){
            throw

new

DBException(e);
        }
    }
 
    /**
     *
读取某个对象
     *
@param sql
     *
@param params
     *
@return
     */
    @SuppressWarnings("rawtypes")
    public

static

<T> T read(Class<T> beanClass, String sql, Object...params) {
        try{
            return

(T)_g_runner.query(getConnection(), sql, _IsPrimitive(beanClass)?_g_scaleHandler:
new

BeanHandler(beanClass), params);
        }catch(SQLException
e){
            throw

new

DBException(e);
        }
    }
     
    public

static

<T> T read_cache(Class<T> beanClass, String cache, Serializable key, String sql, Object...params) {
        T
obj = (T)CacheManager.get(cache, key);
        if(obj
==
null){
            obj
= read(beanClass, sql, params);
            CacheManager.set(cache,
key, (Serializable)obj);
        }
        return

obj;
    }
     
    /**
     *
对象查询
     *
@param <T>
     *
@param beanClass
     *
@param sql
     *
@param params
     *
@return
     */
    @SuppressWarnings("rawtypes")
    public

static

<T> List<T> query(Class<T> beanClass, String sql, Object...params) {
        try{
            return

(List<T>)_g_runner.query(getConnection(), sql, _IsPrimitive(beanClass)?_g_columnListHandler:
new

BeanListHandler(beanClass), params);
        }catch(SQLException
e){
            throw

new

DBException(e);
        }
    }
 
    /**
     *
支持缓存的对象查询
     *
@param <T>
     *
@param beanClass
     *
@param cache_region
     *
@param key
     *
@param sql
     *
@param params
     *
@return
     */
    public

static

<T> List<T> query_cache(Class<T> beanClass, String cache_region, Serializable key, String sql, Object...params) {      
        List<T>
objs = (List<T>)CacheManager.get(cache_region, key);
        if(objs
==
null){
            objs
= query(beanClass, sql, params);
            CacheManager.set(cache_region,
key, (Serializable)objs);
        }
        return

objs;
    }
     
    /**
     *
分页查询
     *
@param <T>
     *
@param beanClass
     *
@param sql
     *
@param page
     *
@param count
     *
@param params
     *
@return
     */
    public

static

<T> List<T> query_slice(Class<T> beanClass, String sql,
int

page,
int

count, Object...params) {
        if(page
<
0

|| count <
0)
            throw

new

IllegalArgumentException(
"Illegal
parameter of 'page' or 'count', Must be positive."
);
        int

from = (page -
1)
* count;
        count
= (count >
0)
?

count : Integer.MAX_VALUE;

        return

query(beanClass, sql +
"
LIMIT ?,?"
,
ArrayUtils.addAll(params,
new

Integer[]{from,count}));     
    }
     
    /**
     *
支持缓存的分页查询
     *
@param <T>
     *
@param beanClass
     *
@param cache
     *
@param cache_key
     *
@param cache_obj_count
     *
@param sql
     *
@param page
     *
@param count
     *
@param params
     *
@return
     */
    public

static

<T> List<T> query_slice_cache(Class<T> beanClass, String cache, Serializable cache_key,
int

cache_obj_count, String sql,
int

page,
int

count, Object...params) {
        List<T>
objs = (List<T>)CacheManager.get(cache, cache_key);
        if(objs
==
null)
{
            objs
= query_slice(beanClass, sql,
1,
cache_obj_count, params);
            CacheManager.set(cache,
cache_key, (Serializable)objs);
        }
        if(objs
==
null

|| objs.size()==
0)
            return

objs;
        int

from = (page -
1)
* count;
        if(from
<
0)
            return

null
;
        if((from+count)
> cache_obj_count)
//超出缓存的范围
            return

query_slice(beanClass, sql, page, count, params);
        int

end = Math.min(from + count, objs.size());
        if(from
>= end)
            return

null
;
        return

objs.subList(from, end);
    }
     
    /**
     *
运行统计查询语句。语句的运行结果必须仅仅返回一个数值
     *
@param sql
     *
@param params
     *
@return
     */
    public

static

long

stat(String sql, Object...params) {
        try{
            Number
num = (Number)_g_runner.query(getConnection(), sql, _g_scaleHandler, params);
            return

(num!=
null)?num.longValue():-1;
        }catch(SQLException
e){
            throw

new

DBException(e);
        }
    }
 
    /**
     *
运行统计查询语句。语句的运行结果必须仅仅返回一个数值
     *
@param cache_region
     *
@param key
     *
@param sql
     *
@param params
     *
@return
     */
    public

static

long

stat_cache(String cache_region, Serializable key, String sql, Object...params) {
        Number
value = (Number)CacheManager.get(cache_region, key);
        if(value
==
null){
            value
= stat(sql, params);
            CacheManager.set(cache_region,
key, value);
        }
        return

value.longValue();
    }
 
    /**
     *
运行INSERT/UPDATE/DELETE语句
     *
@param sql
     *
@param params
     *
@return
     */
    public

static

int

update(String sql, Object...params) {
        try{
            return

_g_runner.update(getConnection(), sql, params);
        }catch(SQLException
e){
            throw

new

DBException(e);
        }
    }
     
    /**
     *
批量运行指定的SQL语句
     *
@param sql
     *
@param params
     *
@return
     */
    public

static

int
[]
batch(String sql, Object[][] params) {
        try{
            return

_g_runner.batch(getConnection(), sql, params);
        }catch(SQLException
e){
            throw

new

DBException(e);
        }
    }
}

OSChina底层数据库操作的类(QueryHelper)源代码的更多相关文章

  1. 【转载】微软官方提供的Sqlserver数据库操作帮助类SQLHelper类

    在.NET平台中,C#语言一般使用ADO.NET组件来操作Sqlserver数据库,通过ADO.NET组件可以实现连接数据库.查询数据集.执行SQL语句以及关闭数据库连接等操作,为此网上有很多开发者自 ...

  2. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  3. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  4. ADO.NET数据库操作助手类

    SQL语句操作增删查改助手类 using System; using System.Collections.Generic; using System.Configuration; using Sys ...

  5. SQLserver数据库操作帮助类SqlHelper

    1 SqlHelper源码 using System; using System.Data; using System.Xml; using System.Data.SqlClient; using ...

  6. tp5数据库操作 Db类

    一.链接数据库 1.配置文件定义  application\database.php 注意:数据表前缀更改,在文件的prefix选项 2.类定义 二.数据库的基本使用 namespace app\de ...

  7. Discuz!数据库操作DB类和C::t类介绍

    类定义文件 DB类: 文件\source\class\class_core.php class DB extends discuz_database {} discuz_database类定义 文件\ ...

  8. matlab提取wind底层数据库操作

    首先需要安装navicat for SQL server 软件, 为了实现Matlab 通过JDBC方式连接Sqlserver数据库, 需要安装Sqlserver JDBC驱动. 地址: https: ...

  9. C# ACCESS数据库操作类

    这个是针对ACCESS数据库操作的类,同样也是从SQLHELPER提取而来,分页程序的调用可以参考MSSQL那个类的调用,差不多的,只是提取所有记录的数量的时候有多一个参数,这个需要注意一下! usi ...

随机推荐

  1. 让notepad.exe的utf8不添加BOM

    实在是厌烦了notepad的utf8模式了,于是决定修改之,方案如下: 使用任何支持hex模式的编辑器打开%SystemRoot%/system32/notepad.exe查找二进制串56 8D 45 ...

  2. Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

    原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...

  3. html ui设计案例

    1.jquery特效:http://www.5icool.org 2. http://www.open-lib.com/Lib/1992.jsp

  4. JVM查找类文件的顺序(转)

    配置classpath 根据path环境变量的原理,可以定义一个名为classpath环境变量,将要运行的class文件所在目录定义在该变量中. 例:set classpath=c:\ classpa ...

  5. uva--562Dividing coins +dp

    题意: 给定一堆硬币,然后将他们分成两部分,使得两部分的差值最小;输出这个最小的差值. 思路: 想了好久都没想到一个合适的状态转移方程.后面看了别人的题解后,才知道能够转成背包问题求解. 我们将全部的 ...

  6. 16位图像Alpha混合的实现(用汇编写的,比MMX还要快)

    Alpha 混合的算法很简单,基于下面的公式就可以实现: D := A * (S - D) / 255 + D D 是目标图像的像素, S 是源图像的像素 A 是 Alpha 值, 0 为全透明, 2 ...

  7. ios 6 横竖屏转换

    xcode 版本4.5     模拟器:6.0 项目需求:刚进去界面横屏,从这个界面进去的界面全是竖屏. 程序的根控制器用了UINavigationController.下面是代码: 1.在appde ...

  8. Swift实现OC中的单例模式

    一.MySingle类 import Foundation class MySingle{ //定义单例的属性 var name:String? var age:Int? var height:Dou ...

  9. EXPORT_SYMBOL解析

    一般我们编写C程序时,要调用某个文件中的函数,需要在本文件中包含声明有被调用函数的头文件,然后编译连接后,方能找到调用函数.对于模块依赖的情况,不能简单的使用上面的方法,内核提供了一个机制,就是EXP ...

  10. HDU 1226 超级密码 (搜素)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1226 题意简单,本来是一道很简单的搜素题目. 但是有两个bug: 1.M个整数可能有重复的. 2.N可 ...