java实现动态(高级)查询

导读:本篇文章讲解 java实现动态(高级)查询,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

查询语句工具类封装

package cn.itsource.utils;

import java.lang.reflect.Field;

import org.springframework.beans.BeanUtils;

import cn.itsource.annotation.Column;
import cn.itsource.annotation.Table;

public class SqlGenerator {
	
	/**
	 * 生成SQL语句
	 * @param sql	原始SQL
	 * @param con	查询条件
	 * @param needsLimit	是否需要limit子句
	 * @return
	 */
	public static String generate(String sql, Condition con, boolean needsLimit){
		sql += " where 1=1";
		//在Dao层,利用前端传过来的Condition参数【所有参数都封装到这个对象中】来确定要不要拼接字符串
		if(con.getIsEnabled() != null && con.getIsEnabled() >= 0){
			sql += " and isEnabled=" + con.getIsEnabled();
		}
		if(con.getJobName() != null && !"".equals(con.getJobName())){
			sql += " and jobName like '%" + con.getJobName() + "%'";
		}
		if(con.getJobType() != null && con.getJobType() >= 0){
			sql += " and jobType=" + con.getJobType();
		}
		if(needsLimit) sql += " limit ?,?";
		return sql;
	}
	
	public static <T> String generate(Condition con, Class<T> cls, boolean needsLimit){
		StringBuilder sql = new StringBuilder("select ");
		//如果需要limit子句,表示查询当前页数据,拼接 *, 否则就表示查询总行数 就拼接count(*)
		if(needsLimit){
			sql.append("* from ");
		}else{
			sql.append("count(*) from ");
		}
		
		try {
			//创建一个泛型类型的对象【domain实体类型】
			T t = cls.newInstance();
			//Condition身上的查询条件参数copy到这个对象身上
			BeanUtils.copyProperties(con, t);
			
			//1.解析当前传入的domain实体类上的@Table注解【得到里面的对应的表名称】
			Table annotationTable = cls.getAnnotation(Table.class);
			String tableName = annotationTable.value();
			sql.append(tableName);
			sql.append(" where 1=1");
			//2.再获取当前传入的domain实体类中的所有字段
			Field[] fields = cls.getDeclaredFields();
			//3.再解析字段上面的@Column注解
			Column annotationColumn = null;
			//列名称和运算符
			String columnName = null, operation = null;
			//字段的值
			Object value = null;
			for (Field f : fields) {
				annotationColumn = f.getAnnotation(Column.class);
				if(null != annotationColumn){
					//设置为true可以访问对象t的private修饰的属性
					f.setAccessible(true);
					columnName = annotationColumn.value();
					operation = annotationColumn.operation();
					//获取当前对象的当前字段值
					value = f.get(t);
					if(value != null){
						value = "like".equalsIgnoreCase(operation) ? "'%" + value + "%'" : value;
						sql.append(" and ").append(columnName).append(" ")
							.append(operation).append(" ").append(value);
						// and jobName like '%Java%'
						// and jobType = 1
					}
				}
			}
			if(needsLimit){
				sql.append(" order by id desc limit ?,?");
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return sql.toString();
	}

}

这里同样也要使用注解,举例说明和之前的分页功能是同一个项目,所以关于注解的设置可以去看本人博客里面的分页功能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75234.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!