• 如何在 Java 中编写命名参数化查询


    How To Write Named Parameterized Query In Java

    在java中,对于大查询,创建参数化查询并不容易,因为JAVA JDBC API接口PreparedStatement只支持通过索引传递参数。 

    为了克服这个限制,我们将创建自定义类,使我们能够按名称将参数传递给查询。让我们看看手头的问题是什么,然后我们将讨论解决方案。

    为什么我们需要参数化查询?

    在 Java 中,要执行 sql 查询,我们必须创建语句,然后我们可以执行该语句以从数据库中选择、插入、更新或删除数据。但是,不推荐这种方法,因为 java 语句不带任何参数,因此无法防止 SQL 注入。

    1. /*
    2. * Here, we inserted static values in query. In your case these values might come from user input.
    3. * Here, we are directly concatinating the values in the query. Hence, It's not SQL injection safe.
    4. */
    5. String sqlQuery = " INSERT INTO employee (id, name, designation, salary)"
    6. + " VALUES('1', 'Dwayne Johnson', 'Project Manager', '250000')";
    7. Statement stmt = conn.createStatement();
    8. stmt.executeUpdate(sqlQuery);
    9. stmt.close();

    为了防止 SQL 注入,我们必须编写参数化查询。要在 java 中创建参数化查询,我们有 PreparedStatement。它可以通过在查询中传递问号 (?) 来获取参数,然后将每个问号索引替换为所需的值。

    1. /*
    2. * Here, we assigned static values in parameter. In your case these values might come from user input.
    3. * Here, we are not directly concatinating the values in the query. Hence, It's SQL injection safe.
    4. */
    5. String sqlQuery = " INSERT INTO employee (id, name, designation, salary)"
    6. + " VALUES(?, ?, ?, ?)";
    7. PreparedStatement prepStmt = conn.prepareStatement(sqlQuery);
    8. prepStmt.setLong(1, 1);
    9. prepStmt.setString(2, "Dwayne Jhonson");
    10. prepStmt.setString(3, "Team Leader");
    11. prepStmt.setDouble(4, 10000);
    12. prepStmt.executeUpdate();
    13. prepStmt.close();

    为什么我们需要命名参数化查询?

    正如您在上面的示例中看到的,PreparedStatement 使用问号的索引将参数传递给查询。需要时间,因为您必须计算索引以传递值,如果您的查询中有太多列来计算查询中每列的索引,情况会变得更糟。如果我们可以做这样的事情—— 

    1. /*
    2. * This code is just to show requirement. PreparedStatement in java JDBC API does not support this syntax to set parameters
    3. */
    4. String sqlQuery = " INSERT INTO employee (id, name, designation, salary)"
    5. + " VALUES(:id, :name, :designation, :salary)";
    6. PreparedStatement prepStmt = conn.prepareStatement(sqlQuery);
    7. prepStmt.setLong("id", 1);
    8. prepStmt.setString("name", "Dwayne Jhonson");
    9. prepStmt.setString("designation", "Team Leader");
    10. prepStmt.setDouble("salary", 10000);
    11. prepStmt.executeUpdate();
    12. prepStmt.close();

    但是,PreparedStatement 不支持按名称设置参数。因此,我们必须创建自定义的 PreparedStatement 类,该类将为我们提供按名称设置参数的功能。

    在一分钟内创建您的第一个命名参数化查询

    下面,我展示了我为编写参数化查询而创建的两个自定义类 - 

    只需在您的项目中创建这两个类,您就可以像这样在一分钟内创建参数化查询 - 

    1. String sqlQuery = " INSERT INTO employee (id, name, designation, salary)"
    2. + " VALUES(:id, :name, :designation, :salary)";
    3. PreparedStatement prepStmt = NamedPreparedStatement.prepareStatement(connection, sqlQuery);
    4. prepStmt.setLong("id", 1);
    5. prepStmt.setString("name", "Dwayne Jhonson");
    6. prepStmt.setString("designation", "Team Leader");
    7. prepStmt.setDouble("salary", 10000);
    8. prepStmt.executeUpdate();
    9. prepStmt.close();

    你不需要知道这些类是如何工作的。您可以创建这些类并开始使用它们,如上例所示。但是,作为一名程序员,您应该尝试了解它是如何工作的。这种方法很简单,因为您不必计算列的索引,并且您可以随时更改列的顺序。

    NamedPreparedStatement.java

    1. package com.codemeright.namedPerameterizedQuery;
    2. import java.math.BigDecimal;
    3. import java.sql.Connection;
    4. import java.sql.Date;
    5. import java.sql.PreparedStatement;
    6. import java.sql.SQLException;
    7. import java.sql.Time;
    8. import java.sql.Timestamp;
    9. import java.text.SimpleDateFormat;
    10. import java.util.ArrayList;
    11. import java.util.Collection;
    12. import java.util.List;
    13. import java.util.regex.Matcher;
    14. public class NamedPreparedStatement extends PreparedStatementImpl {
    15. private enum FormatType {
    16. NULL, BOOLEAN, BYTE, SHORT, INTEGER, LONG, FLOAT, DOUBLE, BIGDECIMAL, STRING, STRINGLIST, DATE, TIME, TIMESTAMP
    17. }
    18. private String originalSQL;
    19. private final List lstParameters;
    20. public static NamedPreparedStatement prepareStatement(Connection conn, String sql) throws SQLException {
    21. List orderedParameters = new ArrayList();
    22. int length = sql.length();
    23. StringBuffer parsedQuery = new StringBuffer(length);
    24. boolean inSingleQuote = false;
    25. boolean inDoubleQuote = false;
    26. boolean inSingleLineComment = false;
    27. boolean inMultiLineComment = false;
    28. for (int i = 0; i < length; i++) {
    29. char c = sql.charAt(i);
    30. if (inSingleQuote) {
    31. if (c == '\'') {
    32. inSingleQuote = false;
    33. }
    34. } else if (inDoubleQuote) {
    35. if (c == '"') {
    36. inDoubleQuote = false;
    37. }
    38. } else if (inMultiLineComment) {
    39. if (c == '*' && sql.charAt(i + 1) == '/') {
    40. inMultiLineComment = false;
    41. }
    42. } else if (inSingleLineComment) {
    43. if (c == '\n') {
    44. inSingleLineComment = false;
    45. }
    46. } else if (c == '\'') {
    47. inSingleQuote = true;
    48. } else if (c == '"') {
    49. inDoubleQuote = true;
    50. } else if (c == '/' && sql.charAt(i + 1) == '*') {
    51. inMultiLineComment = true;
    52. } else if (c == '-' && sql.charAt(i + 1) == '-') {
    53. inSingleLineComment = true;
    54. } else if (c == ':' && i + 1 < length && Character.isJavaIdentifierStart(sql.charAt(i + 1))) {
    55. int j = i + 2;
    56. while (j < length && Character.isJavaIdentifierPart(sql.charAt(j))) {
    57. j++;
    58. }
    59. String name = sql.substring(i + 1, j);
    60. orderedParameters.add(name);
    61. c = '?';
    62. i += name.length();
    63. }
    64. parsedQuery.append(c);
    65. }
    66. return new NamedPreparedStatement(conn.prepareStatement(parsedQuery.toString()), sql, orderedParameters);
    67. }
    68. private NamedPreparedStatement(PreparedStatement preparedStatement, String originalSQL, List orderedParameters) {
    69. super(preparedStatement);
    70. this.originalSQL = originalSQL.trim();
    71. this.lstParameters = orderedParameters;
    72. }
    73. private Collection getParameterIndexes(String parameter) {
    74. Collection indexes = new ArrayList();
    75. for (int i = 0; i < lstParameters.size(); i++) {
    76. if (lstParameters.get(i).equalsIgnoreCase(parameter)) {
    77. indexes.add(i + 1);
    78. }
    79. }
    80. if (indexes.isEmpty()) {
    81. throw new IllegalArgumentException(String.format("SQL statement doesn't contain the parameter '%s'",
    82. parameter));
    83. }
    84. return indexes;
    85. }
    86. public void setNull(String parameter, int sqlType) throws SQLException {
    87. for (Integer i : getParameterIndexes(parameter)) {
    88. getPreparedStatement().setNull(i, sqlType);
    89. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((String) null, FormatType.NULL)));
    90. }
    91. }
    92. public void setBoolean(String parameter, boolean x) throws SQLException {
    93. for (Integer i : getParameterIndexes(parameter)) {
    94. getPreparedStatement().setBoolean(i, x);
    95. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Boolean) x, FormatType.BOOLEAN)));
    96. }
    97. }
    98. public void setByte(String parameter, byte x) throws SQLException {
    99. for (Integer i : getParameterIndexes(parameter)) {
    100. getPreparedStatement().setByte(i, x);
    101. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Byte) x, FormatType.BYTE)));
    102. }
    103. }
    104. public void setShort(String parameter, short x) throws SQLException {
    105. for (Integer i : getParameterIndexes(parameter)) {
    106. getPreparedStatement().setShort(i, x);
    107. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Short) x, FormatType.SHORT)));
    108. }
    109. }
    110. public void setInt(String parameter, int x) throws SQLException {
    111. for (Integer i : getParameterIndexes(parameter)) {
    112. getPreparedStatement().setInt(i, x);
    113. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Integer) x, FormatType.INTEGER)));
    114. }
    115. }
    116. public void setLong(String parameter, long x) throws SQLException {
    117. for (Integer i : getParameterIndexes(parameter)) {
    118. getPreparedStatement().setLong(i, x);
    119. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Long) x, FormatType.LONG)));
    120. }
    121. }
    122. public void setFloat(String parameter, float x) throws SQLException {
    123. for (Integer i : getParameterIndexes(parameter)) {
    124. getPreparedStatement().setFloat(i, x);
    125. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Float) x, FormatType.FLOAT)));
    126. }
    127. }
    128. public void setDouble(String parameter, double x) throws SQLException {
    129. for (Integer i : getParameterIndexes(parameter)) {
    130. getPreparedStatement().setDouble(i, x);
    131. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Double) x, FormatType.DOUBLE)));
    132. }
    133. }
    134. public void setBigDecimal(String parameter, BigDecimal x) throws SQLException {
    135. for (Integer i : getParameterIndexes(parameter)) {
    136. getPreparedStatement().setBigDecimal(i, x);
    137. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((BigDecimal) x, FormatType.BIGDECIMAL)));
    138. }
    139. }
    140. public void setString(String parameter, String x) throws SQLException {
    141. for (Integer i : getParameterIndexes(parameter)) {
    142. getPreparedStatement().setString(i, x);
    143. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((String) x, FormatType.STRING)));
    144. }
    145. }
    146. public void setBytes(String parameter, byte[] x) throws SQLException {
    147. for (Integer i : getParameterIndexes(parameter)) {
    148. getPreparedStatement().setBytes(i, x);
    149. String fval = "";
    150. for (int j = 0; j < x.length; j++) {
    151. fval += (char) x[j] + ",";
    152. }
    153. if (fval.endsWith(",")) {
    154. fval = fval.substring(0, fval.length() - 1);
    155. }
    156. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((String) fval, FormatType.STRING)));
    157. }
    158. }
    159. public void setDate(String parameter, Date x) throws SQLException {
    160. for (Integer i : getParameterIndexes(parameter)) {
    161. getPreparedStatement().setDate(i, x);
    162. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Date) x, FormatType.DATE)));
    163. }
    164. }
    165. public void setTime(String parameter, Time x) throws SQLException {
    166. for (Integer i : getParameterIndexes(parameter)) {
    167. getPreparedStatement().setTime(i, x);
    168. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Time) x, FormatType.TIME)));
    169. }
    170. }
    171. public void setTimestamp(String parameter, Timestamp x) throws SQLException {
    172. for (Integer i : getParameterIndexes(parameter)) {
    173. getPreparedStatement().setTimestamp(i, x);
    174. this.originalSQL = this.originalSQL.replaceFirst("(?i):" + parameter, Matcher.quoteReplacement(format((Timestamp) x, FormatType.TIMESTAMP)));
    175. }
    176. }
    177. public String getQuery() {
    178. return this.originalSQL.trim();
    179. }
    180. private String format(Object o, FormatType type) {
    181. String returnParam = "";
    182. try {
    183. switch (type) {
    184. case NULL:
    185. returnParam = "NULL";
    186. break;
    187. case BIGDECIMAL:
    188. returnParam = ((o == null) ? "NULL" : "'" + ((BigDecimal) o).toString() + "'");
    189. break;
    190. case BOOLEAN:
    191. returnParam = ((o == null) ? "NULL" : "'" + (((Boolean) o == Boolean.TRUE) ? "1" : "0") + "'");
    192. break;
    193. case BYTE:
    194. returnParam = ((o == null) ? "NULL" : "'" + ((Byte) o).intValue() + "'");
    195. break;
    196. case DATE:
    197. returnParam = ((o == null) ? "NULL" : "'" + new SimpleDateFormat("yyyy-MM-dd").format((Date) o) + "'");
    198. break;
    199. case DOUBLE:
    200. returnParam = ((o == null) ? "NULL" : "'" + ((Double) o).toString() + "'");
    201. break;
    202. case FLOAT:
    203. returnParam = ((o == null) ? "NULL" : "'" + ((Float) o).toString() + "'");
    204. break;
    205. case INTEGER:
    206. returnParam = ((o == null) ? "NULL" : "'" + ((Integer) o).toString() + "'");
    207. break;
    208. case LONG:
    209. returnParam = ((o == null) ? "NULL" : "'" + ((Long) o).toString() + "'");
    210. break;
    211. case SHORT:
    212. returnParam = ((o == null) ? "NULL" : "'" + ((Short) o).toString() + "'");
    213. break;
    214. case STRING:
    215. returnParam = ((o == null) ? "NULL" : "'" + o.toString() + "'");
    216. break;
    217. case STRINGLIST:
    218. returnParam = ((o == null) ? "NULL" : "'" + o.toString() + "'");
    219. break;
    220. case TIME:
    221. returnParam = ((o == null) ? "NULL" : "'" + new SimpleDateFormat("hh:mm:ss a").format(o) + "'");
    222. break;
    223. case TIMESTAMP:
    224. returnParam = ((o == null) ? "NULL" : "'" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a").format(o) + "'");
    225. break;
    226. default:
    227. break;
    228. }
    229. } catch (Exception ex) {
    230. ex.printStackTrace();
    231. }
    232. return returnParam.trim();
    233. }
    234. }

    PreparedStatementImpl.java

    1. package com.codemeright.namedPerameterizedQuery;
    2. import java.io.InputStream;
    3. import java.io.Reader;
    4. import java.math.BigDecimal;
    5. import java.net.URL;
    6. import java.sql.Array;
    7. import java.sql.Blob;
    8. import java.sql.Clob;
    9. import java.sql.Connection;
    10. import java.sql.Date;
    11. import java.sql.NClob;
    12. import java.sql.ParameterMetaData;
    13. import java.sql.PreparedStatement;
    14. import java.sql.Ref;
    15. import java.sql.ResultSet;
    16. import java.sql.ResultSetMetaData;
    17. import java.sql.RowId;
    18. import java.sql.SQLException;
    19. import java.sql.SQLWarning;
    20. import java.sql.SQLXML;
    21. import java.sql.Time;
    22. import java.sql.Timestamp;
    23. import java.util.Calendar;
    24. class PreparedStatementImpl implements PreparedStatement {
    25. private final PreparedStatement preparedStatement;
    26. protected PreparedStatement getPreparedStatement() {
    27. return preparedStatement;
    28. }
    29. public PreparedStatementImpl(PreparedStatement preparedStatement) {
    30. this.preparedStatement = preparedStatement;
    31. }
    32. @Override
    33. public T unwrap(Class iface) throws SQLException {
    34. return preparedStatement.unwrap(iface);
    35. }
    36. @Override
    37. public ResultSet executeQuery(String sql) throws SQLException {
    38. return preparedStatement.executeQuery(sql);
    39. }
    40. @Override
    41. public ResultSet executeQuery() throws SQLException {
    42. return preparedStatement.executeQuery();
    43. }
    44. @Override
    45. public boolean isWrapperFor(Class iface) throws SQLException {
    46. return preparedStatement.isWrapperFor(iface);
    47. }
    48. @Override
    49. public int executeUpdate(String sql) throws SQLException {
    50. return preparedStatement.executeUpdate(sql);
    51. }
    52. @Override
    53. public int executeUpdate() throws SQLException {
    54. return preparedStatement.executeUpdate();
    55. }
    56. @Override
    57. public void setNull(int parameterIndex, int sqlType) throws SQLException {
    58. preparedStatement.setNull(parameterIndex, sqlType);
    59. }
    60. @Override
    61. public void close() throws SQLException {
    62. preparedStatement.close();
    63. }
    64. @Override
    65. public int getMaxFieldSize() throws SQLException {
    66. return preparedStatement.getMaxFieldSize();
    67. }
    68. @Override
    69. public void setBoolean(int parameterIndex, boolean x) throws SQLException {
    70. preparedStatement.setBoolean(parameterIndex, x);
    71. }
    72. @Override
    73. public void setByte(int parameterIndex, byte x) throws SQLException {
    74. preparedStatement.setByte(parameterIndex, x);
    75. }
    76. @Override
    77. public void setMaxFieldSize(int max) throws SQLException {
    78. preparedStatement.setMaxFieldSize(max);
    79. }
    80. @Override
    81. public void setShort(int parameterIndex, short x) throws SQLException {
    82. preparedStatement.setShort(parameterIndex, x);
    83. }
    84. @Override
    85. public int getMaxRows() throws SQLException {
    86. return preparedStatement.getMaxRows();
    87. }
    88. @Override
    89. public void setInt(int parameterIndex, int x) throws SQLException {
    90. preparedStatement.setInt(parameterIndex, x);
    91. }
    92. @Override
    93. public void setMaxRows(int max) throws SQLException {
    94. preparedStatement.setMaxRows(max);
    95. }
    96. @Override
    97. public void setLong(int parameterIndex, long x) throws SQLException {
    98. preparedStatement.setLong(parameterIndex, x);
    99. }
    100. @Override
    101. public void setEscapeProcessing(boolean enable) throws SQLException {
    102. preparedStatement.setEscapeProcessing(enable);
    103. }
    104. @Override
    105. public void setFloat(int parameterIndex, float x) throws SQLException {
    106. preparedStatement.setFloat(parameterIndex, x);
    107. }
    108. @Override
    109. public void setDouble(int parameterIndex, double x) throws SQLException {
    110. preparedStatement.setDouble(parameterIndex, x);
    111. }
    112. @Override
    113. public int getQueryTimeout() throws SQLException {
    114. return preparedStatement.getQueryTimeout();
    115. }
    116. @Override
    117. public void setQueryTimeout(int seconds) throws SQLException {
    118. preparedStatement.setQueryTimeout(seconds);
    119. }
    120. @Override
    121. public void setBigDecimal(int parameterIndex, BigDecimal x)
    122. throws SQLException {
    123. preparedStatement.setBigDecimal(parameterIndex, x);
    124. }
    125. @Override
    126. public void setString(int parameterIndex, String x) throws SQLException {
    127. preparedStatement.setString(parameterIndex, x);
    128. }
    129. @Override
    130. public void setBytes(int parameterIndex, byte[] x) throws SQLException {
    131. preparedStatement.setBytes(parameterIndex, x);
    132. }
    133. @Override
    134. public void cancel() throws SQLException {
    135. preparedStatement.cancel();
    136. }
    137. @Override
    138. public SQLWarning getWarnings() throws SQLException {
    139. return preparedStatement.getWarnings();
    140. }
    141. @Override
    142. public void setDate(int parameterIndex, Date x) throws SQLException {
    143. preparedStatement.setDate(parameterIndex, x);
    144. }
    145. @Override
    146. public void setTime(int parameterIndex, Time x) throws SQLException {
    147. preparedStatement.setTime(parameterIndex, x);
    148. }
    149. @Override
    150. public void clearWarnings() throws SQLException {
    151. preparedStatement.clearWarnings();
    152. }
    153. @Override
    154. public void setCursorName(String name) throws SQLException {
    155. preparedStatement.setCursorName(name);
    156. }
    157. @Override
    158. public void setTimestamp(int parameterIndex, Timestamp x)
    159. throws SQLException {
    160. preparedStatement.setTimestamp(parameterIndex, x);
    161. }
    162. @Override
    163. public void setAsciiStream(int parameterIndex, InputStream x, int length)
    164. throws SQLException {
    165. preparedStatement.setAsciiStream(parameterIndex, x, length);
    166. }
    167. @Override
    168. public boolean execute(String sql) throws SQLException {
    169. return preparedStatement.execute(sql);
    170. }
    171. @Deprecated
    172. @Override
    173. public void setUnicodeStream(int parameterIndex, InputStream x, int length)
    174. throws SQLException {
    175. preparedStatement.setUnicodeStream(parameterIndex, x, length);
    176. }
    177. @Override
    178. public ResultSet getResultSet() throws SQLException {
    179. return preparedStatement.getResultSet();
    180. }
    181. @Override
    182. public void setBinaryStream(int parameterIndex, InputStream x, int length)
    183. throws SQLException {
    184. preparedStatement.setBinaryStream(parameterIndex, x, length);
    185. }
    186. @Override
    187. public int getUpdateCount() throws SQLException {
    188. return preparedStatement.getUpdateCount();
    189. }
    190. @Override
    191. public boolean getMoreResults() throws SQLException {
    192. return preparedStatement.getMoreResults();
    193. }
    194. @Override
    195. public void clearParameters() throws SQLException {
    196. preparedStatement.clearParameters();
    197. }
    198. @Override
    199. public void setObject(int parameterIndex, Object x, int targetSqlType)
    200. throws SQLException {
    201. preparedStatement.setObject(parameterIndex, x, targetSqlType);
    202. }
    203. @Override
    204. public void setFetchDirection(int direction) throws SQLException {
    205. preparedStatement.setFetchDirection(direction);
    206. }
    207. @Override
    208. public int getFetchDirection() throws SQLException {
    209. return preparedStatement.getFetchDirection();
    210. }
    211. @Override
    212. public void setObject(int parameterIndex, Object x) throws SQLException {
    213. preparedStatement.setObject(parameterIndex, x);
    214. }
    215. @Override
    216. public void setFetchSize(int rows) throws SQLException {
    217. preparedStatement.setFetchSize(rows);
    218. }
    219. @Override
    220. public int getFetchSize() throws SQLException {
    221. return preparedStatement.getFetchSize();
    222. }
    223. @Override
    224. public int getResultSetConcurrency() throws SQLException {
    225. return preparedStatement.getResultSetConcurrency();
    226. }
    227. @Override
    228. public boolean execute() throws SQLException {
    229. return preparedStatement.execute();
    230. }
    231. @Override
    232. public int getResultSetType() throws SQLException {
    233. return preparedStatement.getResultSetType();
    234. }
    235. @Override
    236. public void addBatch(String sql) throws SQLException {
    237. preparedStatement.addBatch(sql);
    238. }
    239. @Override
    240. public void clearBatch() throws SQLException {
    241. preparedStatement.clearBatch();
    242. }
    243. @Override
    244. public void addBatch() throws SQLException {
    245. preparedStatement.addBatch();
    246. }
    247. @Override
    248. public int[] executeBatch() throws SQLException {
    249. return preparedStatement.executeBatch();
    250. }
    251. @Override
    252. public void setCharacterStream(int parameterIndex, Reader reader, int length)
    253. throws SQLException {
    254. preparedStatement.setCharacterStream(parameterIndex, reader, length);
    255. }
    256. @Override
    257. public void setRef(int parameterIndex, Ref x) throws SQLException {
    258. preparedStatement.setRef(parameterIndex, x);
    259. }
    260. @Override
    261. public void setBlob(int parameterIndex, Blob x) throws SQLException {
    262. preparedStatement.setBlob(parameterIndex, x);
    263. }
    264. @Override
    265. public void setClob(int parameterIndex, Clob x) throws SQLException {
    266. preparedStatement.setClob(parameterIndex, x);
    267. }
    268. @Override
    269. public Connection getConnection() throws SQLException {
    270. return preparedStatement.getConnection();
    271. }
    272. @Override
    273. public void setArray(int parameterIndex, Array x) throws SQLException {
    274. preparedStatement.setArray(parameterIndex, x);
    275. }
    276. @Override
    277. public ResultSetMetaData getMetaData() throws SQLException {
    278. return preparedStatement.getMetaData();
    279. }
    280. @Override
    281. public boolean getMoreResults(int current) throws SQLException {
    282. return preparedStatement.getMoreResults(current);
    283. }
    284. @Override
    285. public void setDate(int parameterIndex, Date x, Calendar cal)
    286. throws SQLException {
    287. preparedStatement.setDate(parameterIndex, x, cal);
    288. }
    289. @Override
    290. public ResultSet getGeneratedKeys() throws SQLException {
    291. return preparedStatement.getGeneratedKeys();
    292. }
    293. @Override
    294. public void setTime(int parameterIndex, Time x, Calendar cal)
    295. throws SQLException {
    296. preparedStatement.setTime(parameterIndex, x, cal);
    297. }
    298. @Override
    299. public int executeUpdate(String sql, int autoGeneratedKeys)
    300. throws SQLException {
    301. return preparedStatement.executeUpdate(sql, autoGeneratedKeys);
    302. }
    303. @Override
    304. public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
    305. throws SQLException {
    306. preparedStatement.setTimestamp(parameterIndex, x, cal);
    307. }
    308. @Override
    309. public void setNull(int parameterIndex, int sqlType, String typeName)
    310. throws SQLException {
    311. preparedStatement.setNull(parameterIndex, sqlType, typeName);
    312. }
    313. @Override
    314. public int executeUpdate(String sql, int[] columnIndexes)
    315. throws SQLException {
    316. return preparedStatement.executeUpdate(sql, columnIndexes);
    317. }
    318. @Override
    319. public void setURL(int parameterIndex, URL x) throws SQLException {
    320. preparedStatement.setURL(parameterIndex, x);
    321. }
    322. @Override
    323. public int executeUpdate(String sql, String[] columnNames)
    324. throws SQLException {
    325. return preparedStatement.executeUpdate(sql, columnNames);
    326. }
    327. @Override
    328. public ParameterMetaData getParameterMetaData() throws SQLException {
    329. return preparedStatement.getParameterMetaData();
    330. }
    331. @Override
    332. public void setRowId(int parameterIndex, RowId x) throws SQLException {
    333. preparedStatement.setRowId(parameterIndex, x);
    334. }
    335. @Override
    336. public void setNString(int parameterIndex, String value)
    337. throws SQLException {
    338. preparedStatement.setNString(parameterIndex, value);
    339. }
    340. @Override
    341. public boolean execute(String sql, int autoGeneratedKeys)
    342. throws SQLException {
    343. return preparedStatement.execute(sql, autoGeneratedKeys);
    344. }
    345. @Override
    346. public void setNCharacterStream(int parameterIndex, Reader value,
    347. long length) throws SQLException {
    348. preparedStatement.setNCharacterStream(parameterIndex, value, length);
    349. }
    350. @Override
    351. public void setNClob(int parameterIndex, NClob value) throws SQLException {
    352. preparedStatement.setNClob(parameterIndex, value);
    353. }
    354. @Override
    355. public void setClob(int parameterIndex, Reader reader, long length)
    356. throws SQLException {
    357. preparedStatement.setClob(parameterIndex, reader, length);
    358. }
    359. @Override
    360. public boolean execute(String sql, int[] columnIndexes) throws SQLException {
    361. return preparedStatement.execute(sql, columnIndexes);
    362. }
    363. @Override
    364. public void setBlob(int parameterIndex, InputStream inputStream, long length)
    365. throws SQLException {
    366. preparedStatement.setBlob(parameterIndex, inputStream, length);
    367. }
    368. @Override
    369. public void setNClob(int parameterIndex, Reader reader, long length)
    370. throws SQLException {
    371. preparedStatement.setNClob(parameterIndex, reader, length);
    372. }
    373. @Override
    374. public boolean execute(String sql, String[] columnNames)
    375. throws SQLException {
    376. return preparedStatement.execute(sql, columnNames);
    377. }
    378. @Override
    379. public void setSQLXML(int parameterIndex, SQLXML xmlObject)
    380. throws SQLException {
    381. preparedStatement.setSQLXML(parameterIndex, xmlObject);
    382. }
    383. @Override
    384. public void setObject(int parameterIndex, Object x, int targetSqlType,
    385. int scaleOrLength) throws SQLException {
    386. preparedStatement.setObject(parameterIndex, x, targetSqlType, scaleOrLength);
    387. }
    388. @Override
    389. public int getResultSetHoldability() throws SQLException {
    390. return preparedStatement.getResultSetHoldability();
    391. }
    392. @Override
    393. public boolean isClosed() throws SQLException {
    394. return preparedStatement.isClosed();
    395. }
    396. @Override
    397. public void setPoolable(boolean poolable) throws SQLException {
    398. preparedStatement.setPoolable(poolable);
    399. }
    400. @Override
    401. public boolean isPoolable() throws SQLException {
    402. return preparedStatement.isPoolable();
    403. }
    404. @Override
    405. public void closeOnCompletion() throws SQLException {
    406. preparedStatement.closeOnCompletion();
    407. }
    408. @Override
    409. public void setAsciiStream(int parameterIndex, InputStream x, long length)
    410. throws SQLException {
    411. preparedStatement.setAsciiStream(parameterIndex, x, length);
    412. }
    413. @Override
    414. public boolean isCloseOnCompletion() throws SQLException {
    415. return preparedStatement.isCloseOnCompletion();
    416. }
    417. @Override
    418. public void setBinaryStream(int parameterIndex, InputStream x, long length)
    419. throws SQLException {
    420. preparedStatement.setBinaryStream(parameterIndex, x, length);
    421. }
    422. @Override
    423. public void setCharacterStream(int parameterIndex, Reader reader,
    424. long length) throws SQLException {
    425. preparedStatement.setCharacterStream(parameterIndex, reader, length);
    426. }
    427. @Override
    428. public void setAsciiStream(int parameterIndex, InputStream x)
    429. throws SQLException {
    430. preparedStatement.setAsciiStream(parameterIndex, x);
    431. }
    432. @Override
    433. public void setBinaryStream(int parameterIndex, InputStream x)
    434. throws SQLException {
    435. preparedStatement.setBinaryStream(parameterIndex, x);
    436. }
    437. @Override
    438. public void setCharacterStream(int parameterIndex, Reader reader)
    439. throws SQLException {
    440. preparedStatement.setCharacterStream(parameterIndex, reader);
    441. }
    442. @Override
    443. public void setNCharacterStream(int parameterIndex, Reader value)
    444. throws SQLException {
    445. preparedStatement.setNCharacterStream(parameterIndex, value);
    446. }
    447. @Override
    448. public void setClob(int parameterIndex, Reader reader) throws SQLException {
    449. preparedStatement.setClob(parameterIndex, reader);
    450. }
    451. @Override
    452. public void setBlob(int parameterIndex, InputStream inputStream)
    453. throws SQLException {
    454. preparedStatement.setBlob(parameterIndex, inputStream);
    455. }
    456. @Override
    457. public void setNClob(int parameterIndex, Reader reader) throws SQLException {
    458. preparedStatement.setNClob(parameterIndex, reader);
    459. }
    460. }

    所以,现在您已经看到了自定义类NamedParameterizedQuery.java 和 ParameterizedQueryImpl.java。 此外,您还知道如何使用上述示例中的这些类创建命名参数化查询。如果你好奇这些类是如何工作的,你可以在 debud 模式下测试它们以了解它的功能。

  • 相关阅读:
    机器学习之广义增量规则(Generalized Delta Rule)
    揭秘神秘的种子:Adobe联合宾夕法尼亚大学发布文本到图像扩散模型大规模种子分析
    HDC2022的无障碍参会体验,手语服务是如何做到的?
    SpringBoot关闭Tomcat容器,SpringBoot使用Jetty容器
    《实现领域驱动设计》- 领域服务
    element 表单自定义效验规则
    小程序员 scroll滚动与页面滚动冲突造成快速滑到底部卡顿失败问题
    nodejs+vue健身房课程预约评分系统
    【C语言】关键字
    C++静态成员&友元&命名空间介绍
  • 原文地址:https://blog.csdn.net/allway2/article/details/126110147