OSChina底层数据库操作的类(QueryHelper)源代码

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

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

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

标签: OSCHINA JDBC 数据库 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);

        }

    }

}

时间: 2024-08-06 09:24:07

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

OSChina底层数据库操作的类(QueryHelper)源码

OSChina 使用的是 dbutils 这个JDBC的封装类库来进行数据库操作.而 QueryHelper 则是在 dbutils 的基础上进行一级简单的封装,提供一些常用的数据库操作方法和对数据缓存的支持. 数据库连接的释放方法请看这里. 标签: OSCHINA JDBC 数据库 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 2

数据库操作通用类

DataBase.java 说明: 1. 此类包含对数据库的查询,删除,更新操作.     2. 可以实现对大文本对象的增删改.     3. 利用自建的数据库连接池类, 得到数据库连接.     4. 可以利用Tomcat 自带的连接池, 得到数据库连接 变量:     1. 数据库连接 变量名     : conn 应用范围   : protect 变量类型   : Connection 数据库连接 初始值     : null 是否Static :  否     2. 声明语句 变量名  

sqlserver数据库操作公共类DBOperate

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; using System.Windows.Forms; using  WindowsFormsApplication1.DBTools;//提供数据库连接 namespace liuxw_MPS.DBTools {     ///

PHP数据库操作&amp;分页类

MySQL数据库操作类: 1 <?php 2 class mysql { 3 private $db_host; //数据库主机 4 private $db_user; //数据库用户名 5 private $db_pwd; //数据库用户名密码 6 private $db_database; //数据库名 7 private $conn; //数据库连接标识; 8 private $result; //执行query命令的结果资源标识 9 private $sql; //sql执行语句 10

C#的Access数据库操作 AccessHelper类

由于学校的安全级别提高了,我们以前做的网站使用拼接sql方法查询数据会被拦截,所以说网站就必须重构,在重构之余,复习了下AccessHelper类,随便复习了下C#数据库操作.下面我们就开始吧. 先说个工具类,就是池类Pool,很简单的一个类,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Data.

多类型数据库公共操作-对应数据库操作实例类

using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using System.Data.Common; using Microsoft.Practices.EnterpriseLibrary.Data;using EFWCoreLib.CoreFrame.EntLib; namespace EFWCoreLib.CoreFrame.DbProvider{ /// <

SQLserver数据库操作帮助类SqlHelper

1 SqlHelper源码 using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collections; namespace SQL.Access { /// <summary> /// SqlServer数据访问帮助类 /// </summary> public sealed class SqlHelper { #region 私有构造函数和方法

C#数据库操作通用方法类

平时使用的数据库操作类整理更新后备份,记录下来以供以后使用,并顺便分享给大家一起交流.直接上源码: 整个底层操作方法分为4个类,基础方法类:SqlBase 基础工具类:SqlTool 日志类:DbLog  和MSSQL操作类:MsSqlHelper. 由于平时工作未用到其他类型数据库,因此未整理其他数据库的操作类,以后用到的话会进行更新. 首先是通用的数据库底层操作方法整理: /// <summary> /// 数据库操作基础方法类 /// </summary> public cl

人事管理系统——数据库操作类

连接数据库类主要代码: 1 package PersonSystem; 2 3 import java.sql.*; 4 /** 5 * 6 * 连接数据库的类 7 * 8 */ 9 public class Database 10 { 11 private Statement stmt = null; 12 ResultSet rs = null; 13 private Connection conn = null; 14 String sql; 15 String strurl = "jdb