工作需要,写了一个实现数据库多字段模糊查询的方法,背景是输入用户的信息,如用户的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实现的更多相关文章

  1. 某表含有N个字段超精简模糊查询方法

    我们在做多个字段模糊查询时,是不是觉得非常麻烦?比如我要模糊查询某表多个字段存在某数据时,如下 select * from table where a like '%key%' or b  like ...

  2. MySQL数据库一个字段对应多个值得模糊查询和多个字段对应一个模糊查询

    当一个字段想模糊查询出多个字段的时候,正常情况下一般会这么作 1 select * from a where name like 'a%' or name like 'b%' ....or ...; ...

  3. 【摘录】某表含有N个字段超精简模糊查询方法

    SELECT * FROM  table where CONCAT(a,b,c......) like '%key%' select name from syscolumns where id=obj ...

  4. Mybatis mysql 一个搜索框多个字段模糊查询 几种方法

    第一种 or 根据搜索框给定的关键词,模糊搜索用户名和账号都匹配的用户集合 <select id="list" parameterType="com.user.Us ...

  5. Mysql多字段模糊查询

    MySQL同一字段多值模糊查询 一. 同一字段多值模糊查询,使用多个or进行链接,效率不高,但没有更好的解决方案.(有看到CHARINDEX 关键字,可查询结果并不是模糊,举个栗子 例如SELECT ...

  6. 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询

    前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...

  7. Oracle 表分组 group by和模糊查询like

    分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...

  8. JEECG中的模糊查询

    以一个使用代码生成器创建的通讯录(maillist)为例: @RequestMapping(params = "datagrid") public void datagrid(Ma ...

  9. java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询

    1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...

随机推荐

  1. 【转】每天一个linux命令目录

    原文网址:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列 ...

  2. 【转】解决Win7字体模糊不清晰的最佳办法

    原文网址:http://blog.sina.com.cn/s/blog_3d5f68cd0100ldtp.html 相信初次用win7的朋友,都会遇到字体不清晰的问题,有很多人因为这个问题而放弃使用w ...

  3. ORACLE数据导入导出后新数据库中某些表添加操作报错[ORA-12899]

    由于项目需要,我在搭建了新的开发环境后,需要将之前环境中的ORACLE数据库导出,再导入到新的开发环境下.当导出导入完成后,使用数据库进行添加操作时 发现针对很多表的添加操作报错,具体报错原因描述为: ...

  4. 阿里巴巴Java开发手册- 控制语句

    1. [强制]在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止 : 在一个 switch 块内,都必须包 ...

  5. 【python】class之super关键字的作用

    在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self):    prin ...

  6. mysqldump的single-transaction

    先看一下--lock-tables和--lock-all-tables --lock-all-tables 一次性锁定所有数据库的所有表,在整个dump期间一直获取global read lock: ...

  7. 【Spring学习笔记-MVC-16】Spring MVC之重定向-解决中文乱码

    概述 spring MVC框架controller间跳转,需重定向,主要有如下三种: 不带参数跳转:形如:http://localhost:8080/SpringMVCTest/test/myRedi ...

  8. Mybatis学习(1)

    一.原生态jdbc程序存在的问题: mybatis框架原理.执行过程: 二.入门程序 完成入门程序的以下需求: 1.根据用户id(主键)查询用户信息: 2.根据用户名称模糊查询用户信息: 3.添加用户 ...

  9. appium+python自动化42-微信公众号

    前言 本篇介绍如何在微信公众号上自动化测试,以操作我的个人公众号:yoyoketang为例,没关注的,先微信关注了,再跟着操作 环境准备: python 3.6 appium 1.7以上版本 微信6. ...

  10. 13.MD5对用户密码进行加密

    MD5概述 用户名密码保存在客户端是一种十分危险的行为.所以需要进行加密后保存. 其中MD5就是一种比较常用的加密算法. 与其说MD5算法是一种加密算法,不如说是一种数据指纹(数据摘要)算法. 其特点 ...