mybatis直接执行完整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中就算用上各种转义符累半天不说,还不一定好使。。。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot2.0解决Long型数据转换成json格式时丢失精度问题
这篇文章主要介绍了SpringBoot2.0解决Long型数据转换成json格式时丢失精度问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-06-06
SpringBoot整合Mybatis实现多数据源配置与跨数据源事务实例
开发中经常有这样的需要: 读写分离。微服务环境下可以实现一个服务读取一个数据库,另一个服务写库。但是在实际应用中有时也需要在一个服务中读写不同的数据库。可以在一个SpringBoot单体项目中配置多个数据源解决读写库分离2022-11-11
springboot+angular4前后端分离 跨域问题解决详解
这篇文章主要介绍了springboot+angular4前后端分离 跨域问题解决详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-09-09
Java Bluetooth 蓝牙通讯 BlueCove 扫描附近的蓝牙设备(测试代码)
BlueCove是一个开源的蓝牙协议栈实现,旨在为Java开发者提供一个全面的、易于使用的API,从而在应用程序中实现蓝牙功能,该项目支持多种操作系统,这篇文章主要介绍了Java Bluetooth 蓝牙通讯 BlueCove 扫描附近的蓝牙设备,需要的朋友可以参考下2025-01-01


最新评论