多字段非连续模糊查询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 ...
随机推荐
- JAVA关闭钩子
JAVA的关闭钩子: 1. 一般应用程序在关闭时都需要做一些善后清理工作,但是用户并不会总是按照推荐的方法关闭应用程序,比如用户直接关闭控制台程序或者按下Ctrl+C结束应用程序,这样就导致清理工作得 ...
- 【转】Ubuntu12.04 LTS下环境变量设置
原文网址:http://blog.chinaunix.net/uid-26963688-id-3221439.html 1.设置当前用户环境变量(对root用户无效) 打开终端输入:light@cha ...
- 【转】每天一个linux命令(54):ping命令
原文网址:http://www.cnblogs.com/peida/archive/2013/03/06/2945407.html Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主 ...
- Spring Cloud 入门 之 Feign 篇(三)
原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...
- Angular 4 路由时传递数据
路由时传递数据的方式有 1. 在查询参数中传递数据 2. 在路由路径中传递参数 3. 在路由配置中传递参数 一.在查询参数中传递数据 在前一节的基础上,我们增加路由数据传递 2. 接收参数的地方 3. ...
- each与list的用法(PHP学习)
1.each的用法 先看API array each ( array &$array ) api里是这么描述的:each — 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回 ...
- IE11 FOR WIN7 32 装的补丁
- FPGA该如何应对ASIC的大爆发?
有人认为,除了人才短缺.开发难度较大,相比未来的批量化量产的ASIC芯片,FPGA在成本.性能.功耗方面仍有很多不足.这是否意味着,在ASIC大爆发之际,FPGA将沦为其“过渡”品的命运? 安路科技市 ...
- BASIC-21_蓝桥杯_Sine之舞
思路: 先根据例子找出规律,列出递归要打印的数据; 示例代码: #include <stdio.h> int n = 0; void dg(int x){ int i = 0; if (x ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...