当前位置: 代码网 > it编程>编程语言>Java > mybatis直接执行完整sql及踩坑解决

mybatis直接执行完整sql及踩坑解决

2025年09月27日 Java 我要评论
mybatis直接执行完整sql及踩坑开发中有时遇到将表名或者完整sql作为参数去执行,与一般情况下的增删改查传参数或者对象不同,mybatis也是可以直接执行sql语句的,这个时候如何sql的返回值

mybatis直接执行完整sql及踩坑

开发中有时遇到将表名或者完整sql作为参数去执行,与一般情况下的增删改查传参数或者对象不同,mybatis也是可以直接执行sql语句的,这个时候如何sql的返回值不太好处理,大致分为dql和dml两种情况。

select语句采用

list<linkedhashmap<string , object>>接收,这样可以保证查询结果的字段有序输出,查询结果如果是空会返回'[]'

list<linkedhashmap<string , object>> executequerysql(@param("sql") string sql);

count、insert、update等语句用int接收即可

int executecountsql(@param("sql") string sql);

在xml中的标签统一用select即可

如下:

<select id="executequerysql" resulttype="java.util.linkedhashmap" parametertype="string">
        ${sql}
    </select>
    <select id="executecountsql" resulttype="java.lang.integer" parametertype="string">
        ${sql}
    </select>

这时要注意预防sql注入

#{}拼接参数可以很大程度上的防止sql注入,${}却不行,做法可以使用preparestatement预编译进行防范,或者简单粗暴的对sql进行识别过滤一下

例如:

public static boolean sqlvalidate(string sql) {
        string badstr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" +
                "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
                "table|from|grant|use|group_concat|column_name|" +
                "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" +
                "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";//过滤掉的sql关键字,可以手动添加
        string[] badsplit = badstr.split("\\|");
        for (string s : badsplit) {
            if (sql.contains(s)) {
                return true;
            }
        }
        return false;
    }
}

踩坑环节

1、resources目录下的文件夹

一定要一步一步创建或者包中间用/符号分隔,否则就会造成看上去没毛病,但是报错:

org.apache.ibatis.binding.bindingexception: invalid bound statement (not found)

图中user是用mybatis/user创建的,user1是用mybatis.user1创建的,根本看不出来,一不小心就得找bug一小时。。。

2、数据库字段一定不要用关键字

否则在xml中就算用上各种转义符累半天不说,还不一定好使。。。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com