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. jQuery遍历函数

    jQuery遍历函数包含了用于筛选.查找和串联元素的方法. .add():将元素加入到匹配元素的集合中. .andSelf():把堆栈中之前的元素集加入到当前集合中. .children():获得匹配 ...

  2. 深入 理解 Statement 和 PreparedStatement

    一.使用Statement而不是PreparedStatement对象 JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们 ...

  3. Facial Landmark Detection

    源地址:http://www.learnopencv.com/facial-landmark-detection/#comment-2471797375 OCTOBER 18, 2015 BY SAT ...

  4. 《转》如何成为一个牛逼的C/C++程序员?

    原地址:http://blog.csdn.net/langeldep/article/details/6333562 这个题目的噱头太大,要真的写起来, 足够写一本书了. 本人是过来人, 结合自身的体 ...

  5. VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器

    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...

  6. 知识网之C++总结

    米老师常说的一句话:构造知识网. 立即要考试了.就让我们构造一下属于C++的知识网.首先从总体上了解C++: 从图中能够了解到,主要有五部分.而当我们和之前的知识联系的话,也就剩下模板和运算符重载以及 ...

  7. 使用和制作patch文件

    使用和制作patch文件 发表时间: 2007-2-13 20:57    作者: superuser    来源: 迷茫人 字体: 小 中 大 | 打印 原文http://www.linuxsir. ...

  8. 解决com.ibatis.sqlmap.client.SqlMapException: There is no statement named in this SqlMap

    com.ibatis.sqlmap.client.SqlMapException: There is no statement named in this SqlMap. 可能存在3种情况: 1.在x ...

  9. [置顶] ANDROID 返回,菜单和HOME键的监听

    ------网上找了很多资料,项目中使用,最后将经验总结如下: 1,返回和菜单键是可以直接重写onKeyDown(int keyCode, KeyEvent event) 方法监听: @Overrid ...

  10. java -D參数简化增加多个jar【简化设置classpath】

    1.-D<name>=<value> set a system property  设置系统属性. java命令引入jar时能够-cp參数,但时-cp不能用通配符(多个jar时 ...