StringEscape.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package com.baomidou.mybatisplus.toolkit;
  2. /**
  3. * <p>
  4. * StringEscape ,数据库字符串转义
  5. * </p>
  6. *
  7. * @author Caratacus
  8. * @Date 2016-10-16
  9. */
  10. public class StringEscape {
  11. /**
  12. * <p>
  13. * 字符串是否需要转义
  14. * </p>
  15. *
  16. * @param str
  17. * @param len
  18. * @return
  19. */
  20. private static boolean isEscapeNeededForString(String str, int len) {
  21. boolean needsHexEscape = false;
  22. for (int i = 0; i < len; ++i) {
  23. char c = str.charAt(i);
  24. switch (c) {
  25. /* Must be escaped for 'mysql' */
  26. case 0:
  27. needsHexEscape = true;
  28. break;
  29. /* Must be escaped for logs */
  30. case '\n':
  31. needsHexEscape = true;
  32. break;
  33. case '\r':
  34. needsHexEscape = true;
  35. break;
  36. case '\\':
  37. needsHexEscape = true;
  38. break;
  39. case '\'':
  40. needsHexEscape = true;
  41. break;
  42. /* Better safe than sorry */
  43. case '"':
  44. needsHexEscape = true;
  45. break;
  46. /* This gives problems on Win32 */
  47. case '\032':
  48. needsHexEscape = true;
  49. break;
  50. default:
  51. break;
  52. }
  53. if (needsHexEscape) {
  54. // no need to scan more
  55. break;
  56. }
  57. }
  58. return needsHexEscape;
  59. }
  60. /**
  61. * 转义字符串
  62. *
  63. * @param escapeStr
  64. * @return
  65. */
  66. public static String escapeString(String escapeStr) {
  67. if (escapeStr.matches("\'(.+)\'")) {
  68. escapeStr = escapeStr.substring(1, escapeStr.length() - 1);
  69. }
  70. String parameterAsString = escapeStr;
  71. int stringLength = escapeStr.length();
  72. if (isEscapeNeededForString(escapeStr, stringLength)) {
  73. StringBuilder buf = new StringBuilder((int) (escapeStr.length() * 1.1));
  74. //
  75. // Note: buf.append(char) is _faster_ than appending in blocks,
  76. // because the block append requires a System.arraycopy().... go
  77. // figure...
  78. //
  79. for (int i = 0; i < stringLength; ++i) {
  80. char c = escapeStr.charAt(i);
  81. switch (c) {
  82. /* Must be escaped for 'mysql' */
  83. case 0:
  84. buf.append('\\');
  85. buf.append('0');
  86. break;
  87. /* Must be escaped for logs */
  88. case '\n':
  89. buf.append('\\');
  90. buf.append('n');
  91. break;
  92. case '\r':
  93. buf.append('\\');
  94. buf.append('r');
  95. break;
  96. case '\\':
  97. buf.append('\\');
  98. buf.append('\\');
  99. break;
  100. case '\'':
  101. buf.append('\\');
  102. buf.append('\'');
  103. break;
  104. /* Better safe than sorry */
  105. case '"':
  106. buf.append('\\');
  107. buf.append('"');
  108. break;
  109. /* This gives problems on Win32 */
  110. case '\032':
  111. buf.append('\\');
  112. buf.append('Z');
  113. break;
  114. default:
  115. buf.append(c);
  116. }
  117. }
  118. parameterAsString = buf.toString();
  119. }
  120. return "\'" + parameterAsString + "\'";
  121. }
  122. }