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. EFI/GPT探索(为何win7分区时创建100M隐藏分区)

    EFI/GPT探索(为何win7分区时创建100M隐藏分区) 转自 http://blog.tomatoit.net/article.asp?id=348 EFI/GPT是新一代的固件/启动管理技术, ...

  2. 使用elk+redis搭建nginx日志分析平台(转)

    logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态等都有日志文件进行记录.其次,需要有个队列,re ...

  3. C++中出现的计算机术语1

    access labels(訪问标号) 类的成员能够定义为 private,这能够防止使用该类型的代码訪问该成员. 成员还能够定义为 public,这将使该整个程序中都可訪问成员.  address( ...

  4. 用Delphi画圆角Panel的方法(使用CreateRoundRectRgn创造区域,SetWindowRgn显示指定区域)

    用Delphi画圆角Panel的方法: procedure TForm1.Button5Click(Sender: TObject);var fhr :Thandle;beginfhr:=Create ...

  5. discuz清空session,导致session保存机制失败,session无法更新与解决

    <?php function userErrorHandler() { $e = func_get_args(); echo '<pre style="color:red;&qu ...

  6. 关于索引删除的策略IndexDeletionPolicy

    关于索引删除的策略IndexDeletionPolicy . public IndexWriter(Directory d, Analyzer a, boolean create)          ...

  7. 使用HashMap须要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()

    Map/HashMap是java中一种非经常常使用的数据结构,一般我们在应用中做的事情就是调用put向容器写入数据或者是get从容器读取数据. Map.entrySet()这种方法返回了键值对的集合, ...

  8. Cocos2d-x 地图行走的实现3:A*算法

    本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 上一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http: ...

  9. java特权制度设计篇

    数据库表设计 1.1.1.   模块管理(jk_module) 项 类型 说明 id long 就是数据库记录idx号 name string 模块名称 orderid int 排序id  由小到大显 ...

  10. win 开机 Microsoft corparation 滚动栏

    在easybcd里设置  后保存!