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);
        }
    }
}
时间: 2024-10-12 06:07:32

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

QueryHelper插件类(hql)

package cn.itcast.core.util; import java.util.ArrayList; import java.util.List; public class QueryHelper { //from子句 private String fromClause = ""; //where子句 private String whereClause = ""; //order by子句 private String orderByClause =

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 2

SSH系列:(29)使用Quartz 实现自动受理

需求中要求每月月底将上个月的投诉自动处理为已失效.要求是每月月底,所以定时任务应该将处理时间设置在每月的月底:处理的任务是将上个月的未受理的投诉信息自动将其状态设置为已失效. 将自动受理的方法加入到complainService/complainServiceImpl中,以便事务控制: ComplainService.java package com.rk.tax.service; import com.rk.core.service.BaseService; import com.rk.tax

应用程序框架实战二十六:查询对象

信息系统的查询需求千变万化,在仓储中为每个查询需求创建一个特殊方法,将导致大量乏味而臃肿的接口. 一种更加可行的办法是,在应用层服务中描述查询需求,并通过仓储执行查询. 为了能够更好的描述查询需求,可以将查询功能从仓储中抽取出来,专门创建一个查询对象. 查询最复杂的部分是条件过滤,这也是查询对象的主要职责.查询对象可以认为是规约模式的一个变种,允许查询对象动态创建查询条件. 在Util.Domains项目Repositories目录中,创建查询对象基接口IQueryBase,代码如下. usin

方便调试使用的代码片段

#region #warning 调试用,获取sql参数化的值,根据抛出的异常,复制sql明文到mssql中运行 string debugSql = queryHelper.CommandText; foreach (object p in queryHelper.Parameters) { string paraName = p.ToString(); string paraValue = queryHelper.GetParameterValue(paraName).ToString();

【SSH项目实战】国税协同平台-34.quartz&amp;CronTrigger

我们上次使用quartz任务调度框架创建了一个在后台按照时间间隔不停运行的任务,我们使用的是simpleTrigger简单触发器,为了实现我们的月末自动回复的功能,我们要设置触发器能够在某个精确时间去自动执行任务,那么使用simpleTrigger简单触发器就远远不够了,我们需要使用CronTrigger任务触发器来实现这个功能. 我们的CronTrigger设置步骤如下: 任务触发器(CronTrigger) ① 设置任务详细 ② 设置执行时机(cronExpression) cronExpr

NET中小型企业级项目开发架构系列(一)

前端时间我们开发了基于Net的一套搭建sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,现在把整个开发过程中的步步进展整理出来和大家分享,这个系列可能有点长,多多指导学习.        我们的底层开发平台是sprint.NET+NHibernate+MVC+WCF+EasyUI方式开发,顺便加点Spring.net注入的部分,当然我们最主要的关于权限设计.业务设计,而架构,咱们没有学过太复杂的架构,我们还是以最常用的MVC架构开始拓展 参考材料

Astah画类图——第八周作业

使用Astah画UML类图经验总结 从学习需求工程与UML开始,就开始接触到Astah这款软件,但是当时完全是为了对UML各种图的了解加深才使用了这款软件.当时画图,都是完全凭借自己想,并没有考虑实际情况,而且画的图都是很简单的,甚至有些图是已经给定的,只要在软件上再画一遍来了解软件的使用.所以当时,对与这款软件并没有很好的使用.在最近进行软件项目管理的时候,需要画类图,我再次使用了这个软件.由于这次的工程涉及的类很多(和我之前遇到的相比),所以画了比较长的的时间,我也从这个软件中,摸索到了一些