设为首页 收藏本站
查看: 1716|回复: 0

[经验分享] 对sql的查询语句做成对象式,简单实现。Where部分

[复制链接]

尚未签到

发表于 2018-10-22 11:54:09 | 显示全部楼层 |阅读模式
package net.zz.zjf.plugin;  

  
import java.lang.reflect.Array;
  
import java.util.*;
  
import java.util.regex.Matcher;
  
import java.util.regex.Pattern;
  

  
/**
  
* Created by ZaoSheng on 2015/8/5.
  
*/
  
public class Where implements SQLParams{
  
    //用于存放第一个条件的名
  
    private String first = null;
  
    /*这里存放所有的where需要用到的东西。wheres的key是property名,value主要分为三部分
  
    *value主要分为三部分,value[0]用来存放property的值,在BETWEEN的情况下value[0]是数组
  
    *数组长度为2。value[1]存放AndOr,value[2]存放具体的where操作,比如 ">",">=","like","in"
  
    *等操作。
  
    */
  
    private Map wheres = new HashMap();
  
    //这个对象用来存放具体的属性值attrs的key是sql中":property"中的"property",value是对应的值
  
    private Map attrs = new HashMap();
  
    //这个集合不一定有值,在执行toFormatSQL方法后才会有值。存放的值依次对应sql中的第几个"?"
  
    private List paras = new ArrayList();
  

  
    public Where() {
  

  
    }
  

  
    public Where(String propertyName, Object value, AndOr andor, Restriction restriction) {
  
        first = propertyName;
  
       add(propertyName, value, andor, restriction);
  
    }
  

  
    public Where(String propertyName, Object value, AndOr andor) {
  
        this(propertyName, value, andor, Restriction.EQ);
  
    }
  

  
    public Where(String propertyName, Object value, Restriction restriction) {
  
        this(propertyName, value, AndOr.NUL, restriction);
  
    }
  

  
    public Where(String propertyName, Object value) {
  
        this(propertyName, value, Restriction.EQ);
  
    }
  

  
    public Map getWheres() {
  
        return wheres;
  
    }
  

  
    public Map getAttrs() {
  
        return attrs;
  
    }
  

  
    public List getParas() {
  
        return paras;
  
    }
  

  
    public Where and(String propertyName, Object value, Restriction restriction) {
  
        add(propertyName, value, AndOr.AND, restriction);
  
        return this;
  
    }
  

  
    public Where and(String propertyName, Object value) {
  
        return and(propertyName, value, Restriction.EQ);
  
    }
  

  
    public Where or(String propertyName, Object value, Restriction restriction) {
  
        add(propertyName, value, AndOr.OR, restriction);
  
        return this;
  
    }
  

  
    public Where or(String propertyName, Object value) {
  
        return or(propertyName, value, Restriction.EQ);
  
    }
  

  
    protected void add(String key, Object value, AndOr andor, Restriction restriction) {
  
        if (null == value || "".equals(value)) {
  
            if (key.equals(first))
  
            {
  
                first = null;
  
            }
  
            wheres.remove(key);
  
        } else {
  
            wheres.put(key, new Object[]{value, andor, restriction});
  
        }
  

  
    }
  

  

  

  
    public String toSQL() {
  
        if (wheres.isEmpty()) return "";
  
        StringBuilder sb = new StringBuilder();
  
        if (null != first)  setSql(first, wheres.get(first), sb );
  

  
        for (String key : wheres.keySet()) {
  
            if (key.equals(first))  continue;
  

  
            Object[] objects = wheres.get(key);
  
            setSql(key, objects, sb);
  

  
        }
  
        return sb.toString();
  
    }
  

  
    /**
  
    *这个方法之所以提取出来是因为能更好的在多个地方引用(应该用代码重构的方式来讲的,可惜我不会讲).
  
    */
  
    private void setSql(String key, Object[] objects, StringBuilder sb)
  
    {
  
        AndOr andOr = (AndOr) objects[1];
  
        Restriction restriction = (Restriction)objects[2];
  
        switch (restriction) {
  
            case LIKE:
  
            case LLIKE:
  
            case RLIKE:
  
                sb.append(andOr.toMatchString(key, "like :" + key));
  
                attrs.put(key, restriction.toMatchString(objects[0].toString()));
  
                break;
  
            case NULL:
  
            case NOTNULL:
  
                sb.append(andOr.toMatchString("", restriction.toMatchString(key)));
  
                break;
  
            case BETWEEN:
  
                sb.append(andOr.toMatchString(key, restriction.toMatchString(key)));
  
                Object[] value = (Object[]) objects[0];
  
                attrs.put(String.format("%s1", key),  value[0]);
  
                attrs.put(String.format("%s2", key),  value[1]);
  
                break;
  
            default:
  
                sb.append(andOr.toMatchString(key, restriction.toMatchString(key)));
  
                attrs.put(key, objects[0]);
  
        }
  
    }
  

  
    @Override
  
    public String toFormatSQL() {
  
        return  toFormatSQL(toSQL(), attrs, paras);
  
    }
  

  
    /**
  
     * @param whereSQL
  
     * @param attrs
  
     * @param values
  
     * @return
  
     */
  
    public static String toFormatSQL(String whereSQL, Map attrs, List values) {
  
        Matcher matcher = Pattern.compile(":(\\w+)").matcher(whereSQL);
  
        String rexp = null;
  
        while (matcher.find()) {
  
            String group = matcher.group(1);
  
            Object ov = attrs.get(group);
  
            if (ov instanceof List) {
  
                StringBuilder sb = new StringBuilder();
  
                List vs = (List) ov;
  
                for (Object v : vs) {
  
                    sb.append("?,");
  
                    values.add(v);
  
                }
  
                sb.deleteCharAt(sb.length() - 1);
  
                rexp = sb.toString();
  

  
            } else {
  
                values.add(ov);
  
                rexp = "?";
  
            }
  
            whereSQL = whereSQL.replace(String.format(":%s", group), rexp);
  
        }
  
        return whereSQL;
  
    }
  

  
    @Override
  
    public String toString() {
  
        return toFormatSQL();
  
    }
  

  
    public static void main(String[] args) {
  
        Calendar c = new GregorianCalendar();
  

  
        Where where = new Where("name", "张三");
  
        where.or("class", 2);
  
        where.and("sex", true);
  
        where.and("age", new Integer[]{1,10}, Restriction.BETWEEN);
  
        List ids = new ArrayList();
  
        ids.add(4);
  
        ids.add(3);
  
        where.and("id", ids, Restriction.IN);
  
        System.out.println(where.toString());
  

  
        for (Object value :where.getParas())
  
        {
  
            System.out.print(String.format("%s ", value));
  
        }
  

  

  

  
    }
  
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-624950-1-1.html 上篇帖子: SQL 复制和均衡使用 下篇帖子: apache-httpd-server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表