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. TPL异步并行编程之回调

    Task是基于ThreadPool线程池基础上的高度异步多线程编程,如果有一天我希望一个需要长时间运行的Task,在被某些异常终止后还能回调一些代码就可以知道Task终止的原因了吧 是的,且看代码 p ...

  2. js检测是否手机浏览的函数

    原文:js检测是否手机浏览的函数 查看一个web应用的时候查看源代码无意发现的,记录一下,万能什么时候能用得着呢! function isMobile() { var mobile = navigat ...

  3. 用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)--生成SSL证书请求

    在上个章节中,我们提到了怎样安装XCA(X Certificate and key management)程序.这个章节我们開始正式介绍怎样用XCA生成证书请求.假设大家用过java的话.肯定知道jd ...

  4. javascript 下拉列表 自己主动取值 无需value

    <select id="applyType" name="$!{status.expression}" class="inp" onc ...

  5. objective-c 中数据类型之六 数值类(NSValue)

    // NSValue能够将c类型转换为Objective-C对象,如NSRange,CGPoint.CGSize,CGRect,CGVector,UIEdgeInsets,UIOffset NSRan ...

  6. POJ3313 【随便写了个spfa就一A了,嗨皮】

    我顺便明白了....英文题意理解其实好大一部分还是靠感觉,然后自己猜题意,试题意. 你要是纠结于英文你就跪了. #include <iostream> #include <cstdi ...

  7. win7如何清理图标缓存

    rem 关闭Windows外壳程序explorer taskkill /f /im explorer.exe rem 清理系统图标缓存数据库 attrib -h -s -r "%userpr ...

  8. MVC多语言应用

    MVC多语言应用 最近发现资源文件是个好东西, 用的好了可以给开发人员借阅不少的时间. 例如做一个多语言的网站, 资源文件就有不小的用处. 这里以MVC4模版项目的登录页为例, 简单说一下过程: 1. ...

  9. ACdream 1148(莫比乌斯反演+分块)

    传送门:GCD SUM 题意:给出N,M执行如下程序:long long  ans = 0,ansx = 0,ansy = 0;for(int i = 1; i <= N; i ++)   fo ...

  10. zoj2760(最大流)

    传送门:How Many Shortest Path 题意:给出n个点,和n*n的矩阵表示有向图.a[i][j]为-1表示i到j没有路径:不为-1则表示i到j的路径长度.给出一个vs和vt,要求vs到 ...