动态执行SQL
问题描述
最近有小伙伴遇到了一个需求,需要将SQL语句保存在数据库中,动态取用SQL。这种需求常用于复杂多变的查询业务,为了减少接口的书写,将SQL保存到库中,通过指定代码动态调用sql。
【注意】这种调用方式虽然方便,但需要注意应用的场景对传参的校验,防止直接替换参数导致的sql注入问题。(本文未讲解防止sql注入)
建库
存sql的表

案例表

预存数据
sql表

用户表

代码
查询接口
@Slf4j
@RestController
@RequestMapping("/system")
public class SqlController {
@Autowired
private SqlArrayService sqlArrayService;
@Autowired
private JdbcTemplate jdbcTemplate;
//动态执行sql
@PostMapping("/excSql")
public R dynamicSql(@RequestParam String sqlType, @RequestBody Map<String,String> params) {
//查询sql
LambdaQueryWrapper<SqlArray> qw = new LambdaQueryWrapper<>();
qw.eq(SqlArray::getCode,sqlType);
SqlArray sqlObj = sqlArrayService.getOne(qw);
String sql = sqlObj.getSqlStr();
//参数替换
Set<String> keys = params.keySet();
for (String key : keys) {
sql = sql.replace("#{"+key+"}",params.get(key));
}
log.info("执行的sql:{}",sql);
//执行sql
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
return R.success("操作成功",result);
}
}
接口测试

本文介绍了如何在Java应用中动态执行存储在数据库中的SQL,通过LambdaQueryWrapper和JdbcTemplate实现,同时强调了防止SQL注入的重要性。作者给出了一个使用SpringBoot的示例代码和接口测试方法。
976

被折叠的 条评论
为什么被折叠?



