java自定义sql 格式化工具

java自定义sql 格式化工具author 范春宇 date Createdin202 11 320 06 description sql 占位符替换工具类 modifiedBy publicclassS 替换掉 SQL 注入的那些字符 and or privatestati INJECT CHARS

/ * @author :Frans * @date :Created in 2021/11/3 20:06 * @description: sql占位符替换工具类 * @modified By: */ public class SqlPlaceholderReplaceUtil { 
    / * 替换掉SQL注入的那些字符 ['|;|--| and | or ] */ private static String SQL_INJECT_CHARS = "([';]+|(--)+|(\\s+([aA][nN][dD])\\s+)+|(\\s+([oO][rR])\\s+)+)"; / * 替换{}的sql 也可以支持#{xx} */ private static PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper( "{", "}"); / * 替换占位符 * @param value * @param properties * @return */ public static String replacePlaceholders(String value, final Properties properties) { 
    return helper.replacePlaceholders(value, properties); } / * @author: Frans * @description: 根据问号占位符替换sql * @date 2021/12/3 14:49 * @param sql * @return params */ public static String paddingParam(String sql , List<Object> params) { 
    if(CollectionUtil.isEmpty(params)){ 
    return sql; } //参数个数至少是?个数 int countQuestion = StrUtil.count(sql, "?"); if(countQuestion > params.size()){ 
    throw new IllegalArgumentException("sql need " + countQuestion + " params, but has only " + params.size() + "\r\n" + sql + "\r\n" + params); } // 填充参数 for(int i = 0 , size = params.size(); i < size; i++){ 
    // 1.巧妙利用替换一次之后,后面的?就自动往前移动一位,那么replaceFirst每次替换的就是下一个? // 2.去掉某些特殊符号,防注入 String param = (params.get(i) instanceof Number) ? params.get(i) + "" : "'" + params.get(i).toString().replaceAll(SQL_INJECT_CHARS, "") + "'"; sql = sql.replaceFirst("\\?", param); } return sql; } public static void main(String[] args) { 
    String sql ="select * from sys_user where name = ? and age = ?"; // Properties properties = new Properties(); // properties.setProperty("name","foss"); // properties.setProperty("age","'12'"); String name = "zhangsan"; int age = 12; List<Object> params = new ArrayList<>(); params.add(name); params.add(age); String s = paddingParam(sql, params); System.out.println(s); } 

部分代码转自码云

在网上没有看到解决办法,特此发布,以便于解决诸位码友困扰.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208144.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:15
下一篇 2026年3月19日 下午12:16


相关推荐

  • 史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

    这绝对是整理的最全面最详细最认真最适合用来当笔记的Linux终端命令汇总的文章了

    2022年4月6日
    54
  • scrollIntoView 实现「建议收藏」

    scrollIntoView 实现「建议收藏」1.应用场景: 相信大家都曾经遇到过要将屏幕的某一部分滚到到用户视窗里,例如聊天信息的自动滚屏等,这个有不少解决方案: 1.聊天面板的scrolltop=scrollheight2.消息最后加一个element,然后element.scrollIntoView但是如果想要任一容器中间的一个元素,滚到该容器的视窗显示部分…

    2022年6月28日
    32
  • linux libaio介绍

    linux libaio介绍Linux 的 I O 机制经历了一下几个阶段的演进 1 同步阻塞 I O 用户进程进行 I O 操作 一直阻塞到 I O 操作完成为止 2 同步非阻塞 I O 用户程序可以通过设置文件描述符的属性 O NONBLOCK I O 操作可以立即返回 但是并不保证 I O 操作成功 3 异步事件阻塞 I O 用户进程可以对 I O 事件进行阻塞 但是 I O 操作并不阻塞 通过 select poll epoll 等函数调用来达到此目的 4 异步时间非阻塞 I O 也叫做异步 I O AIO 用户程序可以通过向内核发出 I O 请求

    2026年3月17日
    2
  • css透明度兼容性

    css透明度兼容性出校门快两年了 自己

    2026年3月19日
    3
  • FRP内网穿透_花生壳内网穿透6元

    FRP内网穿透_花生壳内网穿透6元在Web应用上线前都会在内网进行测试,而有些功能是只有在公网上才能做测试的,比如为APP提供的接口等等。所以经常需要在正式上线之前将内网的服务器映射到公网上去。也就是赋予内网上服务器一个域名,开放几个端口。一般来说都使用内网穿透工具完成这个操作,比如在公网上购置一台服务器,不需要配置很高,只要流量够用就行。然后在公网服务器上配置穿透工具的服务端,比如ngrockc或者frp,然后在能接通公网的内网…

    2025年11月7日
    6
  • OPC和DCOM配置

    OPC和DCOM配置系统 使用 win1064 位系统 PDF 文件本文 链接 百度网盘密码 reht Win7 和 Win7 SP1 网络 OPC 配置 链接 百度网盘密码 dhhc 在线参考 英文的网上参考 1 网上参考 2 使用的 OPCServer 服务器 KEPServerV6 链接 百度网盘密码 ykj21 安装 OPC 运行库 KEPServer 集成了 OPC 运行库 所以

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号