package com.javalearns.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
 * SQL动态封装工具
 * 
 * simple::
 * 
 *           BaseSelector select = new BaseSelector();
 *           select.setCommand("select * from  stat_user ");
 *           select.createCriteria().andEqualTo("org_code", "YZ1201")
 *           .andGreaterThanOrEqualTo("day_code", "2009-01-01")
 *           .andLessThanOrEqualTo("day_code", "2009-03-31");
 *           List<Map> rowset = SqlTemplate.executeQuery(select.toSql(),new Object[] {});
 *
 *           output:select * from  stat_user where org_code = 'YZ1201' and day_code >= '2009-01-01' and day_code <= '2009-03-31' 
 * 
 */
public class BaseSelector {

/**
     * sql语句
     */
    private String command;
    
    /**
     * 表名称
     */
    private String tableName;
    
    /**
     * 表字段
     */
    private String tableField;
    
    /**
     * 排序字段
     */
    protected String orderByClause;
    
    /**
     * 分组字段
     */
    protected String groupByClause;
    
    /**
     * 统计字段
     */
    protected String countClause;
    
    /**
     * sql条件
     */
    protected List<Criteria> oredCriteria;

public String getCommand()
    {
        return command;
    }

public void setCommand(String command)
    {
        this.command = command;
    }

public BaseSelector() {
        oredCriteria = new ArrayList<Criteria>();
    }

protected BaseSelector(BaseSelector example) {
     this.tableName = example.tableName;
        this.orderByClause = example.orderByClause;
        this.oredCriteria = example.oredCriteria;
        this.groupByClause = example.groupByClause;
        this.countClause = example.countClause;
    }
    
    /**
     * 生成最终sql语句
     */
    public String toSql()
    {
        if(oredCriteria==null||oredCriteria.size()<=0)
            return command;
        
        StringBuffer sqlAll = new StringBuffer();
        sqlAll.append(command);
        
        sqlAll.append(" ");
        
        if(tableField != null){
         sqlAll.append(tableField);
        }
        
        sqlAll.append(" "); 
        
        if(countClause != null){
         sqlAll.append(countClause);
        }
        
        sqlAll.append(" ");
        
        command = sqlAll.toString();
        if (command != null && command.toUpperCase().indexOf(" WHERE ") == -1)
        //if (command != null && command.toUpperCase().indexOf(" WHERE ") == -1)
            sqlAll.append(" WHERE ");
        else
            sqlAll.append(" AND ");
        for (Criteria cri : oredCriteria)
        {
            if(!cri.isValid())
              continue;
            sqlAll.append("(");
            StringBuffer sql = new StringBuffer();
            criteriaWithoutValueSql(sql,cri.criteriaWithoutValue);
            criteriaWithSingleValueSql(sql,cri.criteriaWithSingleValue);
            criteriaWithListValueSql(sql,cri.criteriaWithListValue);
            criteriaWithBetweenValueSql(sql,cri.criteriaWithBetweenValue);
            sqlAll.append(sql.toString());
            sqlAll.append(")");
            sqlAll.append(" or ");
        }
        
        String sql = sqlAll.substring(0, sqlAll.length()-4);
        
        if(groupByClause != null && groupByClause.toUpperCase().indexOf(" GROUP BY ") == -1){
         sql += " GROUP BY ";
         sql += groupByClause;
        }
                
        if(orderByClause != null && orderByClause.toUpperCase().indexOf(" ORDER BY ") == -1){
         sql += " ORDER BY ";
         sql += orderByClause;
        }
        
        return sql;
        //return sqlAll.substring(0, sqlAll.length()-4);
        
    }
    
    @SuppressWarnings("unchecked")
    private String criteriaWithoutValueSql(StringBuffer sql,List list)
    {
        if(list==null)
            return "";
      
        int n = list.size();
        for (int i = 0;i<n;i++)
        {
            sql.append(list.get(i));
            if(i<n-1)
                sql.append(" and ");
        }
        
        return sql.toString();
    }
    
    @SuppressWarnings("unchecked")
    private String criteriaWithSingleValueSql(StringBuffer sql,List list)
    {
        if(list==null)
            return "";
        if (sql.length() > 0&&list.size()>0)
            sql.append(" and ");
        int n = list.size();
        for (int i = 0;i<n;i++)
        {
            Map map = (Map) list.get(i);
            sql.append(map.get("condition")).append(map.get("value"));
            if(i<n-1)
                sql.append(" and ");
        }
        return sql.toString();
    }

@SuppressWarnings("unchecked")
    private String criteriaWithListValueSql(StringBuffer sql,List list)
    {
        if(list==null)
            return "";
        if (sql.length() > 0&&list.size()>0)
            sql.append(" and ");
        int n = list.size();
        for (int i = 0;i<n;i++)
        {
            Map map = (Map) list.get(i);
            sql.append(map.get("condition")).append("("+join((Collection) map.get("values"),",")+")");
            if(i<n-1)
                sql.append(" and ");
        }
        return sql.toString();
    }
    
    @SuppressWarnings("unchecked")
    private String criteriaWithBetweenValueSql(StringBuffer sql,List list)
    {
        if(list==null)
            return "";
        if (sql.length() > 0&&list.size()>0)
            sql.append(" and ");
        int n = list.size();
        for (int i = 0;i<n;i++)
        {
            Map map = (Map) list.get(i);
            sql.append(map.get("condition")).append(join((Collection) map.get("values")," and "));
            if(i<n-1)
                sql.append(" and ");
        }
        return sql.toString();
    }
    
    @SuppressWarnings("unchecked")
    private String  join(Collection list,String spe)
    {
        if(list==null)
            return "";
        Object array[] = list.toArray();
        StringBuffer buff = new StringBuffer();
        for (int i = 0; i < array.length; i++)
        {
            buff.append(array[i]);
            if(i<array.length-1)
                buff.append(spe);
        }
        return buff.toString();
    }

/**
     * 顺序排序
     * @param field
     */
    public void setOrderByClauseAsc(String field) {
        this.orderByClause = getFieldName(field) + " ASC";
    }
    
    /**
     * 倒序排序
     * @param field
     */
    public void setOrderByClauseDesc(String field) {
        this.orderByClause = getFieldName(field) + " DESC";
    }

public String getOrderByClause() {
        return orderByClause;
    }

public List<Criteria> getOredCriteria() {
        return oredCriteria;
    }
    
    
    /**
     * 统计总数
     * @return
     */
 public String getCountClause() {
  return countClause;
 }

public void setCountClause(String countClause) {
  String[] s = countClause.split(",");
  if(s.length > 1){
   this.countClause = ", count(" + s[s.length-1] + ") ";
  }else{
   this.countClause = countClause;
  }
 }

/**
  * 获得分组
  * @return
  */
 public String getGroupByClause() {
  return groupByClause;
 }

public void setGroupByClause(String groupByClause) {
  this.groupByClause = groupByClause;
 }
    
    
 /**
  * 表名称
  * @return
  */
 public String getTableName() {
  return tableName;
 }

public void setTableName(String tableName) {
  this.tableName = tableName;
 }

/**
  * 表字段
  * @return
  */
 public String getTableField() {
  return tableField;
 }

public void setTableField(String tableField) {
  this.tableField = tableField;
 }

/**
     * or 条件
     */
    public void or(Criteria criteria) {
        oredCriteria.add(criteria);
    }

/**
     * 创建条件对象
     */
    public Criteria createCriteria() {
        Criteria criteria = createCriteriaInternal();
        if (oredCriteria.size() == 0) {
            oredCriteria.add(criteria);
        }
        return criteria;
    }

protected Criteria createCriteriaInternal() {
        Criteria criteria = new Criteria();
        return criteria;
    }

/**
     * 清除条件
     */
    public void clear() {
        oredCriteria.clear();
    }
    
     static String getFieldName(String field)
    {
         
        if (field == null ) {
            throw new RuntimeException( field + " cannot be null");
        }
        return field.toUpperCase();
//
//
//        Pattern pattern = Pattern.compile("[A-Z]{1}");
//        Matcher m =  pattern.matcher(field);
//        StringBuffer sbr = new StringBuffer();
//        while(m.find())
//            m.appendReplacement(sbr, "_"+m.group());
//        m.appendTail(sbr);
//        return sbr.toString().toUpperCase();
    }

/**
     * 查询条件
     */
    public static class Criteria {
     
     
     //没有值
        protected List<String> criteriaWithoutValue;
        //String值
        protected List<Map<String, Object>> criteriaWithSingleValue;
        //集合值
        protected List<Map<String, Object>> criteriaWithListValue;
        //between区间值
        protected List<Map<String, Object>> criteriaWithBetweenValue;

//构造函数
        protected Criteria() {
            super();
            criteriaWithoutValue = new ArrayList<String>();
            criteriaWithSingleValue = new ArrayList<Map<String, Object>>();
            criteriaWithListValue = new ArrayList<Map<String, Object>>();
            criteriaWithBetweenValue = new ArrayList<Map<String, Object>>();
        }

//是否有效
        public boolean isValid() {
            return criteriaWithoutValue.size() > 0
                || criteriaWithSingleValue.size() > 0
                || criteriaWithListValue.size() > 0
                || criteriaWithBetweenValue.size() > 0;
        }

public List<String> getCriteriaWithoutValue() {
            return criteriaWithoutValue;
        }

public List<Map<String, Object>> getCriteriaWithSingleValue() {
            return criteriaWithSingleValue;
        }

public List<Map<String, Object>> getCriteriaWithListValue() {
            return criteriaWithListValue;
        }

public List<Map<String, Object>> getCriteriaWithBetweenValue() {
            return criteriaWithBetweenValue;
        }

protected void addCriterion(String condition) {
            if (condition == null||"".equals(condition)) {
                return;
            }
            criteriaWithoutValue.add(condition);
        }

protected void addCriterion(String condition, Object value, String property) {
            if (value == null||"".equals(value)) {
                return;
            }
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("condition", condition);
            map.put("value", value);
            criteriaWithSingleValue.add(map);
        }

protected void addCriterion(String condition, List<? extends Object> values, String property) {
            if (values == null || values.size() == 0) {
                return;
            }
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("condition", condition);
            map.put("values", values);
            criteriaWithListValue.add(map);
        }

protected void addCriterion(String condition, Object value1, Object value2, String property) {
            if (value1 == null || value2 == null) {
                return;
            }
            List<Object> list = new ArrayList<Object>();
            list.add(value1);
            list.add(value2);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("condition", condition);
            map.put("values", list);
            criteriaWithBetweenValue.add(map);
        }

public Criteria andIsNull(String field) {
            addCriterion(getFieldName(field)+" is null");
            return this;
        }

public Criteria andIsNotNull(String field) {
            addCriterion(getFieldName(field)+" is not null");
            return this;
        }

/**
         * 字符相等
         * @param field
         * @param value
         * @return
         */
        public Criteria andEqualTo(String field,String value) {
            addCriterion(getFieldName(field)+" =", quoteStr(value), field);
            return this;
        }

/**
         * 字符不相等
         * @param field
         * @param value
         * @return
         */
        public Criteria andNotEqualTo(String field,String value) {
            addCriterion(getFieldName(field)+" <>", quoteStr(value), field);
            return this;
        }

/**
         * 字符大于
         * @param field
         * @param value
         * @return
         */
        public Criteria andGreaterThan(String field,String value) {
            addCriterion(getFieldName(field)+" >", quoteStr(value), field);
            return this;
        }

/**
         * 字符大于等于
         * @param field
         * @param value
         * @return   Java免费学习  Java自学网 http://www.javalearns.com
         */
        public Criteria andGreaterThanOrEqualTo(String field,String value) {
            addCriterion(getFieldName(field)+" >=", quoteStr(value), field);
            return this;
        }
        
        /**
         * 字符小于
         * @param field
         * @param value
         * @return
         */
        public Criteria andLessThan(String field,String value) {
            addCriterion(getFieldName(field)+" <", quoteStr(value), field);
            return this;
        }

/**
         * 字符小于等于
         * @param field
         * @param value
         * @return
         */
        public Criteria andLessThanOrEqualTo(String field,String value) {
            addCriterion(getFieldName(field)+" <=", quoteStr(value), field);
            return this;
        }

/**
         * 字符相似
         * @param field
         * @param value
         * @return   Java免费学习  Java自学网 http://www.javalearns.com
         */
        public Criteria andLike(String field,String value) {
            addCriterion(getFieldName(field)+" like", quoteStr(value), field);
            return this;
        }

/**
         * 字符不相似
         * @param field
         * @param value
         * @return
         */
        public Criteria andNotLike(String field,String value) {
            addCriterion(getFieldName(field)+" not like", quoteStr(value), field);
            return this;
        }

/**
         * 字符包含在某个范围内IN
         * @param field
         * @param value
         * @return Java免费学习  Java自学网 http://www.javalearns.com
         */
        @SuppressWarnings("unchecked")
        public Criteria andIn(String field,List<String> values) {
            List vs = new ArrayList();
            for (String string : values)
            {
                vs.add(quoteStr(string));
            }
            addCriterion(getFieldName(field)+" in", vs, field);

return this;
        }

@SuppressWarnings("unchecked")
        public Criteria andNotIn(String field,List<String> values) {
            List vs = new ArrayList();
            for (String string : values)
            {
                vs.add(quoteStr(string));
            }
            addCriterion(getFieldName(field)+" not in", vs, field);
            return this;
        }

public Criteria andBetween(String field,String value1, String value2) {
            addCriterion(getFieldName(field)+" between", quoteStr(value1), quoteStr(value2), field);
            return this;
        }

public Criteria andNotBetween(String field,String value1, String value2) {
            addCriterion(getFieldName(field)+" not between", quoteStr(value1), quoteStr(value2), field);
            return this;
        }
        
        private String quoteStr(String str)
        {
            if(str==null)
                return null;
            return "'"+str+"'";
        }
        
    }
    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {

BaseSelector select = new BaseSelector();     
      //select.setCommand("select * from  stat_user "); 
      select.setCommand("select ");
      select.setTableField("uid,uname,pwd");
      select.setCountClause("uid,uname,pwd");      
      select.createCriteria().andEqualTo("org_code", "YZ1201")
         .andGreaterThanOrEqualTo("day_code", "2009-01-01")
         .andLessThanOrEqualTo("day_code", "2009-03-31");
      select.setGroupByClause("uid,uname,pwd");
      //select.setOrderByClauseAsc("uid");
      System.out.println(select.toSql());
    
    }

}

文章转载自 http://www.javalearns.com/Html/?1644.html
更多Java知识学习请访问 Java免费学习网  http://www.javalearns.com

Java中SQL动态封装工具类--Java自学网相关推荐

  1. java中常用的日期工具类

    java中常用的日期工具类 日期相关的类: package net.yto.ofclacct.core.util;import java.text.ParseException; import jav ...

  2. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  3. JWT|概述|JWT结构|JWT在java中的使用|JWT工具类的封装|JWT在springboot中的使用|JWT与拦截器的配合

    JWT ! 前记: 官网:https://jwt.io/ jwt有人说是用计算力换空间(相对于session) 小程序后台要求全部用springboot实现..登录状态的管理:本来想用自己随便生成UU ...

  4. JAVA中实用的一个工具类--Hutool

    什么是Hutool Hutool是一个Java工具包,也就是一个工具箱,一个utils集合,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以简单粗暴.Hutool最初是作者项目中&quo ...

  5. java中文件操作的工具类

    代码: package com.lky.pojo;import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...

  6. Java中操作字符串的工具类-判空、截取、格式化、转换驼峰、转集合和list、是否包含

    场景 某些常用的对字符串进行处理的方法抽离出来成工具类,方便在多处应用. 常用的操作为: 判断是否为空 截取字符串 格式化文本 字符串转set 字符串转list 下划线转驼峰命名 是否包含字符串 注: ...

  7. java中时间常用处理工具类-DateUtils

    仅供参考,收录了一些常用的java中关于时间的处理方法,希望能帮到你! import org.apache.commons.lang3.time.DateFormatUtils;import java ...

  8. java中常用到的工具类使用

    Tool 不定期更新,建议收藏,收录日常所用 1,判断对象是否为空的常用工具类 2,对象和数组的复制 3,关于拼接字符串去掉最后一个符号的三种方式 4,判断对象值属性不为null并且不为空字符串 5, ...

  9. java des 加密工具的使用,Java中DES加密解密工具类的实现实例

    这篇文章主要介绍了Java实现的DES加密解密工具类,结合具体实例形式分析了Java实现的DES加密解密工具类定义与使用方法,需要的朋友可以参考下 本文实例讲述了Java实现的DES加密解密工具类.分 ...

最新文章

  1. 聊聊分布式定时任务中间件架构及其实现--转
  2. 1.7 Java try catch finally语句
  3. GridMask:SOTA 数据增广方法,显著改进分类、检测、分割效果
  4. Spring5+CXF整合开发REST之一次坑旅
  5. 简单易扩展的爬虫架构
  6. repo 的几个使用理解
  7. Highcharts数据可视化工具功能效果图详解
  8. HTML表单元素、表单控件
  9. sonar8.9.1导出扫描结果pdf 实操
  10. MaxScript与外部程序通讯
  11. 怎样快速将pdf在线转换成word免费版
  12. 2022年8月止,国外最佳游戏榜出炉
  13. DAOS整体设计分析 (二)
  14. html层叠云标签代码,可以加载个人博客中,非常炫的特效
  15. 贝格尔编排法之C++版
  16. 【vue+Element】 el-table根据换行符(回车)换行
  17. 哪些云主机值得推荐?
  18. 传说中的程序员最牛表白方式!
  19. 二维码生成器-客户端
  20. 图纸上标注的是实际尺寸吗_施工图纸上尺寸标注的标准是什么?

热门文章

  1. ArcGIS API for JavaScript 如何下载最新版
  2. SQL中常用的四个排序函数
  3. python使用第三方支付宝SDK实现小程序发红包、用户支付等功能
  4. squashfs for windows:windows下的squ打包工具
  5. 为什么我们需要使用或执行技术标准规范
  6. DXC简介——HANA数据抽取和同步
  7. 项目管理工具dhtmlxGantt甘特图入门教程(十四):导出/导入 Excel到 iCal
  8. 【数据挖掘】pandas使用手册
  9. 由三个点的坐标确定圆和球的圆心和半径
  10. CCS6.13安装教程及安装包