动态执行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);
}
}