JeecgBoot JimuReport 动态SQL条件处理技巧
还在为复杂的报表查询条件而烦恼吗?每次业务需求变更都要重新修改SQL语句?JeecgBoot JimuReport(积木报表)提供了强大的动态SQL条件处理能力,让你轻松应对各种复杂的查询场景!
读完本文你将掌握:
- ✅ 动态SQL参数的基本使用方法
- ✅ 多种条件组合的灵活配置技巧
- ✅ 复杂业务场景下的参数处理方案
- ✅ 避免SQL注入的安全最佳实践
- ✅ 性能优化的实用建议
一、动态SQL参数基础语法
JimuReport支持多种参数语法格式,满足不同场景需求:
1.1 基础参数语法
-- 简单参数引用
SELECT * FROM user WHERE name = ${name}
-- 日期范围查询
SELECT * FROM orders
WHERE order_date BETWEEN ${startDate} AND ${endDate}
-- 多条件组合
SELECT * FROM products
WHERE category = ${category}
AND price > ${minPrice}
AND status = ${status}
1.2 参数类型说明
JimuReport支持多种参数类型:
| 参数类型 | 语法示例 | 适用场景 |
|---|---|---|
| 字符串参数 | ${param} | 文本查询、模糊匹配 |
| 数字参数 | ${numberParam} | 数值范围、精确匹配 |
| 日期参数 | ${dateParam} | 时间范围筛选 |
| 布尔参数 | ${boolParam} | 状态开关控制 |
| 列表参数 | ${listParam} | 多选条件查询 |
二、高级条件处理技巧
2.1 条件判断与动态WHERE
SELECT * FROM sales_data
WHERE 1=1
-- 区域条件判断
<#if region?? && region != ''>
AND region = ${region}
</#if>
-- 时间范围条件
<#if startTime?? && endTime??>
AND create_time BETWEEN ${startTime} AND ${endTime}
</#if>
-- 多值选择条件
<#if categoryList?? && categoryList?size > 0>
AND category IN (
<#list categoryList as category>
${category}<#if category_has_next>,</#if>
</#list>
)
</#if>
2.2 复杂业务逻辑处理
-- 动态排序条件
SELECT * FROM employee
WHERE department = ${dept}
<#if orderBy??>
ORDER BY
<#if orderBy == 'name'>
employee_name
<#elseif orderBy == 'salary'>
salary DESC
<#else>
hire_date DESC
</#if>
</#if>
-- 分页查询优化
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM (
SELECT * FROM large_table
WHERE status = ${status}
<#if keyword??>
AND (title LIKE '%${keyword}%' OR content LIKE '%${keyword}%')
</#if>
ORDER BY create_time DESC
) t WHERE ROWNUM <= ${pageSize} * ${pageNo}
) WHERE rn > ${pageSize} * (${pageNo} - 1)
三、安全防护最佳实践
3.1 SQL注入防护
-- 错误示例:存在SQL注入风险
SELECT * FROM users WHERE username = '${userInput}'
-- 正确示例:使用参数化查询
SELECT * FROM users WHERE username = ${userInput}
-- 模糊查询安全写法
SELECT * FROM products
WHERE name LIKE CONCAT('%', ${keyword}, '%')
-- 数字类型验证
<#if id?? && id?matches("^\\d+$")>
AND user_id = ${id}
</#if>
3.2 参数验证与过滤
-- 参数有效性检查
<#if !minPrice?? || !minPrice?matches("^\\d+(\\.\\d{1,2})?$")>
<#assign minPrice = 0>
</#if>
<#if !maxPrice?? || !maxPrice?matches("^\\d+(\\.\\d{1,2})?$")>
<#assign maxPrice = 999999>
</#if>
SELECT * FROM products
WHERE price BETWEEN ${minPrice} AND ${maxPrice}
四、性能优化策略
4.1 索引优化建议
-- 为常用查询条件创建索引
CREATE INDEX idx_user_status ON users(status);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_product_category ON products(category);
-- 复合索引优化
CREATE INDEX idx_sales_region_date ON sales(region, sale_date);
4.2 查询性能优化
-- 避免全表扫描
SELECT * FROM large_table
WHERE create_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
AND status = ${status}
-- 分页查询优化
SELECT * FROM (
SELECT id, name, ROW_NUMBER() OVER (ORDER BY create_time DESC) as rn
FROM user_activities
WHERE user_id = ${userId}
) t WHERE rn BETWEEN ${start} AND ${end}
五、实战案例解析
5.1 电商订单查询系统
-- 多条件动态查询
SELECT
o.order_id,
o.order_amount,
o.order_status,
u.username,
o.create_time
FROM orders o
LEFT JOIN users u ON o.user_id = u.user_id
WHERE 1=1
-- 时间范围条件
<#if startDate?? && endDate??>
AND o.create_time BETWEEN ${startDate} AND ${endDate}
</#if>
-- 订单状态筛选
<#if orderStatus?? && orderStatus != ''>
AND o.order_status = ${orderStatus}
</#if>
-- 金额范围筛选
<#if minAmount??>
AND o.order_amount >= ${minAmount}
</#if>
<#if maxAmount??>
AND o.order_amount <= ${maxAmount}
</#if>
-- 用户信息筛选
<#if username?? && username != ''>
AND u.username LIKE CONCAT('%', ${username}, '%')
</#if>
ORDER BY o.create_time DESC
5.2 人力资源报表系统
-- 员工信息统计报表
SELECT
d.department_name,
COUNT(e.emp_id) as total_employees,
AVG(e.salary) as avg_salary,
MAX(e.salary) as max_salary,
MIN(e.salary) as min_salary
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE 1=1
-- 部门筛选
<#if departmentId?? && departmentId != ''>
AND e.department_id = ${departmentId}
</#if>
-- 入职时间范围
<#if hireStartDate?? && hireEndDate??>
AND e.hire_date BETWEEN ${hireStartDate} AND ${hireEndDate}
</#if>
-- 薪资范围筛选
<#if minSalary??>
AND e.salary >= ${minSalary}
</#if>
<#if maxSalary??>
AND e.salary <= ${maxSalary}
</#if>
-- 教育背景筛选
<#if educationLevel?? && educationLevel != ''>
AND e.education_level = ${educationLevel}
</#if>
GROUP BY d.department_name
ORDER BY total_employees DESC
六、常见问题与解决方案
6.1 参数为空处理
-- 默认值处理技巧
<#if !pageSize?? || pageSize?number <= 0>
<#assign pageSize = 20>
</#if>
<#if !pageNo?? || pageNo?number <= 0>
<#assign pageNo = 1>
</#if>
6.2 多值参数处理
-- 多选列表参数处理
<#if statusList?? && statusList?size > 0>
AND status IN (
<#list statusList as status>
${status}<#if status_has_next>,</#if>
</#list>
)
<#else>
AND status IN (1, 2, 3) -- 默认值
</#if>
6.3 日期参数格式化
-- 日期格式统一处理
<#if startDate??>
AND DATE(create_time) >= DATE(${startDate})
</#if>
<#if endDate??>
AND DATE(create_time) <= DATE(${endDate})
</#if>
总结
JimuReport的动态SQL条件处理功能为企业级报表开发提供了强大的灵活性。通过本文介绍的技巧,你可以:
- 提升开发效率:减少重复代码,快速响应业务需求变化
- 增强系统安全性:有效防止SQL注入攻击
- 优化查询性能:合理利用数据库索引,提升报表响应速度
- 改善用户体验:提供灵活的多条件组合查询能力
记住这些最佳实践,让你的报表系统更加健壮和高效!在实际项目中,根据具体业务场景选择合适的参数处理方案,并持续优化查询性能。
提示:建议在开发过程中使用JimuReport提供的SQL调试功能,实时验证动态SQL的正确性和性能表现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



