今天让我帮忙修改一下原来的sql语句执行页面,说是要修改为批量执行。
修改过程中发现需要做一下判断,比如没有sql语句要不要以';'结尾,单条和多条等等,想了想发现不以“;”结尾的单条语句更人性化一点,但是万一他们有的有结尾符有的没有,这样判断起来就麻烦了,于是索性就限制必须以';'结尾。
做到一半发现有个关键的问题没考虑,万一sql语句中本来就有类似'**;**'这样的就不能简简单单的用“;”split处理了,于是只好进行此种情况的判断了。留作以后再用,可以参考。
检测是否有';',代码如下:
public boolean haveSemicolon(String sql) { boolean semicolon = false; int singleQuote = 0; boolean end = true; char[] sqlChar = sql.toCharArray(); for(int i=0; i<sqlChar.length; i++) { if('/'' == sqlChar[i]) { singleQuote += 1; if((singleQuote%2) == 0) { end = true; } else { end = false; } } else if(';' == sqlChar[i]){ if(end) { semicolon = false; } else { semicolon = true; break; } } } return semicolon; }
使用代码如下:
int execCount = 0; //如果单条sql语句中没有";" if(!haveSemicolon(sql)) { String[] sqls = sql.split(";"); for(int i=0; i<sqls.length; i++) { execCount += stmt.executeUpdate(sqls[i]); } } else { int singleQuote = 0; boolean end = true; int semicolonPos = 0; List sqls = new ArrayList(); char[] sqlChar = sql.toCharArray(); for(int i=0; i<sqlChar.length; i++) { if('/'' == sqlChar[i]) { singleQuote += 1; if((singleQuote%2) == 0) { end = true; } else { end = false; } } else if(';' == sqlChar[i]){ if(end) { StringBuffer sqlsb = new StringBuffer(); if(semicolonPos == 0) sqlsb.append(sql.substring(0, i)); else sqlsb.append(sql.substring(semicolonPos+1, i)); semicolonPos = i; sqls.add(sqlsb.toString()); } } } for(int i=0; i<sqls.size(); i++) { execCount += stmt.executeUpdate((String)sqls.get(i)); } }