[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的更多相关文章

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

    OSChina 使用的是 dbutils 这个JDBC的封装类库来进行数据库操作. 而 QueryHelper 则是在 dbutils 的基础上进行一级简单的封装,提供一些经常使用的数据库操作方法和对 ...

  2. 分页技巧__在项目中使用QueryHelper辅助对象实现分页效果

    分页技巧__在项目中使用QueryHelper辅助对象实现分页效果 QueryHelper 用于辅助拼接HQL语句 addCondition("t.type=?", "精 ...

  3. 分页技巧_测试并继续改进分页用的QueryHelper辅助对象

    分页技巧_测试并继续改进分页用的QueryHelper辅助对象 QueryHelper.java /** * 用于辅助拼接HQL语句 */ public class QueryHelper { pri ...

  4. 分页技巧__设计分页用的QueryHelper辅助对象

    分页技巧__设计分页用的QueryHelper辅助对象 FROM 必须 实体名 WHERE  可选 条件1 AND 条件2 AND ... 条件n ORDER BY 可选 属性1, 属性2, ... ...

  5. QueryHelper插件类(hql)

    package cn.itcast.core.util; import java.util.ArrayList; import java.util.List; public class QueryHe ...

  6. AD中各层的说明

    PCB各层说明: 1.丝印层(OverLay,Silkscreen):有顶层丝印和底层丝印.用来画器件轮廓,器件编号和一些图案等. 2.信号层(SignalLayer):对于两层板,主要是TopLay ...

  7. 解析大型.NET ERP系统 窗体、查询、报表二次开发

    详细介绍Enterprise Solution 二次开发的流程步骤,主要包括数据输入窗体(Entry Form),查询(Query/Enquiry),报表(Report)三个重要的二次开发项目. 数据 ...

  8. SSH(2)

    1.用户登录 index页面跳转到登录页面 <% String path = request.getContextPath(); String basePath = request.getSch ...

  9. oVirt-engine项目UI结构

    1.管理面板文件路径 ovirt-engine/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmi ...

随机推荐

  1. Angular基础(三) TypeScript

    一.模仿Reddit a) 运行ng new –ng4angular-reddit创建应用,从随书代码中复制样式文件,新建组件app-root,代码为: 界面可以看到了: b) 对于界面输入的数据,获 ...

  2. Android系统启动流程(二)解析Zygote进程启动过程

    1.Zygote简介 在Android系统中,DVM(Dalvik虚拟机).应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器.它通过 ...

  3. Java并发编程(七)深入剖析ThreadLocal

    一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个 ...

  4. python ctypes 探究 ---- python 与 c 的交互

    近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...

  5. Linux 硬盘格式化、分区、挂载、卸载、删除分区,Linux重新调整分区

    目录 Linux 硬盘格式化.分区.挂载.卸载.删除分区 0. 查看挂载情况 1. 查看硬盘信息 2. 创建分区 3. 查看磁盘信息 4. 格式化分区 5. 将分区信息写入fstab, 设置开机自动挂 ...

  6. 简述 Spring Cloud 是什么2

    一.概念定义       Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案. Spring Cloud对微服务基础框架Ne ...

  7. python3 下列表与字典转换

    在写爬虫的时候,经常需要处理cookie,requests库里的cookie是dict,但是headers['cookie']却是一个key=value的字符串. 下面是几个用推导式实现的转换函数,供 ...

  8. Matplotlib:tick_params参数设置

    1.tick_params语法 参数:axis : {‘x’, ‘y’, ‘both’} Axis on which to operate; default is ‘both’.reset : boo ...

  9. ES5数组的遍历方式

    /* 遍历数组 */ var arr=[1,2,3,43,55,66,77,99]; /* 遍历数组 function(item,index) */ arr.forEach(function(item ...

  10. web页面中快速找到html对应元素两种方法

    一.第一种方法(通过先进入开发模式然后再去选择网页元素) 1.打开IE.Chrome.FireFox等,按 F12 键进入开发模式 2.在打开的控制窗口左上角有个  箭头 按钮,点击它之后,此时将鼠标 ...