文档章节

sqlCondition where条件生成器 主要用于表格筛选

十一11
 十一11
发布于 2015/11/27 21:35
字数 661
阅读 23
收藏 0
package com.yiyikefu.sqlconditionkit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 
 * Title: SqlCondition.java<br />
 * Description: sqlWhere条件生成器<br />
 * Company: www.yiyikefu.com<br />
 * 
 * @author xsy 906726786@qq.com
 * @date 2015年11月27日 下午10:10:36
 * @version 1.0 <br>
 */
public class SqlCondition {
	public static final int FUZZY_FULL = 1 << 0; // 1:为模糊匹配 %xxx%
	public static final int FUZZY_LEFT = 1 << 1; // 2:为左模糊 %xxx
	public static final int FUZZY_RIGHT = 1 << 2;// 4:为右模糊 xxx%
	public static final int FUZZY_NO = 1 << 3; // 8:为不模糊 xxx
	private List<Object> values = null;// sql中?(变量)代表的值
	public List<Object> getValues() {
		return values;
	}
	/**
	 * 
	 * TODO 查询条件 xsy
	 * 
	 * @param rec
	 *            键值对:键是字段名,值是相应的值
	 * @param sqlMap
	 *            键值对:键代表字段名,值是相应的语句和查询类型
	 * @return
	 */
	public StringBuilder buildSqlWhere(Map<String, Object> rec, Map<String, Pair> sqlMap) {
		StringBuilder sql_where = new StringBuilder();// 初始化sql语句where部分
		if (rec != null) {
			Set<String> attrNameSet = rec.keySet();
			String[] names = attrNameSet.toArray(new String[attrNameSet.size()]);
			List<Object> values = new ArrayList<Object>();// 初始化,代表的值列表
			for (int i = 0; i < names.length; i++) {
				String name = names[i];
				Object _value = rec.get(name);// 获取字段名所代表的值
				if (null == _value || "" == _value.toString()) {
					continue;// 如果为null,退出本次循环。
				}
				Pair pair = sqlMap.get(name);// 获取key对应的value值
				if (pair == null) {// 值不存在,则抛异常
					throw new NullPointerException("输入的字段对应的value不存在:" + name);
				}
				String sql = pair.sql;
				if (sql == null) {
					throw new NullPointerException("conditions条件中sql语句未传入:" + name);
				}
				if (i == 0 && sql.toLowerCase().indexOf("where") == -1 && sql.toLowerCase().indexOf("and") != -1) {
					sql = sql.toLowerCase().replaceFirst("and", "WHERE");
				}
				int queryType = pair.queryType;// 模糊类型
				if (queryType == FUZZY_NO) {
					sql_where.append(" " + sql + "  ");
					values.add(_value);
				} else {
					sql_where.append(" " + sql + "  ");
					values.add(setQueryType(_value, queryType));
				}
			}
			this.values = values;
		}
		return sql_where;
	}
	/**
	 * 
	 * TODO 根据查询类型加参数值
	 *
	 * xsy
	 * 
	 * @param queryType
	 *            查询类型
	 * @param value
	 *            参数值
	 */
	public static String setQueryType(Object value, int queryType) {
		if (FUZZY_FULL == queryType) {
			return "%" + value + "%";
		} else if (FUZZY_LEFT == queryType) {
			return "%" + value;
		} else if (FUZZY_RIGHT == queryType) {
			return value + "%";
		} else {
			return value.toString();
		}
	}
	public static class Pair {
		public String sql = null;
		public int queryType = FUZZY_NO;
		public Pair(String sql) {
			this.sql = sql;
		}
		public Pair(String sql, int queryType) {
			this.sql = sql;
			this.queryType = queryType;
		}
	}
	/**
	 * 
	 * xsy<br />
	 * Description:SqlCondition测试 <br />
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 筛选条件 放进null 或者"" 该条件不起作用
		Map<String, Object> rec = new HashMap<>();
		rec.put("hobby", null);// 该条件不起作用 不管男女
		rec.put("grade", "");// 该条件不起作用 不管成绩
		rec.put("name", "张三");// 筛选名字叫张三
		rec.put("sex", 0);// 同时筛选性别为男的
		List<Object> values = new ArrayList<Object>();
		SqlCondition conditions = new SqlCondition();
		Map<String, Pair> sqlMap = new HashMap<String, Pair>();
		sqlMap.put("sex", new Pair("AND hosp_id like ?"));// 测试成功
		sqlMap.put("hcheck_code", new Pair("AND hcheck_code like ?", SqlCondition.FUZZY_RIGHT));// 模糊筛选
		StringBuilder sqlWhere = conditions.buildSqlWhere(rec, sqlMap);
		values = conditions.getValues();
		System.out.println(sqlWhere);
		System.out.println(values);
		// values.toArray() 变量值的数组
		// 使用的时候记得 sql_select + sql_from+sql_where , values.toArray();
	}
}



© 著作权归作者所有

十一11
粉丝 6
博文 80
码字总数 19784
作品 0
杭州
私信 提问
myBatis --(5)动态sql

动态sql是myBatis中相当有用的一个知识点,总体来说,动态sql有如下几类: 1>if语句(简单的条件判断) 2>choose(相当于case when),即C语言中的switth 3>trim(对包含的内容加上prefix(前缀)、...

求是科技
2015/11/02
70
0
JEECG 3.7.2 发布,企业级 JAVA 快速开发平台

JEECG 3.7.2版本发布 - 微云快速开发平台 JEECG是一款基于代码生成器的J2EE快速开发平台,开源界“小普元”超越传统商业企业级开发平台。引领新的开发模式(Online Coding模式(自定义表单)->...

Jeecg
2018/01/24
1K
6
使用 MyBatis-Plus 代码生成器

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生 MyBatis-Plus 的目的是增强 MyBatis 的功能和操作,内置代码生成器可以...

非摩尔根
01/22
327
0
python 函数式编程之高阶函数filter

python学习笔记,特做记录,分享给大家,希望对大家有所帮助。 高阶函数filter Python内建的filter()函数用于过滤序列。 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,...

展菲
06/25
0
0
【更新】Essential Studio for ASP.NET MVC更新至2018 v4(一)

下载Essential Studio for ASP.NET MVC最新版本 Essential Studio for ASP.NET MVC控件包是一款MVC界面开发包,它包含了几乎所有企业级Web应用程序开发所需要的控件,如Grids、 Charts、Gau...

电池盒
2018/12/24
15
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部