动态执行SQL

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

接口测试

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我张小明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值