SQL语句怎么利用PrepareStatement方法进行打印

这期内容当中小编将会给大家带来有关SQL语句怎么利用PrepareStatement方法进行打印,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的平顶山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

方法如下:

首先,我们看看典型的一个 PrepareStatement 调用方法,如下一个函数,

/** 
 * 查询单个结果,保存为 Map 结构。如果查询不到任何数据返回 null。 
 * 
 * @param conn 
 *   数据库连接对象 
 * @param sql 
 *   SQL 语句,可以带有 ? 的占位符 
 * @param params 
 *   插入到 SQL 中的参数,可单个可多个可不填 
 * @return Map 结构的结果。如果查询不到任何数据返回 null。 
 */ 
public static Map query(Connection conn, String sql, Object... params) { 
 Map map = null; 
 printRealSql(sql, params); // 打印真实 SQL 的函数 
  
 try (PreparedStatement ps = conn.prepareStatement(sql);) { 
  if(params != null) 
   for (int i = 0; i < params.length; i++) 
    ps.setObject(i + 1, params[i]); 
   
  try (ResultSet rs = ps.executeQuery();) { 
   if (rs.isBeforeFirst()) { 
    map = getResultMap(rs); 
   } else { 
    LOGGER.info("查询 SQL:{0} 没有符合的记录!", sql); 
   } 
  } 
 } catch (SQLException e) { 
  LOGGER.warning(e); 
 } 
  
 return map; 
}

值得注意该函数里面:

printRealSql(sql, params); // 打印真实 SQL 的函数

其参数一 sql 就是类似 SELECT * FROM table WHERE id = ? 的语句,参数二 params 为 Object... params 的参数列表,可以是任意类似的合法 SQL 值。最后,通过 printRealSql 函数最终得出形如 SELECT * FROM table WHERE id =  12 的结果。

printRealSql 函数源码如下:

/** 
 * 在开发过程,SQL语句有可能写错,如果能把运行时出错的 SQL 语句直接打印出来,那对排错非常方便,因为其可以直接拷贝到数据库客户端进行调试。 
 * 
 * @param sql 
 *   SQL 语句,可以带有 ? 的占位符 
 * @param params 
 *   插入到 SQL 中的参数,可单个可多个可不填 
 * @return 实际 sql 语句 
 */ 
public static String printRealSql(String sql, Object[] params) { 
 if(params == null || params.length == 0) { 
  LOGGER.info("The SQL is------------>\n" + sql); 
  return sql; 
 } 
  
 if (!match(sql, params)) { 
  LOGGER.info("SQL 语句中的占位符与参数个数不匹配。SQL:" + sql); 
  return null; 
 } 
 
 int cols = params.length; 
 Object[] values = new Object[cols]; 
 System.arraycopy(params, 0, values, 0, cols); 
 
 for (int i = 0; i < cols; i++) { 
  Object value = values[i]; 
  if (value instanceof Date) { 
   values[i] = "'" + value + "'"; 
  } else if (value instanceof String) { 
   values[i] = "'" + value + "'"; 
  } else if (value instanceof Boolean) { 
   values[i] = (Boolean) value ? 1 : 0; 
  } 
 } 
  
 String statement = String.format(sql.replaceAll("\\?", "%s"), values); 
 
 LOGGER.info("The SQL is------------>\n" + statement); 
 
 ConnectionMgr.addSql(statement); // 用来保存日志 
  
 return statement; 
} 
 
/** 
 * ? 和参数的实际个数是否匹配 
 * 
 * @param sql 
 *   SQL 语句,可以带有 ? 的占位符 
 * @param params 
 *   插入到 SQL 中的参数,可单个可多个可不填 
 * @return true 表示为 ? 和参数的实际个数匹配 
 */ 
private static boolean match(String sql, Object[] params) { 
 if(params == null || params.length == 0) return true; // 没有参数,完整输出 
  
 Matcher m = Pattern.compile("(\\?)").matcher(sql); 
 int count = 0; 
 while (m.find()) { 
  count++; 
 } 
  
 return count == params.length; 
}

上述就是小编为大家分享的SQL语句怎么利用PrepareStatement方法进行打印了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


网站标题:SQL语句怎么利用PrepareStatement方法进行打印
标题网址:http://scyanting.com/article/jpppjj.html