package com.baomidou.mybatisplus.toolkit; /** * <p> * StringEscape ,数据库字符串转义 * </p> * * @author Caratacus * @Date 2016-10-16 */ public class StringEscape { /** * 字符串是否需要转义 * * @param str * @param len * @return */ private static boolean isEscapeNeededForString(String str, int len) { boolean needsHexEscape = false; for (int i = 0; i < len; ++i) { char c = str.charAt(i); switch (c) { case 0: /* Must be escaped for 'mysql' */ needsHexEscape = true; break; case '\n': /* Must be escaped for logs */ needsHexEscape = true; break; case '\r': needsHexEscape = true; break; case '\\': needsHexEscape = true; break; case '\'': needsHexEscape = true; break; case '"': /* Better safe than sorry */ needsHexEscape = true; break; case '\032': /* This gives problems on Win32 */ needsHexEscape = true; break; } if (needsHexEscape) { break; // no need to scan more } } return needsHexEscape; } /** * 转义字符串 * * @param escapeStr * @return */ public static String escapeString(String escapeStr) { if (escapeStr.matches("\'(.+)\'")) { escapeStr = escapeStr.substring(1, escapeStr.length() - 1); } String parameterAsString = escapeStr; int stringLength = escapeStr.length(); if (isEscapeNeededForString(escapeStr, stringLength)) { StringBuilder buf = new StringBuilder((int) (escapeStr.length() * 1.1)); // // Note: buf.append(char) is _faster_ than appending in blocks, // because the block append requires a System.arraycopy().... go // figure... // for (int i = 0; i < stringLength; ++i) { char c = escapeStr.charAt(i); switch (c) { case 0: /* Must be escaped for 'mysql' */ buf.append('\\'); buf.append('0'); break; case '\n': /* Must be escaped for logs */ buf.append('\\'); buf.append('n'); break; case '\r': buf.append('\\'); buf.append('r'); break; case '\\': buf.append('\\'); buf.append('\\'); break; case '\'': buf.append('\\'); buf.append('\''); break; case '"': /* Better safe than sorry */ buf.append('\\'); buf.append('"'); break; case '\032': /* This gives problems on Win32 */ buf.append('\\'); buf.append('Z'); break; default: buf.append(c); } } parameterAsString = buf.toString(); } return "\'" + parameterAsString + "\'"; } }