开发者

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

目录
  • myBATiFBNZQs直接执行完整sql及踩坑
    • select语句采用
    • count、insert、update等语句用int接收即可
    • 在XML中的标签统一用select即可
    • 这时要注意预防sql注入
  • 踩坑环节
    • 1、resources目录下的文件夹
    • 2、数据库字段一定不要用关键字
  • 总结

    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"&gFBNZQt;
            ${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|xppython_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|*|" +
            www.devze.com        "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)

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

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

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

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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜