对sql查询语句组合查询的通用实现算法(c++版,java版)

简介:
 现在我们做的大型项目大多要与关系型数据库进行交互,不知道大家有没有遇到这样的问题,组合查询,两个条件A,B,组合情况有A,B,AB,也就三种,写死SQL语句也不麻烦,不就是几个if,else吗!但是要是有三个条件组合呢?A,B,C,这样就会有A,B,C,AB,AC....这要n个if,else吧.
ok,下面我们写个通用算法解决以上问题
首先C++版
 
 
  1. // 查询条件结构 
  2. struct SelCondition 
  3.     string  m_strValueFirst; 
  4.     string  m_strValueSecond; 
  5.     enum ConditionType {CT_EQUAL = 1, CT_NOT_EQUAL, CT_ABOVE, CT_BELOW, CT_FUZZY,CT_AREA,CT_GROUP} m_conType; 
  6.  
  7. //针对范围
  8.     SelCondition(string valueFirst,string   valueSecond, SelCondition::ConditionType conType) 
  9.     { 
  10.         m_strValueFirst = valueFirst; 
  11.         m_strValueSecond=valueSecond; 
  12.         m_conType = conType; 
  13.     } 
  14. //针对一个条件
  15.     SelCondition(string valueFirst, SelCondition::ConditionType conType) 
  16.     { 
  17.         m_strValueFirst = valueFirst; 
  18.         m_conType = conType; 
  19.     } 
  20.     SelCondition(string valueFirst) 
  21.     { 
  22.         m_strValueFirst = valueFirst; 
  23.     } 
  24.     SelCondition(){}; 
  25. }; 
  26.  
 
  1. // 返回不带 where 的条件语句,并且是以 and 开头,例如 and id>8 and name=aiht 
  2. string DbOpBase::AssembleCondition(const map<string, SelCondition> &mapConditions) 
  3.     string  strCondition=""
  4.      
  5.     typedef map<string, SelCondition>::const_iterator CI; 
  6.     for(CI p=mapConditions.begin(); p!=mapConditions.end(); ++p) 
  7.     { 
  8.         string strCmd; 
  9.         string colName = p->first; 
  10.         // TODO 判断列名是否是"" 
  11. //进行查询类型的判定拼装相应条件
  1.         switch(p->second.m_conType) 
  2.         { 
  3.         case SelCondition::CT_ABOVE: 
  4.             strCmd = _T(" AND ") + colName + _T(" > '") + p->second.m_strValueFirst + _T("'"); 
  5.             break
  6.         case SelCondition::CT_BELOW: 
  7.             strCmd = _T(" AND ") + colName + _T(" < '") + p->second.m_strValueFirst + _T("'"); 
  8.             break
  9.         case SelCondition::CT_EQUAL: 
  10.             strCmd = _T(" AND ") + colName + _T(" = '") + p->second.m_strValueFirst + _T("'"); 
  11.             break
  12.         case SelCondition::CT_NOT_EQUAL: 
  13.             strCmd = _T(" AND ") + colName + _T(" != '") + p->second.m_strValueFirst + _T("'"); 
  14.             break
  15.         case SelCondition::CT_FUZZY: 
  16.             strCmd =_T(" AND ") + colName + _T(" like '%") + p->second.m_strValueFirst +_T("%'"); 
  17.             break
  18.         case SelCondition::CT_AREA: 
  19.             strCmd =_T(" AND ") + colName + _T(" BETWEEN '") + p->second.m_strValueFirst +_T("' AND '")+p->second.m_strValueSecond+_T("'"); 
  20.             break
  21.         case SelCondition::CT_GROUP: 
  22.             strCmd=_T(" group by StartTime "); 
  23.             break
  24.         default
  25.             ; 
  26.  
  27.         } 
  28.         strCondition += strCmd; 
  29.     } 
  30.     return strCondition;     
来看看java版,其中带有自己所做项目的一些字段和逻辑,请见谅
 
 
  1. public class HostSearchCondition  
  2.     //构造数据库的查询条件(=,%,between) 
  3.     public static final int CT_EQUAL = 0
  4.     public static final int CT_LIKE = 1
  5.     public static final int CT_AREA = 2
  6.  
  7.     // 界面向数据库操作类传值——结构 
  8.     public static class SelCondition 
  9.     { 
  10.             String  m_strValueFirst; 
  11.             String  m_strValueSecond; 
  12.             int m_conType; 
  13.  
  14.             public SelCondition(String valueFirst,String valueSecond, int conType) 
  15.             { 
  16.                     this.m_strValueFirst = valueFirst; 
  17.                     this.m_strValueSecond=valueSecond; 
  18.                     this.m_conType = conType; 
  19.             } 
  20.             public SelCondition(String valueFirst, int conType) 
  21.             { 
  22.                     this.m_strValueFirst = valueFirst; 
  23.                     this.m_conType = conType; 
  24.             } 
  25.             public SelCondition(String valueFirst) 
  26.             { 
  27.                     this.m_strValueFirst = valueFirst; 
  28.             } 
  29.             public SelCondition(){}; 
  30.     }; 
  31.      
  32.      
  33.     static HashMap<String, SelCondition> sqlmap = new HashMap<String, SelCondition>(); 
  34.  
  35.     /** 
  36.      *把组合查询条件传入map 
  37.      * @param 接收的组合查询条件 
  38.      */ 
  39.     public  static HashMap<String, SelCondition> Condition(HostBasicInfo condition) 
  40.     { 
  41.         sqlmap.clear(); 
  42.         SelCondition  selcon; 
  43.         if(condition.getSName().length()!= 0
  44.         { 
  45.             selcon = new SelCondition(condition.getSName(), CT_EQUAL); 
  46.             sqlmap.put("sName", selcon); 
  47.         } 
  48.          
  49.         if(condition.getSCharacterCode().length()!= 0
  50.         { 
  51.             selcon = new SelCondition(condition.getSName(), CT_LIKE); 
  52.             sqlmap.put("sCharacterCode", selcon); 
  53.         } 
  54.          
  55.         if(condition.getNHostType().length()!= 0
  56.         { 
  57.             selcon = new SelCondition(condition.getNHostType(), CT_EQUAL); 
  58.             sqlmap.put("nHostType", selcon); 
  59.         } 
  60.          
  61.         if(condition.getESecLevel().length()!= 0
  62.         { 
  63.             selcon = new SelCondition(condition.getESecLevel(), CT_EQUAL); 
  64.             sqlmap.put("eSecLevel", selcon); 
  65.         } 
  66.         return sqlmap; 
  67.     } 
  68.      
  69.     /** 
  70.      *构造数据库where后的查询条件 
  71.      * @param 组合查询条件map 
  72.      */ 
  73.      @SuppressWarnings("unchecked"
  74.     public static String AssembleCondition(Map<String, SelCondition> mapConditions) 
  75.      { 
  76.          String strCondition=""
  77.          Iterator<?> iter = mapConditions.entrySet().iterator(); 
  78.          while (iter.hasNext()) 
  79.          { 
  80.                 String strCmd = null
  81.                 Map.Entry entry = (Map.Entry) iter.next(); String key = (String)entry.getKey(); 
  82.                 String colName = key;            
  83.                 SelCondition value = (SelCondition)entry.getValue(); 
  84.  
  85.                 switch(value.m_conType) 
  86.                 { 
  87.                     case CT_EQUAL: 
  88.                          strCmd = " AND Tbl_Host_BasicInfo."+ colName + " = '" + value.m_strValueFirst + "'"
  89.                          break
  90.                     case CT_LIKE: 
  91.                          strCmd =" AND Tbl_Host_BasicInfo." + colName + " like '%" + value.m_strValueFirst +"%'"
  92.                          break
  93.                     case CT_AREA: 
  94.                          strCmd ="  " + colName + " BETWEEN '"+ value.m_strValueFirst +"' AND '"+ value.m_strValueSecond+"'"
  95.                          break
  96.                     default
  97.                          ; 
  98.                 } 
  99.                 strCondition = strCondition + strCmd; 
  100.           } 
  101.           return strCondition; 
  102.      } 
 本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/581843如需转载请自行联系原作者

yaocoder
相关文章
|
9天前
|
SQL 存储 算法
sql server加密算法加盐
通过在 SQL Server 中结合使用加盐和哈希,可以有效地增强密码的安全性。本文详细介绍了在 SQL Server 中如何实现密码加盐和哈希的步骤,以及相关的完整示例和注意事项。希望本文能帮助读者更好地理解和应用加密技术,提升数据库系统的安
20 3
|
8天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
15 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
58 17
|
2月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
134 6
|
2月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
397 11
|
2月前
|
SQL Java 数据库连接
如何用 Java 校验 SQL 语句的合法性?
本文介绍了五种校验 SQL 语句合法性的方案:1) 使用 JDBC API 的 `execute()` 方法,通过捕获异常判断合法性;2) 使用 JSqlParser 库解析 SQL 语句为 Java 对象;3) 使用正则表达式检查 SQL 语句格式;4) 使用 ANTLR 生成 SQL 解析器;5) 使用 Apache Calcite 解析 SQL。每种方法各有优劣,具体选择取决于需求和个人偏好。需要注意的是,这些方法仅能校验语法合法性,无法保证语义正确性,仍需防范 SQL 注入攻击。
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
55 2
|
3月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
3月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
129 9