多字段非连续模糊查询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 ...
随机推荐
- azkaban:java任务调度系统
github:https://github.com/azkaban/azkaban 官方网站:https://azkaban.github.io/ 好的介绍文章:http://srcct.com/20 ...
- Django的 admin管理工具
admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...
- WPF Demo10 嵌套Winform、RadGridView、
<Window x:Class="控件Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006 ...
- 小峰mybatis(3)mybatis分页和缓存
一.mybatis分页-逻辑分页和物理分页: 逻辑分页: mybatis内置的分页是逻辑分页:数据库里有100条数据,要每页显示10条,mybatis先把100条数据取出来,放到内存里,从内存里取10 ...
- java web程序 上机考试做一个登陆注册程序
大二期末 java web.用到数据库,jdbc.myeclipse实现用户的注册,登陆 并且不能出现500错误,用户不能重复注册.当用户任意点击时也不能出现500错误! 这里.我只写注册成功的页面. ...
- commons.httpclient-3.X.jar 和 httpclient-4.x.jar是个什么关系?
最近看项目的代码,看到工程中有两个jar包张的很像,一个是commons.httpclient-3.1.jar,一个是httpclient4.2.1.jar,很纳闷,而且这两个包里都有HttpClie ...
- Java中的volatile关键字为什么不是不具有原子性
Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volat ...
- pig入门案例
测试数据位于:/home/hadoop/luogankun/workspace/sync_data/pigperson.txt中的数据以逗号分隔 ,zhangsan, ,lisi, ,wangwu, ...
- HFDS核心技术
HDFS 设计的前提与目标 HDFS体系结构1 HDFS体系结构2 HDFS特性与优点 高容错性保障机制 HDFS不适合的场景 HDFS2.0的新特征 HA-QJM Federation 快照 异构层 ...
- socket.io带中文时客户端无法响应
记录坑了自己1个多小时的问题. 情况是: 服务端代码: var a = {username: new Date()}; socket.emit('updatePositionInfo',a); 前端代 ...