动态拼接sql语句工具类
说明:只返回了where后面的语句,没有select,用于单表查询
/**
* sql查询操作符枚举类
* */
public enum SqlOpEnum {
EQUAL("equal"),NOT_EQUAL("notEqual"),
GE("ge"),GTE("gte"),LE("le"),LTE("lte"),
IN("in"),NOT_IN("notIn"),
LIKE("like"),NOT_LIKE("notLike"), LEFT_LIKE("leftLike"),RIGHT_LIKE("rightLike");
private String name;
SqlOpEnum(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static SqlOpEnum getByOp(String op){
SqlOpEnum[] values = SqlOpEnum.values();
for (SqlOpEnum value:values) {
if( value.getName().equals(op) ){
return value;
}
}
return null;
}
}
===================================
import java.io.Serializable;
/**
* sql参数类
*/
public class SqlParam implements Serializable {
private String key;
private Object value;
private SqlOpEnum op;
public SqlParam(String key,Object value,SqlOpEnum op){
this.key = key;
this.value = value;
this.op = op;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public SqlOpEnum getOp() {
return op;
}
public void setOp(SqlOpEnum op) {
this.op = op;
}
}
=================================================
/**
* @author wangdonghua
* 动态拼接sql condition工具类
* */
public class SqlBuilderUtil {
public static Pair<String,Object[]> buildCondition(List<SqlParam> sqlParamList ){
if(CollectionUtils.isEmpty(sqlParamList)){
return new Pair("",null);
}
boolean first = true;
StringBuilder builder = new StringBuilder();
String key = null;
Object value = null;
String op = null;
List<Object> paramList = new ArrayList<>();
for (SqlParam param:sqlParamList) {
key = param.getKey();
value = param.getValue();
op = param.getOp().getName();
switch (SqlOpEnum.getByOp(op)){
case EQUAL:
if( first ){
builder.append(key).append(" = ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" = ? ");
}
paramList.add(value);
break;
case NOT_EQUAL:
if( false ){
builder.append(key).append(" != ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" != ? ");
}
paramList.add(value);
break;
case GE:
if( first ){
builder.append(key).append(" > ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" > ? ");
}
paramList.add(value);
break;
case GTE:
if( first ){
builder.append(key).append(" >= ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" >= ? ");
}
paramList.add(value);
break;
case LE:
if( first ){
builder.append(key).append(" < ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" < ? ");
}
paramList.add(value);
break;
case LTE:
if( first ){
builder.append(key).append(" <= ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" <= ? ");
}
paramList.add(value);
break;
case IN:
List list = (List) value;
String rangeCondition = buildRangeCondition(list);
if( first ){
builder.append(key).append(" in (").append(rangeCondition).append(")");
first = false;
}else{
builder.append(" AND ").append(key).append(" in (").append(rangeCondition).append(")");
}
break;
case NOT_IN:
List list2 = (List) value;
String rangeCondition2 = buildRangeCondition(list2);
if( first ){
builder.append(key).append(" not in (").append(rangeCondition2).append(")");
first = false;
}else{
builder.append(" AND ").append(key).append(" not in (").append(rangeCondition2).append(")");
}
break;
case LIKE:
if( first ){
builder.append(key).append(" like ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" like ? ");
}
paramList.add("%" + value + "%");
break;
case NOT_LIKE:
if( first ){
builder.append(key).append(" not like ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" not like ? ");
}
paramList.add("%" + value + "%");
break;
case LEFT_LIKE:
if( first ){
builder.append(key).append(" like ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" like ? ");
}
paramList.add("%" + value);
break;
case RIGHT_LIKE:
if( first ){
builder.append(key).append(" like ? ");
first = false;
}else{
builder.append(" AND ").append(key).append(" like ? ");
}
paramList.add(value + "%");
break;
}
}
String condition = builder.toString();
Object[] params = null;
if( CollectionUtils.isNotEmpty(paramList) ){
params = paramList.toArray();
}
return new Pair<>(condition,params);
}
private static String buildRangeCondition(List list){
if( CollectionUtils.isEmpty(list) ){
return "";
}
boolean first = true;
StringBuilder builder = new StringBuilder("");
for (Object obj:list) {
if( first ){
if( obj instanceof String ){
builder.append("'").append(obj).append("'");
}else{
builder.append(obj);
}
first = false;
}else{
if( obj instanceof String ){
builder.append(",").append("'").append(obj).append("'");
}else{
builder.append(",").append(obj);
}
}
}
return builder.toString();
}
标签:
动态 sql 拼接 mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律