QueryHelper
[1].[代码] QueryHelper.java 跳至 [1]
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);
}
}
}
QueryHelper的更多相关文章
- OSChina底层数据库操作的类(QueryHelper)源代码
OSChina 使用的是 dbutils 这个JDBC的封装类库来进行数据库操作. 而 QueryHelper 则是在 dbutils 的基础上进行一级简单的封装,提供一些经常使用的数据库操作方法和对 ...
- 分页技巧__在项目中使用QueryHelper辅助对象实现分页效果
分页技巧__在项目中使用QueryHelper辅助对象实现分页效果 QueryHelper 用于辅助拼接HQL语句 addCondition("t.type=?", "精 ...
- 分页技巧_测试并继续改进分页用的QueryHelper辅助对象
分页技巧_测试并继续改进分页用的QueryHelper辅助对象 QueryHelper.java /** * 用于辅助拼接HQL语句 */ public class QueryHelper { pri ...
- 分页技巧__设计分页用的QueryHelper辅助对象
分页技巧__设计分页用的QueryHelper辅助对象 FROM 必须 实体名 WHERE 可选 条件1 AND 条件2 AND ... 条件n ORDER BY 可选 属性1, 属性2, ... ...
- QueryHelper插件类(hql)
package cn.itcast.core.util; import java.util.ArrayList; import java.util.List; public class QueryHe ...
- AD中各层的说明
PCB各层说明: 1.丝印层(OverLay,Silkscreen):有顶层丝印和底层丝印.用来画器件轮廓,器件编号和一些图案等. 2.信号层(SignalLayer):对于两层板,主要是TopLay ...
- 解析大型.NET ERP系统 窗体、查询、报表二次开发
详细介绍Enterprise Solution 二次开发的流程步骤,主要包括数据输入窗体(Entry Form),查询(Query/Enquiry),报表(Report)三个重要的二次开发项目. 数据 ...
- SSH(2)
1.用户登录 index页面跳转到登录页面 <% String path = request.getContextPath(); String basePath = request.getSch ...
- oVirt-engine项目UI结构
1.管理面板文件路径 ovirt-engine/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmi ...
随机推荐
- Python 基于urllib.request封装http协议类
基于urllib.request封装http协议类 by:授客QQ:1033553122 测试环境: Python版本:Python 3.3 代码实践 #!/usr/bin/env python ...
- [Android GMS 认证] keystore/keymaster/Attestation的问题
首先确定写入key,操作如下: 检查 /persist/data/sfs 目录下是否有key文件存在 adb shell ls -la /persist/data/sfs 做过key prov ...
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCHE ...
- apache 访问权限出错,apache selinux 权限问题, (13) Permission Denied
今天在使用 httpd 做文件服务器的时候,发现 png 图像没有打开,但是原本www/html 文件夹内部的文件就可以打开.后来猜测是selinux 的问题,之前一直想写一篇关于selinux 的博 ...
- 描述性统计的matlab实现
理论讲的再多不会做也白弄 直接上手 一.针对接近正态分布的(均值,方差,标准差,极差,变异系数,偏度,峰度) 这里我必须提前说明一点就是,你在写好函数后,函数的名是dts,你保存的文件名也必须是dts ...
- AIX mount nfs 文件系统失败
报 mount: 1831-008 的错,配置系统参数后恢复. 操作系统版本为: # oslevel 6.1.0.0 LOG如下: # mount 192.168.240.69:/xyz/xvdh2/ ...
- Linux之shell脚本for、while、case语句的高级用法
1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...
- JVM虚拟机查找类文件的顺序
JVM查找类文件的顺序: 在doc下使用set classpath=xxx, 如果没有配置classpath环境变量,JVM只在当前目录下查找要运行的类文件. 如果配置了classpath环境,JVM ...
- Decentraleyes - Local emulation of Content Delivery Networks
Decentraleyes, 是一个本地化第三方库文件的浏览器插件,提供三十多种语言支持.大致原理如下: 保存常用的第三方库文件到本地,当打开的页面中需要加载的第三方库文件在本地有副本时,随即进行拦截 ...
- 【学习笔记】cache/buffer
cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到**加快访问速度**的作用.buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 ...