mybatis3下的通用sql的select语句执行类

          项目中为了使项目的数据库操作从dao层转移到service层,只好写一个通用的sql语句拼接类和相应的mapper类和mapper的xml文件,自定义的SelectBuilder.java的代码如下:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.util.StringHelper;

/**
 * SelectBuilder:SQL条件拼接类,该类只做sql语句的拼接
 * @author LMH 修改
 * @notice    注意:为了用好该类,必须熟悉掌握sql语句完整语法
 * @SQLGrammar  SELECT语句的完整语法为: 
 *SELECT[ALL|DISTINCT|DISTINCTROW|TOP]  <br/>
 *{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} <br/>
 *FROM tableexpression[,…][IN externaldatabase] <br/>
 *[WHERE…] <br/>
 *[GROUP BY…] <br/>
 *[HAVING…] <br/>
 *[ORDER BY…] <br/>
 *[WITH OWNERACCESS OPTION] <br/>
 *说明: <br/>
 *用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 <br/>
 *
 */
public class SelectBuilder
{
	private static final String AND = ") \nAND (";

	private static final String OR = ") \nOR (";
	
	List<String> select = new ArrayList<String>();

	List<String> from = new ArrayList<String>();

	List<String> join = new ArrayList<String>();

	List<String> innerJoin = new ArrayList<String>();

	List<String> outerJoin = new ArrayList<String>();

	List<String> leftOuterJoin = new ArrayList<String>();

	List<String> rightOuterJoin = new ArrayList<String>();

	List<Criterion> where = new ArrayList<Criterion>();

	List<Criterion> having = new ArrayList<Criterion>();

	List<String> groupBy = new ArrayList<String>();

	List<String> orderBy = new ArrayList<String>();

	List<String> lastList = new ArrayList<String>();

	boolean distinct;

    /**
     * 设置SQL语句中从select到from的部分
     * @param conditons 查詢的内容,可以写字段,聚合函数等
     * @example 参数例子:" table1.id as id,table2.mc as mc ",
     * @notice  注意:如果要查询的字段名有相同的,必须用as **的方式进行区分,不然会不能正确set进hashmap里
     * 
     */
	public  void SELECT(String conditons)
	{
		select.add(conditons);
	}
	 /**
     * 设置SQL语句中从select distinct到from的部分,可以写字段,聚合函数等
     * @param columns 查詢的字段列表 
     * @example 参数例子:" table1.id as id,table2.mc as mc ",
     * @notice  注意:如果要查询的字段名有相同的,必须用as **的方式进行区分,不然会不能正确set进hashmap里
     * 
     */
	public  void SELECT_DISTINCT(String columns)
	{
		distinct = true;
		SELECT(columns);
	}
	
    /**
     *  设置SQL语句中从from到where的部分
     * @param table: 表名列表,可以是要查询的表名列表,或者直接加上join连接
     * @example 参数例子:" table1 " 或者" table1,table2 "
     */
	public  void FROM(String table)
	{
		from.add(table);
	}
	/**
	* 设置JOIN连接条件 <br/>
    * 切记用了join相关的链接,则form里只能有一个表,而且,join函数之后,后面不得再加from函数
    * @param join:JOIN连接条件,由3部分组成:表名 别名 + on +连接条件
    * @example join参数例子:" bmd_mss b on b.bmd_h=loc.x_h "
    */
	public  void JOIN(String join)
	{
		this.join.add(join);
	}
	/**
	* 设置INNER_JOIN连接条件 <br/>
    * 切记用了join相关的链接,则form里只能有一个表,而且,join函数之后,后面不得再加from函数
    * @param join:INNER_JOIN连接条件,由3部分组成:表名 别名 + on +连接条件
    * @example join参数例子:" bmd_mss b on b.bmd_h=loc.x_h "
    */
	public  void INNER_JOIN(String join)
	{
		innerJoin.add(join);
	}
	 /**
	  * 设置LEFT_OUTER_JOIN连接条件
     * 用了join相关的链接,则form里只能有一个表,而且,join之后,后面不得再加form函数
     * @param join:LEFT_OUTER_JOIN连接条件,由3部分组成:表名 别名 + on +连接条件
     * @example join参数例子:" bmd_mss b on b.bmd_h=loc.x_h "
     */
	public  void LEFT_OUTER_JOIN(String join)
	{
		leftOuterJoin.add(join);
	}
	/**
	* 设置RIGHT_OUTER_JOIN连接条件
    * 用了join相关的链接,则form里只能有一个表,而且,join之后,后面不得再加form函数
    * @param join:RIGHT_OUTER_JOIN连接条件,由3部分组成:表名 别名 + on +连接条件
    * @example join参数例子:" bmd_mss b on b.bmd_h=loc.x_h "
    */
	public  void RIGHT_OUTER_JOIN(String join)
	{
		rightOuterJoin.add(join);
	}
	/**
	* 设置OUTER_JOIN连接条件
    * 用了join相关的链接,则form里只能有一个表,而且,join之后,后面不得再加form函数
    * @param join:OUTER_JOIN连接条件,由3部分组成:表名 别名 + on +连接条件
    * @example join参数例子:" bmd_mss b on b.bmd_h=loc.x_h "
    */
	public  void OUTER_JOIN(String join)
	{
		outerJoin.add(join);
	}

	//为了适应动态参数而重写的where方法(没有参数的情况)
	/**
	 *设置where子语句(一个参数的情况)
     * @param conditions:  连接条件,没有传动态参数的查询条件部分<br/>
     * 一个静态查询条件必须包含4部分内容:连接规则 字段列 运算符 值 <br/>
     * 连接规则: (and 或者 or)<br/>
     * 字段名: (field1)<br/>
     * 运算符: 必须以下运算符中的一个( > 或者 >= 或者 < 或者 <= 或者 <br/>
     * = 或者 <> 或者!= 或者 like 或者 not like 或者 in 或者 not in <br/>
     * 或者 between 或者 not between )     <br/>   
     * 值 : 注意:如果元素符是in,则值部分必须写成 (value1,value2...)的形式。<br/>
     *             如果元素符是between,则值部分必须为 value1 and value2 的形式,value1为min,value2为max。<br/>
     *             如果元素符是like,则值部分可以在值的左右两边加上%或者_的通配符。<br/>
     *                            %:表示匹配任意个字符;_:表示匹配一个字符。<br/>
     * @example conditions参数例子:" and table1.id=table2.id or table1.mc=table2.mc and table1.id like '%1%' " 
	 */
	public  void WHERE(String conditions)
	{
		if(StringHelper.isNotBlank(conditions))
		where.add( new Criterion(conditions));
	}
	//为了适应动态参数而重写的where方法,(单个参数或者in的情况)
	/**
	 * 设置where子语句(两个参数的情况)支持单个参数或者in的情况
     * @param conditions:  连接条件,没有传动态参数的查询条件部分,必须包含3部分内容:<br/>
     *                  连接规则:(and 或者 or)+ 字段列:(field1)+ 运算符 <br/>
     *                  运算符:必须以下运算符中的一个( > 或者 >= 或者 < 或者 <= 或者 = 或者  <br/>
     *                 <> 或者!= 或者 like 或者 not like 或者 in 或者not in  )  <br/>      
     * @param value:  参数值,Object对象,支持任何类型<br/>
     *                 注意:如果conditions的运算符是in, 则value部分可以传递一个list的对象,<br/>
     *                 list对象至少要包含一个Object类型的元素;如果conditions的运算符是like<br/>
     *                 部分,则value部分可以在"value1"值的左右两边加上%或者_的通配符。<br/>
     *                  %:表示匹配任意个字符;_:表示匹配一个字符<br/>
     * @example conditions参数例子:" and table1.id= " 或者" and table1.id like  "
	 */
	public void WHERE(String conditions,Object value)
	{
		if(value!=null)    //如果非空
		{
			if (value instanceof List<?>) //如果为list
		    {
		      if(!((List)value).isEmpty() ) //如果list非空
		    	where.add( new Criterion(conditions,value));
		    }
		    else  //如果为其他直接添加
		    where.add( new Criterion(conditions,value));
		}
	}
	//为了适应动态参数而重写的where方法(单个参数或者in的情况),有close关闭符号的情况
	/**
	 * 设置where子语句(三个参数的情况)支持单个参数或者in的情况,有close关闭符号的情况
     * @param conditions:  连接条件,没有传动态参数的查询条件部分,必须包含3部分内容:<br/>
     *                连接规则:(and 或者 or)+ 字段列:(field1)+ 运算符 <br/>
     *                运算符:必须以下运算符中的一个( > 或者 >= 或者 < 或者 <= 或者  <br/>
     *                = 或者 <> 或者!= 或者 like 或者 not like 或者 in 或者 not in  )  <br/>   
     * @param value:  参数值,Object对象,支持任何类型<br/>
     *               注意:如果conditions的运算符是in, 则value部分可以传递一个list的对象,list对象至少要包含一个Object类型的元素<br/>
     *               如果conditions的运算符是like部分,则value部分可以在"value1"值的左右两边加上%或者_的通配符<br/>
     *               %:表示匹配任意个字符;_:表示匹配一个字符<br/>
     * @example conditions参数例子:" and table1.id= " 或者" and table1.id like  "
     * @param close: 关闭符号,只有在处理or条件的时候才会用到,其他时候设置null或者""
	 */
	public void WHERE(String conditions,Object value,String close)
	{
		if(value!=null)    //如果非空
		{
			if (value instanceof List<?>) //如果为list
		    {
		      if(!((List)value).isEmpty() ) //如果list非空
		    	where.add( new Criterion(conditions,value,close));
		    }
		    else  //如果为其他直接添加
		    where.add( new Criterion(conditions,value,close));
		}
	}
	//为了适应动态参数而重写的where方法(between的情况),有close关闭符号的情况
	/**
	 * 设置where子语句(四个参数的情况)支持between的情况,有close关闭符号的情况
     * @param conditions:  连接条件,没有传动态参数的查询条件部分,必须包含3部分内容:<br/>
     *                连接规则:(and 或者 or)+ 字段列:(field1)+ 运算符 <br/>
     *                运算符:必须以下运算符中的一个(  between 或者 not between )<br/>  
     * @param value:  参数值,Object对象,between的参数值左部分,支持任何类型<br/>  
     * @param secondValue    参数值,Object对象,between的参数值右部分,支持任何类型<br/>  
     * @example conditions参数例子:" and table1.id= " 或者" and table1.id like  "
     * @param close: 关闭符号,只有在处理or条件的时候才会用到,其他时候设置null或者""
	 */
	public  void WHERE(String conditions,Object value,Object secondValue,String close)
	{
		if(value!=null&&secondValue!=null)
		where.add( new Criterion(conditions,value,secondValue,close));
	}

	/**
	 * 设置分组字段列表
	 * 切记GROUP_BY里面的字段select里面的字段必须有,不然会触发sql语法错误异常
	 * @param columns: 分组字段
	 * @example columns参数例子:"table1.id,table2.mc "
	 */
	public  void GROUP_BY(String columns)
	{
		groupBy.add(columns);
	}


	//为了适应动态参数而重写的having方法(没有参数的情况)
	/**
	 * 
	 * 设置having子语句(一个参数的情况)<br/>
	 * 切记having里面的字段group by里面必须有,不然会触发sql语法错误异常<br/>
     * @param conditions:  连接条件,没有传动态参数的查询条件部分<br/>
     * 一个静态查询条件必须包含4部分内容:连接规则 字段列 运算符 值 <br/>
     * 连接规则: (and 或者 or)<br/>
     * 字段名: (field1)<br/>
     * 运算符: 必须以下运算符中的一个( > 或者 >= 或者 < 或者 <= 或者 <br/>
     * = 或者 <> 或者!= 或者 like 或者 not like 或者 in 或者 not in <br/>
     * 或者 between 或者 not between )     <br/>   
     * 值: 注意:如果元素符是in,则值部分必须写成 (value1,value2...)的形式。<br/>
     *             如果元素符是between,则值部分必须为 value1 and value2 的形式,value1为min,value2为max。<br/>
     *             如果元素符是like,则值部分可以在值的左右两边加上%或者_的通配符。<br/>
     *                            %:表示匹配任意个字符;_:表示匹配一个字符。<br/>
     * @example conditions参数例子:" and table1.id=table2.id or table1.mc=table2.mc and table1.id like '%1%' " 
	 */
	public  void HAVING(String conditions)
	{
		if(StringHelper.isNotBlank(conditions))
		having.add( new Criterion(conditions));
	}
	//为了适应动态参数而重写的having方法(单个参数或者in的情况)
	/**
	 * 设置having子语句(两个参数的情况)支持单个参数或者in的情况<br/>
	 * 切记having里面的字段group by里面必须有,不然会触发sql语法错误异常<br/>
     * @param conditions:  连接条件,没有传动态参数的查询条件部分,必须包含3部分内容:<br/>
     *                  连接规则:(and 或者 or)+ 字段列:(field1)+ 运算符 <br/>
     *                  运算符:必须以下运算符中的一个( > 或者 >= 或者 < 或者 <= 或者 = 或者  <br/>
     *                 <> 或者!= 或者 like 或者 not like 或者 in 或者not in  )  <br/>      
     * @param value:  参数值,Object对象,支持任何类型<br/>
     *                 注意:如果conditions的运算符是in, 则value部分可以传递一个list的对象,<br/>
     *                 list对象至少要包含一个Object类型的元素;如果conditions的运算符是like<br/>
     *                 部分,则value部分可以在"value1"值的左右两边加上%或者_的通配符。<br/>
     *                  %:表示匹配任意个字符;_:表示匹配一个字符<br/>
     * @example conditions参数例子:" and table1.id= " 或者" and table1.id like  "
	 */
	public  void HAVING(String conditions,Object value)
	{
		if(value!=null)    //如果非空
		{
			if (value instanceof List<?>) //如果为list
		    {
		      if(!((List)value).isEmpty() ) //如果list非空
		      having.add( new Criterion(conditions,value));
		    }
		    else  //如果为其他直接添加
		    having.add( new Criterion(conditions,value));
		}
	}
	//为了适应动态参数而重写的having方法(单个参数或者in的情况),有close关闭符号的情况
	/**
	 * 设置having子语句(三个参数的情况)支持单个参数或者in的情况,有close关闭符号的情况 <br/>
	 * 切记having里面的字段group by里面必须有,不然会触发sql语法错误异常<br/>
     * @param conditions:  连接条件,没有传动态参数的查询条件部分,必须包含3部分内容:<br/>
     *                连接规则:(and 或者 or)+ 字段列:(field1)+ 运算符 <br/>
     *                运算符:必须以下运算符中的一个( > 或者 >= 或者 < 或者 <= 或者  <br/>
     *                = 或者 <> 或者!= 或者 like 或者 not like 或者 in 或者 not in  )  <br/>   
     * @param value:  参数值,Object对象,支持任何类型<br/>
     *               注意:如果conditions的运算符是in, 则value部分必须传递一个list的对象,<br/>
     *               list对象至少要包含一个Object类型的元素;<br/>
     *               如果conditions的运算符是like部分,则value部分可以在"value1"值的左右两边加上%或者_的通配符<br/>
     *               %:表示匹配任意个字符;_:表示匹配一个字符<br/>
     * @example conditions参数例子:" and table1.id= " 或者" and table1.id like  "
     * @param close: 关闭符号,只有在处理or条件的时候才会用到,其他时候设置null或者""
	 */
	public  void HAVING(String conditions,Object value,String close)
	{
		if(value!=null)    //如果非空
		{
			if (value instanceof List<?>) //如果为list
		    {
		      if(!((List)value).isEmpty() ) //如果list非空
		      having.add( new Criterion(conditions,value,close));
		    }
		    else  //如果为其他直接添加
		    having.add( new Criterion(conditions,value,close));
		}
	}
	//为了适应动态参数而重写的having方法(between的情况),有close关闭符号的情况
	/**
	 * 设置having子语句(四个参数的情况)支持between的情况,有close关闭符号的情况<br/>
	 * 切记having里面的字段group by里面必须有,不然会触发sql语法错误异常<br/>
     * @param conditions:  连接条件,没有传动态参数的查询条件部分,必须包含3部分内容:<br/>
     *                连接规则:(and 或者 or)+ 字段列:(field1)+ 运算符 <br/>
     *                运算符:必须以下运算符中的一个(  between 或者 not between )<br/>  
     * @param value:  参数值,Object对象,between的参数值左部分,支持任何类型<br/>  
     * @param secondValue: 参数值,Object对象,between的参数值右部分,支持任何类型<br/>  
     * @example conditions参数例子:" and table1.id= " 或者" and table1.id like  "
     * @param close: 关闭符号,只有在处理or条件的时候才会用到,其他时候设置null或者""
	 */
	public  void HAVING(String conditions,Object value,Object secondValue,String close)
	{
		if(value!=null&&secondValue!=null)
		having.add( new Criterion(conditions,value,secondValue,close));
	}
	/**
	 * 设置排序子语句
	 * 切记ORDER_BY里面的字段select里面的字段必须有,不然会触发sql语法错误异常
	 * @param conditions: 排序条件
	 * @example conditions参数例子:"table1.id decs"
	 */
	public  void ORDER_BY(String conditions)
	{
		orderBy.add(conditions);
	}

	private  StringBuilder selectClause( String keyword,
			List<String> parts, String open, String close, String conjunction)
	{
		StringBuilder builder=new StringBuilder();
		if (!parts.isEmpty())
		{
			if (builder.length() > 0)
				builder.append("\n");
			builder.append(keyword);
			builder.append(" ");
			builder.append(open);
			String last = "________";
			for (int i = 0, n = parts.size(); i < n; i++)
			{
				String part = parts.get(i);
				if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND)
						&& !last.equals(OR))
				{
					builder.append(conjunction);
				}
				builder.append(part);
				last = part;
			}
			builder.append(close);
		}
		return builder;
	}
	
	private  void whereClause()
	{
		if(where.size()>0)
		{
			System.out.print(" WHERE 1=1 ");	
		    for(Criterion cri:where)
	        {
	        	if(cri.isNoValue())
	        	System.out.print(cri.getCondition());
	        	if(cri.isSingleValue())
	             System.out.print(cri.getCondition()+" '"+cri.getValue()+"'");
	        	if(cri.isBetweenValue())
	              System.out.print(cri.getCondition()+" '"+cri.getValue()+"' and '"+cri.getSecondValue()+"'");
	        	if(cri.isListValue())
	        	{ 
	        		StringBuilder strb= new StringBuilder();
	        		strb.append(cri.getCondition());
	        		strb.append(" (");
	        		List list=(List)cri.getValue();
	        		for(int i=0;i<list.size();i++)
	        		{
	                    Object o=list.get(i);
	        			strb.append("'"+o+"'");
	        			if(i<list.size()-1)
	        			 strb.append(",");       			
	        		}
	        		strb.append(")");
	        		System.out.print(strb);
	        	}
	        	//处理关闭符号的代码
	        	if(cri.close==null||cri.close.equals(""))
	        		System.out.println();
	        	else
	        		System.out.println(cri.close);
	        		
	        }
		}
	}
	private void havingClause()
	{
		if(having.size()>0)
		{
			System.out.print(" HAVING 1=1 ");	
		    for(Criterion cri:having)
	        {
	        	if(cri.isNoValue())
	        	System.out.print(cri.getCondition());
	        	if(cri.isSingleValue())
	             System.out.print(cri.getCondition()+" '"+cri.getValue()+"'");
	        	if(cri.isBetweenValue())
	              System.out.print(cri.getCondition()+" '"+cri.getValue()+"' and '"+cri.getSecondValue()+"'");
	        	if(cri.isListValue())
	        	{ 
	        		StringBuilder strb= new StringBuilder();
	        		strb.append(cri.getCondition());
	        		strb.append(" (");
	        		List list=(List)cri.getValue();
	        		for(int i=0;i<list.size();i++)
	        		{
	                    Object o=list.get(i);
	        			strb.append("'"+o+"'");
	        			if(i<list.size()-1)
	        			 strb.append(",");       			
	        		}
	        		strb.append(")");
	        		System.out.print(strb);
	        	}
	        	//处理关闭符号的代码
	        	if(cri.close==null||cri.close.equals(""))
	        		System.out.println();
	        	else
	        		System.out.println(cri.close);
	        }
		}
	}
	 /**
	    *  打印由各部分组合起来的SQL语句
	    */
	  public  void printSQL()
	  {
		  if(!select.isEmpty())
		  System.out.println(selectClause( "SELECT", this.select, "", "", ", "));
		  if(!from.isEmpty())
		  System.out.println(selectClause( "FROM", this.from, "", "", ", "));
		  if(!innerJoin.isEmpty())
		  System.out.println(selectClause("INNER JOIN", this.innerJoin, "", "", "\nINNER JOIN "));
		  if(!outerJoin.isEmpty())
			  System.out.println(selectClause("OUTER JOIN", this.outerJoin, "", "", "\nOUTER JOIN "));
		  if(!leftOuterJoin.isEmpty())
			  System.out.println(selectClause(" LEFT OUTER JOIN", this.leftOuterJoin, "", "", "\nLEFT OUTER JOIN "));
		  if(!rightOuterJoin.isEmpty())
			  System.out.println(selectClause(" RIGHT OUTER JOIN", this.rightOuterJoin, "", "", "\nRIGHT OUTER JOIN "));
		  whereClause();
		  if(!groupBy.isEmpty())
			  System.out.println(selectClause(" GROUP BY", this.groupBy, "", "", ", "));
		  havingClause();
		  if(!orderBy.isEmpty())
			  System.out.println(selectClause(" ORDER BY", this.orderBy, "", "", ", "));
		  
		  
		  
	  }
	  /**
	   * Criterion :where或者having的子语句条件类
	   * @author LMH 修改
	   *
	   */
	  public  class Criterion {
	        private String condition;

	        private Object value;

	        private Object secondValue;

	        private boolean noValue;

	        private boolean singleValue;

	        private boolean betweenValue;

	        private boolean listValue;
	        
	        private String close; //为了解决or要有括号括起来而添加的属性

	        private String typeHandler;

	        public String getCondition() {
	            return condition;
	        }

	        public Object getValue() {
	            return value;
	        }

	        public Object getSecondValue() {
	            return secondValue;
	        }

	        public boolean isNoValue() {
	            return noValue;
	        }

	        public boolean isSingleValue() {
	            return singleValue;
	        }

	        public boolean isBetweenValue() {
	            return betweenValue;
	        }

	        public boolean isListValue() {
	            return listValue;
	        }

	        public String getTypeHandler() {
	            return typeHandler;
	        }

	        public String getClose() {
				return close;
			}

			public void setClose(String close) {
				this.close = close;
			}

			protected Criterion(String condition) {
	            super();
	            this.condition = condition;
	            this.typeHandler = null;
	            this.noValue = true;
	        }


	        protected Criterion(String condition, Object value) {
	            this.condition = condition;
	            this.value = value;
	            if (value instanceof List<?>) {
	                this.listValue = true;
	            } else {
	                this.singleValue = true;
	            }
	        }
	        protected Criterion(String condition, Object value,String close) {
	            this.condition = condition;
	            this.value = value;
	            this.close=close;
	            if (value instanceof List<?>) {
	                this.listValue = true;
	            } else {
	                this.singleValue = true;
	            }
	        }

	        protected Criterion(String condition, Object value, Object secondValue, String close) {
	            super();
	            this.condition = condition;
	            this.value = value;
	            this.secondValue = secondValue;
	            this.close = close;
	            this.betweenValue = true;
	        }

	    }
	  
	public static void main(String[] args) throws IOException {
		SelectBuilder sql=new SelectBuilder();
		sql.SELECT("l.mc,l.id");
		System.out.println(sql.selectClause( "SELECT", sql.select, "", "", ", "));
		sql.FROM("bmd l,user u");
		System.out.println(sql.selectClause( "FROM", sql.from, "", "", ", "));
		sql.INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID"); 
		System.out.println(sql.selectClause("INNER JOIN", sql.innerJoin, "", "", "\nINNER JOIN "));
		sql.WHERE(" l.id=u.id");
         List l=new ArrayList();
         l.add("1");
         l.add("2");
         sql.WHERE("or( l.id in",l);
         sql.WHERE("and l.id between",1,2,")");
         sql.whereClause();
         sql.GROUP_BY("l.id,u.id");
        System.out.println(sql.selectClause( "GROUP BY", sql.groupBy, "", "", ", "));
        sql.HAVING(" l.id=u.id");
        List l2=new ArrayList();
        l2.add("1");
        l2.add("2");
        sql.HAVING("or( l.id in",l2);
        sql.HAVING("and l.id between","1","2",")");
        sql.havingClause();
        
	
	}
    /**********get方法*******/
	public List<String> getSelect() {
		return select;
	}


	public List<String> getFrom() {
		return from;
	}

	public List<String> getJoin() {
		return join;
	}

	public List<String> getInnerJoin() {
		return innerJoin;
	}


	public List<String> getOuterJoin() {
		return outerJoin;
	}


	public List<String> getLeftOuterJoin() {
		return leftOuterJoin;
	}

	public List<String> getRightOuterJoin() {
		return rightOuterJoin;
	}


	public List<Criterion> getWhere() {
		return where;
	}

	public List<Criterion> getHaving() {
		return having;
	}


	public List<String> getGroupBy() {
		return groupBy;
	}

	public List<String> getOrderBy() {
		return orderBy;
	}


	public boolean isDistinct() {
		return distinct;
	}


}


SqlMapper.xml的映射文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.SqlMapper">

<!-- 方法一:支持單表或者多表的通用查詢方法  By 梁敏鸿 2012年2月24日 -->
  <select id="selectBySql" resultType="map" parameterType="com.common.SelectBuilder">
   <!-- 1.SQL语句的基本部分 -->
   <if test="distinct">
        <if test="!select.empty">
         SELECT DISTINCT
         </if>
         <foreach collection="select" item="select_content" open=" " separator="," close=" " > 
        ${select_content}    
      </foreach>
   </if> 
    <if test="!distinct">
        <if test="!select.empty">
         SELECT 
         </if>
        <foreach collection="select" item="select_content" open=" " separator="," close=" " > 
        ${select_content}    
      </foreach>
   </if> 
     <if test="!from.empty">
      FROM
      <foreach collection="from" item="from_content" open=" " separator="," close=" " > 
        ${from_content}    
      </foreach>
     </if>
   <!-- 2.join 查询部分-->
       <if test="!join.empty">
      JOIN
      <foreach collection="join" item="join_content" open=" " separator="\n JOIN" close=" " > 
        ${join_content}    
      </foreach>
     </if>
     <if test="!innerJoin.empty">
      INNER JOIN
      <foreach collection="innerJoin" item="innerJoin_content" open=" " separator="\n INNER JOIN" close=" " > 
        ${innerJoin_content}    
      </foreach>
     </if>
      <if test="!outerJoin.empty">
      OUTER JOIN
      <foreach collection="outerJoin" item="outerJoin_content" open=" " separator="\n OUTER JOIN" close=" " > 
        ${outerJoin_content}    
      </foreach>
     </if>
      <if test="!leftOuterJoin.empty">
     LEFT OUTER JOIN
      <foreach collection="leftOuterJoin" item="leftOuterJoin_content" open=" " separator="\n  LEFT OUTER JOIN" close=" " > 
        ${leftOuterJoin_content}    
      </foreach>
     </if>
     <if test="!rightOuterJoin.empty">
     RIGHT OUTER JOIN
      <foreach collection="rightOuterJoin" item="rightOuterJoin_content" open=" " separator="\n  RIGHT OUTER JOIN" close=" " > 
        ${rightOuterJoin_content}    
      </foreach>
     </if>
   <!-- 3.SQL语句WHERE部分  -->
     <if test="!where.empty">
      where 1=1
      <foreach collection="where" item="where_Criterion" open=" " separator=" " close=" " > 
               <choose >
                <when test="where_Criterion.noValue" >
                   ${where_Criterion.condition}
                </when>
                <when test="where_Criterion.singleValue" >
                   ${where_Criterion.condition} #{where_Criterion.value}
                </when>
                <when test="where_Criterion.betweenValue" >
                   ${where_Criterion.condition} #{where_Criterion.value} and #{where_Criterion.secondValue}
                </when>
                <when test="where_Criterion.listValue" >
                   ${where_Criterion.condition}
                  <foreach collection="where_Criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose> 
           <!-- 加上close关闭符号,为了处理or的括号包含的情况 --> 
                <if test="where_Criterion.close!=null and where_Criterion.close!=''">
                 ${where_Criterion.close}
                </if>            
      </foreach>
     </if>
    <!-- 4.SQL语句GROUP BY部分 -->
      <if test="!groupBy.empty">
          GROUP BY
      <foreach collection="groupBy" item="groupBy_content" open=" " separator="," close=" " > 
        ${groupBy_content}    
      </foreach>
      </if>
      <!-- 5.SQL语句HAVING部分 -->
      <if test="!having.empty">
          HAVING 1=1
       <foreach collection="having" item="having_Criterion" open=" " separator=" " close=" " > 
               <choose >
                <when test="having_Criterion.noValue" >
                   ${having_Criterion.condition}
                </when>
                <when test="having_Criterion.singleValue" >
                   ${having_Criterion.condition} #{having_Criterion.value}
                </when>
                <when test="having_Criterion.betweenValue" >
                   ${having_Criterion.condition} #{having_Criterion.value} and #{having_Criterion.secondValue}
                </when>
                <when test="having_Criterion.listValue" >
                   ${having_Criterion.condition}
                  <foreach collection="having_Criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose> 
              <!-- 加上close关闭符号,为了处理or的括号包含的情况 --> 
                <if test="having_Criterion.close!=null and having_Criterion.close!=''">
                 ${having_Criterion.close}
                </if>            
      </foreach>
      </if>
      <!-- 6.SQL语句ORDER BY部分  -->
      <if test="!orderBy.empty">
          ORDER BY
           <foreach collection="orderBy" item="orderBy_content" open=" " separator="," close=" " > 
            ${orderBy_content}    
            </foreach>
      </if>
</select>   
<!-- 方法二:支持單表或者多表的通用统计方法  By lmh 2012年2月24日 -->
  <select id="countBySql" resultType="int" parameterType="com.common.SelectBuilder">
         <if test="distinct">
        <if test="!select.empty">
         SELECT DISTINCT
         </if>
        COUNT(*)
   </if> 
    <if test="!distinct">
        <if test="!select.empty">
         SELECT 
         </if>
        COUNT(*)
   </if> 
     <if test="!from.empty">
      FROM
      <foreach collection="from" item="from_content" open=" " separator="," close=" " > 
        ${from_content}    
      </foreach>
     </if>
     
       <if test="!join.empty">
      JOIN
      <foreach collection="join" item="join_content" open=" " separator="\n JOIN" close=" " > 
        ${join_content}    
      </foreach>
     </if>
     <if test="!innerJoin.empty">
      INNER JOIN
      <foreach collection="innerJoin" item="innerJoin_content" open=" " separator="\n INNER JOIN" close=" " > 
        ${innerJoin_content}    
      </foreach>
     </if>
      <if test="!outerJoin.empty">
      OUTER JOIN
      <foreach collection="outerJoin" item="outerJoin_content" open=" " separator="\n OUTER JOIN" close=" " > 
        ${outerJoin_content}    
      </foreach>
     </if>
      <if test="!leftOuterJoin.empty">
     LEFT OUTER JOIN
      <foreach collection="leftOuterJoin" item="leftOuterJoin_content" open=" " separator="\n  LEFT OUTER JOIN" close=" " > 
        ${leftOuterJoin_content}    
      </foreach>
     </if>
     <if test="!rightOuterJoin.empty">
     RIGHT OUTER JOIN
      <foreach collection="rightOuterJoin" item="rightOuterJoin_content" open=" " separator="\n  RIGHT OUTER JOIN" close=" " > 
        ${rightOuterJoin_content}    
      </foreach>
     </if>

     <if test="!where.empty">
      where 1=1
      <foreach collection="where" item="where_Criterion" open=" " separator=" " close=" " > 
               <choose >
                <when test="where_Criterion.noValue" >
                  ${where_Criterion.condition}
                </when>
                <when test="where_Criterion.singleValue" >
                   ${where_Criterion.condition} #{where_Criterion.value}
                </when>
                <when test="where_Criterion.betweenValue" >
                  ${where_Criterion.condition} #{where_Criterion.value} and #{where_Criterion.secondValue}
                </when>
                <when test="where_Criterion.listValue" >
                   ${where_Criterion.condition}
                  <foreach collection="where_Criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose> 
            
                <if test="where_Criterion.close!=null and where_Criterion.close!=''">
                 ${where_Criterion.close}
                </if>            
      </foreach>
     </if>

      <if test="!groupBy.empty">
          GROUP BY
      <foreach collection="groupBy" item="groupBy_content" open=" " separator="," close=" " > 
        ${groupBy_content}    
      </foreach>
      </if>

      <if test="!having.empty">
          HAVING 1=1
       <foreach collection="having" item="having_Criterion" open=" " separator=" " close=" " > 
               <choose >
                <when test="having_Criterion.noValue" >
                   ${having_Criterion.condition}
                </when>
                <when test="having_Criterion.singleValue" >
                   ${having_Criterion.condition} #{having_Criterion.value}
                </when>
                <when test="having_Criterion.betweenValue" >
                   ${having_Criterion.condition} #{having_Criterion.value} and #{having_Criterion.secondValue}
                </when>
                <when test="having_Criterion.listValue" >
                   ${having_Criterion.condition}
                  <foreach collection="having_Criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose> 

                <if test="having_Criterion.close!=null and having_Criterion.close!=''">
                 ${having_Criterion.close}
                </if>            
      </foreach>
      </if>

      <if test="!orderBy.empty">
          ORDER BY
           <foreach collection="orderBy" item="orderBy_content" open=" " separator="," close=" " > 
            ${orderBy_content}    
            </foreach>
      </if>
</select>   
</mapper>
 

望大家指出设计的不足和程序存在的漏洞和错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值