查询语句工具类封装
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