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 ...
随机推荐
- 移动端上拉加载,下拉刷新效果Demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java web中java和python混合使用
利用java web技术展示python算法处理后的数据 工具/原料 myeclipse10 pycharm+Anaconda2 方法/步骤 首先安装配置好pycharm+Anaconda ...
- selenium+Python3.5获取验证码
其中PIL为Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. PIL第三方库安装 pip install PI ...
- jumpserver堡垒机web终端支持复制粘贴功能
公司最近内部搭建了一个jumpserver堡垒机,但是web终端连接Windows时候没法复制粘贴文字文本 然后找了一下jumpserver官方说明没找到相应的说明,但是知道是guacamole这个组 ...
- 记一次ubuntuyu源码安装node.js
1.官网下载源码 2.下载后解压,在终端打开,并进入文件夹 3../configure 这一步可谓是一波三折,先是没有Python 安装Python 又说没有G++,安装G++后终于成功执行./con ...
- OpenLdap 对接内部系统(Gitlab+Wiki+Jumpserver+Openvpn)配置
LDAP 全称轻量级目录访问协议(英文:Lightweight Directory Access Protocol),是一个运行在 TCP/IP 上的目录访问协议.目录是一个特殊的数据库,它的数据经常 ...
- 最长公共前缀的golang实现
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 输入: ["flower","flow",&quo ...
- Sketch网页截屏插件设计开发
1.需求 在Sketch的Artboard中插入网页截图: 1.1.输入网址,自动截图到Artboard中,并居中显示: 1.2.可截取网页局部图片 2.技术选型 技术的选型主要是针对截图功能的选型, ...
- work flow 工作流程
常用git 命令 v-1 # 切换分支 git checkout site-v1.7.8 # 提交代码前,先拉取分支 git pull # 拉取失败说明有冲突,解决冲突... # 保存在stash之中 ...
- SDE ST_Geometry SQL st_intersects查询很慢的解决方法
环境:服务端 SDE 10.0 oracle 11.2,客户端 PLSQL 11,oracle 11.2 为了调试方便,以下测试都是把sql提取出来在PLSQL上做 需求是已知一个多边形的点坐标,要在 ...