多字段非连续模糊查询java实现
工作需要,写了一个实现数据库多字段模糊查询的方法,背景是输入用户的信息,如用户的userid,姓名,拼音等,可以查出相关的用户
具体如下
1. 操作一张表,可以设置表前缀
2. 可以实现中文的不连续查询(如通过输入中国可以查出中华人民共和国)
3. 可以实现以输入文字开头的字段的查询
4. 可以实现包含输入文字的字段的查询
5. 可以自定义是否加and前缀
6. 可以实现大小写不敏感的查询
7. 可以实现预编译的查询语句
不多说,上代码
/**
* 构建一个不连续文字的模糊查询语句:如通过手资可以查到手术资料
* @param searchStr 检索字符串
* @param tabPrefix 表前缀
* @param likeFields 比较字段
* @param preAnd 是否在语句前加and
* @param chineseDisContinuousSearch 检索内容含中文才进行不连续查询,否则进行连续查询
* @param startMatch 检索是否从字段开头进行匹配
* @param isPreparedStatement 是否是预编译语句(将参数用?代替)
* @return
*/
public static String buildProFuzzySearch(String searchStr, String tabPrefix, String[] likeFields,
boolean preAnd, boolean chineseDisContinuousSearch, boolean startMatch, boolean isPreparedStatement)
{ StringBuilder result = new StringBuilder();
StringBuilder tempBuilder = new StringBuilder();
if(StringUtils.isNotEmpty(searchStr) && null != likeFields && likeFields.length > 0)
{
if(preAnd)
{
result.append("and ");
} result.append("(");
searchStr = searchStr.toUpperCase(); if(!chineseDisContinuousSearch || !isContainChinese(searchStr))//chineseDisContinuousSearch为false或者不包含中文(连续查询)
{
for(int i = 0, length = likeFields.length; i < length; i++)
{
if(tempBuilder.length() > 0)
{
tempBuilder.append("or ");
} tempBuilder.append("UPPER("); if(StringUtils.isNotEmpty(tabPrefix))
{
tempBuilder.append(tabPrefix).append(".");
} tempBuilder.append(likeFields[i]).append(") ").append("like ");
if(isPreparedStatement)
{
tempBuilder.append("? ");
}
else
{
if(startMatch)
{
tempBuilder.append("'");
}
else
{
tempBuilder.append("'%");
}
tempBuilder.append(searchStr).append("%' ");
}
}
}
else//chineseDisContinuousSearch为ture且包含中文时(不连续查询)
{
for(int i = 0, length = likeFields.length; i < length; i++)
{
if(tempBuilder.length() > 0)
{
tempBuilder.append("or ");
} tempBuilder.append("UPPER("); if(StringUtils.isNotEmpty(tabPrefix))
{
tempBuilder.append(tabPrefix).append(".");
} tempBuilder.append(likeFields[i]).append(") ").append("like ");
if(isPreparedStatement)
{
tempBuilder.append("? ");
}
else
{
char[] searchChars = searchStr.toCharArray();
tempBuilder.append("'%");
for(int j = 0, charLength = searchChars.length; j < charLength; j++)
{
tempBuilder.append(String.valueOf(searchChars[j])).append("%");
}
tempBuilder.append("' ");
}
}
} result.append(tempBuilder.toString());
result.append(")");
} return result.toString();
} public static boolean isContainChinese(String str) {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(str);
return m.find();
}
下面看一下测试效果
测试代码:
public static void main(String[] args) {
String searchStr = "张三";
String tabPrefix = "user";
String[] likeFields = {"userID", "userName", "PY"};
System.out.println("中文不连续检索,不加and前缀,非预编译形式:");
System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, false, true, false, false));
System.out.println("连续检索,不加and前缀,非预编译形式,非开头匹配:");
System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, false, false, false, false));
System.out.println("连续检索,加and前缀,非预编译形式,开头匹配:");
System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, true, false, true, false));
System.out.println("加and前缀,预编译形式:");
System.out.println(buildProFuzzySearch(searchStr, tabPrefix, likeFields, true, false, true, true));
System.out.println("中文不连续检索,不加表前缀,加and前缀,非预编译形式:");
System.out.println(buildProFuzzySearch(searchStr, null, likeFields, true, true, true, false));
}
测试结果:

要说明的是,有些参数会覆盖其它参数的效果,如设置最后一个参数为true,预编译形式,那么开头匹配,连续匹配,中文不连续匹配均失效;如果为中文不连续匹配,且检索字符串中含中文,那么开头匹配,预编译参数失效等。
有类似需求的可以修改上面的代码以满足自己的实际需要,代码没有什么难的,只是在做一个功能的时候就想把类似可以会用到的情况都考虑一下,方便下次使用,或者下次只要在原有的基础上进行少量的修改,提高开发效率,同时养成一个举一反三,多方面考虑的好习惯。
多字段非连续模糊查询java实现的更多相关文章
- 某表含有N个字段超精简模糊查询方法
我们在做多个字段模糊查询时,是不是觉得非常麻烦?比如我要模糊查询某表多个字段存在某数据时,如下 select * from table where a like '%key%' or b like ...
- MySQL数据库一个字段对应多个值得模糊查询和多个字段对应一个模糊查询
当一个字段想模糊查询出多个字段的时候,正常情况下一般会这么作 1 select * from a where name like 'a%' or name like 'b%' ....or ...; ...
- 【摘录】某表含有N个字段超精简模糊查询方法
SELECT * FROM table where CONCAT(a,b,c......) like '%key%' select name from syscolumns where id=obj ...
- Mybatis mysql 一个搜索框多个字段模糊查询 几种方法
第一种 or 根据搜索框给定的关键词,模糊搜索用户名和账号都匹配的用户集合 <select id="list" parameterType="com.user.Us ...
- Mysql多字段模糊查询
MySQL同一字段多值模糊查询 一. 同一字段多值模糊查询,使用多个or进行链接,效率不高,但没有更好的解决方案.(有看到CHARINDEX 关键字,可查询结果并不是模糊,举个栗子 例如SELECT ...
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...
- Oracle 表分组 group by和模糊查询like
分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...
- JEECG中的模糊查询
以一个使用代码生成器创建的通讯录(maillist)为例: @RequestMapping(params = "datagrid") public void datagrid(Ma ...
- java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...
随机推荐
- 记录 ThinkPHP 5.* 漏洞修复后的情况
记录 ThinkPHP 5.* 漏洞修复后的情况 ThinkPHP 官方 2018-12-09 下午收到漏洞报告. 2018-12-09 晚上看到 Git 已经更新了,修复了漏洞. 2018-12-1 ...
- Huawei E1750 Asterisk
http://wiki.e1550.mobi/doku.php?id=installation https://wiki.asterisk.org/wiki/display/AST/Mobile+Ch ...
- Oracle 表空间与数据文件
-============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...
- centos7虚拟机安装出现license information
问题:vm 10下安装CentOs7后无法启动.出现一个license information页面 解决办法:出现license information,即说明需要同意许可信息,输入1-回车-2-回车 ...
- 【python】实例-读取已有文件的内容
import os Filename=raw_input("please input filename that you will open: ") if os.path.exis ...
- windows下使用vscode编写运行以及调试Python
更新于2018年10月: 首先去python官网下载python3 地址:https://www.python.org/downloads/windows/ 下载好后直接安装 记得勾选添加环境变量 ...
- wxWidgets:给窗口添加工具条
请先看上一篇<wxWidgets入门>. 修改MyFrame.h: #ifndef MYFRAME_H #define MYFRAME_H #include <wx/wxprec.h ...
- BASIC-27_蓝桥杯_2n皇后问题
题目: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一 ...
- BASIC-9_蓝桥杯_特殊回文数
示例代码: #include <stdio.h> int main(void){ int n = 0 ; scanf("%d",&n); int i = 0 ; ...
- 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat
作者:ssslinppp 1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...