public List<Bill> findListBy(Map<String,Object> maps) throws Exception{
//where a.productName like concat('%',?,'%') and totalPrice>=? and totalPrice<=?
List<Bill> billList = new ArrayList<>();
String sql = "select a.id,a.billCode,a.productName,a.productCount,\n" +
"a.productUnit,a.productDesc,a.totalPrice,a.providerId,b.proName " +
" from smbms_bill a left join smbms_provider b on a.providerId=b.id " +
"where 1=1 ";
List<Object> params = new ArrayList<>();
if(maps.get("pName")!=null){
sql += " and a.productName like concat('%',?,'%')";
params.add(maps.get("pName"));
}
if(maps.get("begin")!=null){
sql+= "and totalPrice>=?";
params.add(maps.get("begin"));
}
System.out.println("maps.get(\"end\")===="+maps.get("end"));
if(maps.get("end")!=null){
sql+= "and totalPrice<=?";
params.add(maps.get("end"));
}
ResultSet rs = query(sql,params);
while(rs.next()){
Bill bill = new Bill();
bill.setId(rs.getInt("id"));
bill.setBillCode(rs.getString("billCode"));
bill.setProductName(rs.getString("productName"));
bill.setProductCount(rs.getInt("productCount"));
bill.setProductUnit(rs.getString("productUnit"));
bill.setProductDesc(rs.getString("productDesc"));
bill.setTotalPrice(rs.getBigDecimal("totalPrice"));
Provider provider = new Provider();
provider.setId(rs.getInt("providerId"));
provider.setProName(rs.getString("proName"));
bill.setProvider(provider);
billList.add(bill);
}
return billList;
}
import java.util.ArrayList;
import java.util.List;
public class DynamicSqlBuilder {
private final StringBuilder sqlBuilder;
private final List<Object> params;
private boolean whereAdded = false;
public DynamicSqlBuilder(String baseSql) {
this.sqlBuilder = new StringBuilder(baseSql);
this.params = new ArrayList<>();
}
/**
* 添加等于条件(=)
* @param column 数据库字段名
* @param value 条件值
*/
public DynamicSqlBuilder eq(String column, Object value) {
addCondition(column, value, " = ?");
return this;
}
/**
* 添加模糊查询条件(LIKE)
* @param column 数据库字段名
* @param value 条件值
*/
public DynamicSqlBuilder like(String column, String value) {
if (value != null && !value.isEmpty()) {
addCondition(column, "%" + value + "%", " LIKE ?");
}
return this;
}
/**
* 添加大于条件(>)
* @param column 数据库字段名
* @param value 条件值
*/
public DynamicSqlBuilder gt(String column, Object value) {
addCondition(column, value, " > ?");
return this;
}
/**
* 添加IN条件(IN)
* @param column 数据库字段名
* @param values 值列表
*/
public DynamicSqlBuilder in(String column, List<?> values) {
if (values != null && !values.isEmpty()) {
addWhereClause();
sqlBuilder.append(column).append(" IN (");
for (int i = 0; i < values.size(); i++) {
sqlBuilder.append(i > 0 ? ",?" : "?");
params.add(values.get(i));
}
sqlBuilder.append(")");
}
return this;
}
// 核心条件拼接逻辑
private void addCondition(String column, Object value, String operator) {
if (value != null && !(value instanceof String && ((String) value).isEmpty())) {
addWhereClause();
sqlBuilder.append(column).append(operator);
params.add(value);
}
}
// 动态添加WHERE关键字
private void addWhereClause() {
if (!whereAdded) {
sqlBuilder.append(" WHERE ");
whereAdded = true;
} else {
sqlBuilder.append(" AND ");
}
}
/**
* 构建最终SQL和参数
* @return 包含SQL字符串和参数数组的对象
*/
public SqlResult build() {
return new SqlResult(sqlBuilder.toString(), params.toArray());
}
// 返回结果封装类
public static class SqlResult {
private final String sql;
private final Object[] params;
public SqlResult(String sql, Object[] params) {
this.sql = sql;
this.params = params;
}
public String getSql() {
return sql;
}
public Object[] getParams() {
return params;
}
}
}
public class TestDemo {
public static void main(String[] args) {
// 1. 基础SQL(必须包含SELECT和FROM)
String baseSql = "SELECT * FROM users";
// 2. 动态构建条件
DynamicSqlBuilder builder = new DynamicSqlBuilder(baseSql)
.eq("status", 1) // 状态为1
.like("name", "张") // 名字包含"张"
.gt("age", 18) // 年龄大于18
.in("department_id", List.of(101, 203)); // 部门ID在列表中
// 3. 获取结果
DynamicSqlBuilder.SqlResult result = builder.build();
// 4. 输出结果
System.out.println("完整SQL: " + result.getSql());
System.out.println("参数数组: " + Arrays.toString(result.getParams()));
}
}
@Test
public void test01(){
String name = "张三";
String pwd = null;
String add = "龙鳞路";
DynamicSqlBuilder dynamicSqlBuilder = new DynamicSqlBuilder("SELECT * FROM users");
dynamicSqlBuilder.eq("name", name);
dynamicSqlBuilder.eq("pwd", pwd);
dynamicSqlBuilder.eq("add", add);
DynamicSqlBuilder.SqlResult result = dynamicSqlBuilder.build();
System.out.println(result.getSql());
Object[] objects = result.getParams();
for (Object obj:objects){
System.out.println(obj);
}
}
完整SQL: SELECT * FROM users WHERE status = ? AND name LIKE ? AND age > ? AND department_id IN (?,?)
参数数组: [1, "%张%", 18, 101, 203]
核心特性
智能条件拼接
自动跳过null或空字符串条件
首次添加条件时自动插入WHERE关键字,后续条件用AND连接
支持=、LIKE、>、IN等常用操作符
防SQL注入设计
所有值通过?占位符处理
参数值独立存储在Object[]数组,符合预编译规范
链式调用
采用builder.eq(...).like(...)的流畅接口风格
类似MyBatis-Plus的Wrapper写法
IN语句优化
自动展开List为(?,?,?)格式
支持任意类型的集合参数
// 正确示例
new DynamicSqlBuilder("SELECT id,name FROM user")
// 错误示例(缺少SELECT/FROM)
new DynamicSqlBuilder("user")
字符串:跳过null和""
数字:跳过null
集合:跳过null和空集合
特殊字符转义如果参数包含%或_等特殊字符,需在调用前转义
.like("name", "100%".replace("%", "\\%"))
public List<Bill> findListBy(Map<String,Object> maps) throws Exception{
List<Bill> billList = new ArrayList<>();
ResultSet rs = query(sql,params);
while(rs.next()){
Bill bill = new Bill();
bill.setId(rs.getInt("id"));
bill.setBillCode(rs.getString("billCode"));
bill.setProductName(rs.getString("productName"));
bill.setProductCount(rs.getInt("productCount"));
bill.setProductUnit(rs.getString("productUnit"));
bill.setProductDesc(rs.getString("productDesc"));
bill.setTotalPrice(rs.getBigDecimal("totalPrice"));
Provider provider = new Provider();
provider.setId(rs.getInt("providerId"));
provider.setProName(rs.getString("proName"));
bill.setProvider(provider);
billList.add(bill);
}
return billList;
}
public class ProviderDaoImpl extends BaseDao implements ProviderDao, BaseInterface<Provider> {
@Override
public Provider findProviderById(Integer id) throws Exception{
String sql = "select id,proName from smbms_provider where id=?";
String billSql = "select id,billCode from smbms_bill where prividerId=?";
Provider provider = null;
ResultSet rs = query(sql,null);
while (rs.next()){
provider = new Provider();
provider.setId(rs.getInt("id"));
provider.setProName(rs.getString("proName"));
ResultSet resultSet = query(billSql,null);
List<Bill> billList = new ArrayList<>();
while(resultSet.next()){
Bill bill = new Bill();
bill.setId(rs.getInt("id"));
bill.setBillCode(rs.getString("billCode"));
billList.add(bill);
}
provider.setList(billList);
}
return provider;
}