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

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

[复制链接]

尚未签到

发表于 2018-10-22 12:10:57 | 显示全部楼层 |阅读模式
package net.zz.zjf.plugin;  
import java.util.*;
  
import java.util.regex.Matcher;
  
import java.util.regex.Pattern;
  
/**
  
* Created by ZaoSheng on 2015/7/15.
  
*/
  
public class QueryParams {
  
    private Integer pageIndex = 1;
  
    private Integer pageSize = 10;
  
    private List groups = new ArrayList();
  
    private Map likes = new HashMap();
  
    private Map orders = new HashMap();
  
    private Map ins = new HashMap();
  
    protected String sql = " where 1=1 ";
  
    private Map value = new HashMap();
  
    private List paras = new ArrayList();
  
//    private Map mutValues = new HashMap();
  
    public void addOrder(String key, OrderAD ad) {
  
        orders.put(key, ad.name());
  
    }
  
    public void addOrder(String key) {
  
        orders.put(key, OrderAD.DESC.name());
  
    }
  
    public enum OrderAD {
  
        DESC, ASC
  
    }
  
    public Map getSqlLikes() {
  
        return likes;
  
    }
  
    public QueryParams addGroup(String group) {
  
        this.groups.add(group);
  
        return this;
  
    }
  
    public QueryParams addIn(String propertyName, List values) {
  
        if (null != values && values.size() > 0) {
  
            ins.put(propertyName, values);
  
        }
  
        return this;
  
    }
  
    public Map getLikes() {
  
        return likes;
  
    }
  
    public Map getIns() {
  
        return ins;
  
    }
  
    public List getParas() {
  
        return paras;
  
    }
  
    public QueryParams like(String propertyName, String value, MatchMode matchMode) {
  
        this.likes.put(propertyName, matchMode.toMatchString(value));
  
        return this;
  
    }
  
    public QueryParams like(String propertyName, String value) {
  
        like(propertyName, value, MatchMode.ANYWHERE);
  
        return this;
  
    }
  
    public List getGroups() {
  
        return groups;
  
    }
  
    private String prefix(String prefix) {
  
        if (prefix != null && !"".equals(prefix.trim())) {
  
            return prefix += ".";
  
        }
  
        return "m.";
  
    }
  
    public String toGroupSQL(String prefix) {
  
        prefix = prefix(prefix);
  
        if (groups != null && groups.size() >= 1) {
  
            StringBuilder g = new StringBuilder();
  
            for (String group : groups) {
  
                g.append(prefix).append(group).append(", ");
  
            }
  
            g.deleteCharAt(g.length() - 2);
  
            return String.format(" GROUP BY %s ", g.toString());
  
        }
  
        return "";
  
    }
  
    public String toLikeSQL(String prefix) {
  
        prefix = prefix(prefix);
  
        if (likes != null && !likes.isEmpty()) {
  
            StringBuilder g = new StringBuilder();
  
            for (String like : likes.keySet()) {
  
                String _sql = " and  %s%s like :%s ";
  
                g.append(String.format(_sql, prefix, like, like));
  
            }
  
            return g.toString();
  
        }
  
        return "";
  
    }
  
    public String toInSQL(String prefix) {
  
        prefix = prefix(prefix);
  
        if (ins != null && !ins.isEmpty()) {
  
            StringBuilder g = new StringBuilder();
  
            for (String in : ins.keySet()) {
  
                String _sql = " and  %s%s in( :%s )";
  
                g.append(String.format(_sql, prefix, in, in));
  
            }
  
            return g.toString();
  
        }
  
        return "";
  
    }
  
    public Integer getPageIndex() {
  
        return pageIndex;
  
    }
  
    public void setPageIndex(Integer pageIndex) {
  
        this.pageIndex = pageIndex;
  
    }
  
    public Integer getPageSize() {
  
        return pageSize;
  
    }
  
    public void setPageSize(Integer pageSize) {
  
        this.pageSize = pageSize;
  
    }
  
    public QueryParams add(String key, Object _value) {
  
        if (_value == null) {
  
            value.remove(key);
  
        } else {
  
            value.put(key, _value);
  
        }
  
        return this;
  
    }
  
    public Map getSqlValue() {
  
        return value;
  
    }
  
    public String toOrderSQL() {
  
        return toOrderSQL("");
  
    }
  
    public String toOrderSQL(String prefix) {
  
        prefix = prefix(prefix);
  
        if (!orders.isEmpty()) {
  
            StringBuffer sb = new StringBuffer();
  
            sb.append("Order BY ");
  
            for (String order : orders.keySet()) {
  
                System.out.println( orders.get(order));
  
                sb.append(String.format("  %s%s %s, ", prefix, order, orders.get(order)));
  
            }
  
            sb.deleteCharAt(sb.length() - 2);
  
            return sb.toString();
  
        }
  
        return "";
  
    }
  
    public String toWhereSQL() {
  
        return toWhereSQL("");
  
    }
  
    public String toWhereSQL(String prefix) {
  
        prefix = prefix(prefix);
  
        String _sql = " and %s%s = :%s ";
  
        Set keys = value.keySet();
  
        Map _value = new HashMap();
  
        StringBuffer sb = new StringBuffer();
  
        sb.append(sql);
  
        for (String key : keys) {
  
            String filterDotKey = key.replaceAll("\\.", "_");
  
            //    String filterDotKey = key;
  
            _value.put(filterDotKey, value.get(key));
  
            sb.append(String.format(_sql, prefix, key, filterDotKey));
  
        }
  
        this.value = _value;
  
        return sb.toString();
  
    }
  
    public String toFormatSQL(String hsql) {
  
        Matcher matcher = Pattern.compile(":(\\w+)").matcher(hsql);
  
       while ( matcher.find()){
  
            String rexp = null;
  
           String group = matcher.group(1);
  
           Object ov = value.get(group);
  
           if (ov instanceof List)
  
           {
  
               StringBuilder sb = new StringBuilder();
  
               List vs = (List) ov;
  
               for (Object v : vs)
  
               {
  
                   sb.append("?,");
  
                   paras.add(v);
  
               }
  
               sb.deleteCharAt(sb.length() - 1);
  
               rexp = sb.toString();
  
           }else
  
           {
  
               paras.add(ov);
  
               rexp = "?";
  
           }
  
           hsql = hsql.replace(String.format(":%s", group), rexp);
  
       }
  
        return hsql;
  
    }
  
    public String toSqlExceptSelect(String tableName, String prefix ) {
  
        String hsql = " from " + tableName +  "  " + prefix + toWhereSQL(prefix) + toInSQL(prefix) + toLikeSQL(prefix) + toGroupSQL(prefix) + toOrderSQL(prefix);
  
        getSqlValue().putAll(getSqlLikes());
  
        getSqlValue().putAll(getIns());
  
        return toFormatSQL(hsql);
  
    }
  
    public static void main(String[] args) {
  
        QueryParams params = new QueryParams();
  
        params.add("id", 1);
  
        params.addGroup("cc");
  
        List names = new ArrayList();
  
        names.add("张三");
  
        names.add("李四");
  
        params.addIn("name", names);
  
        params.like("nick", "张");
  
        params.addOrder("time");
  
        String hsql = " from  user"  +  " t " + params.toWhereSQL("t") + params.toInSQL("t") + params.toLikeSQL("t") + params.toGroupSQL("t") + params.toOrderSQL("t");
  
        System.out.println("hsql:" + hsql);
  
        params.getSqlValue().putAll(params.getSqlLikes());
  
        params.getSqlValue().putAll(params.getIns());
  
        String sql = params.toFormatSQL(hsql);
  
//        System.out.println("sql:" + sql);
  
        params.atts(params.getParas().toArray());
  
    }
  
    public void atts(Object ... os)
  
    {
  
        System.out.println("参数:");
  
        for (Object o : os)
  
        {
  
            System.out.print(o);
  
            System.out.print(",");
  
        }
  
    }
  
}



运维网声明 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-624968-1-1.html 上篇帖子: 两个sql查询语句之间的左连接left join 下篇帖子: MySQLdb 防SQL注入,同时打印已执行的SQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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