今天做了個executeBatch的例子,可是輸的結果卻出乎我的意料,如下
begintime:2006-05-25 09:58:11.0
endtime:2006-05-25 09:58:11.14
sqlType:executeBatch
sql:insert into tmm_bill (billname, billdesc) values (?, ?);insert into tmm_bill (billname, billdesc) values (?, ?);
paramters:[1, 2]
為什么輸出的是兩個語句,而只有一組參數呢,于是我決定一探究竟.
下面是我的例子
?? conn = DriverManager
???? .getConnection("listenerconfig=/com/cownew/JDBMonitor/demo/oracleconfig.xml:url=jdbc:oracle:thin:@zbw:1521:xinem8gg", "m8connect", "m8connect");
?? //for (int i = 0; i < 10; i++)
?? //{
??? ps = conn
????? .prepareStatement("insert into tmm_bill (billname, billdesc) values (?, ?)");
???
??? ps.setString(1,"songzho");
??? ps.setString(2, "yufn");
???
??? ps.addBatch();
???
??? ps.setString(1, "2");
??? ps.setString(2, "3");
???
??? ps.addBatch();
???
???
??? ps.executeBatch();
??? ps.close();
原來我們輸出的內容封裝在SQLInfo這個類中
這個類中有一個get和set方法用來取值和付值,這個我就不多介紹了,主要說一下其中一個方法
private List parameters = new ArrayList();
?public List getParameters()
?{
? return parameters;
?}
public String toString()
?{
? StringBuffer sb = new StringBuffer();
? sb.append("begintime:").append(beginTime).append("\n");//設置開始執行語句的時間
? sb.append("endtime:").append(endTime).append("\n");//設置結束執行語句的時間
? sb.append("sqlType:").append(sqlType).append("\n");//設置語句的類型
? sb.append("sql:").append(sql).append("\n");//設置語句
? if(parameters.size()>0)
? {
????? sb.append("paramters:").append(parameters).append("\n");//設置參數,就是這里有點問題
? }
? return sb.toString();
?}
在這里大家可以看出來parameters就是用來傳入參數的arrayList,可是這里只能存一組參數;
我們再看一下 DBPreparedStatement 這個類,這個類的意義也不用多說了吧,主要看看兩個方法
?public int[] executeBatch() throws SQLException
?{
? SQLInfo info = new SQLInfo();
? info.setSqlType(SQLTypeEnum.executeBatch);//SQLInfo類設置SqlType的方法
? info.setBeginTime(JdbcUtils.getTimeStamp());//SQLInfo類設置BeginTime的方法
? info.setSql(sbAddBatch.toString());//SQLInfo類設置Sql的方法,sbAddBatch是一個StringBuffer
? int[] ret = stmt.executeBatch();
? info.setEndTime(JdbcUtils.getTimeStamp()); ());//SQLInfo類設置EndTime的方法
?
? if (params != null && paramCount != 0)//這里是設置參數的地方,就是這里出了一點問題,params只是保存一組參數,也就是最后一組
????????? //對于只有一組參數是沒有問題的,可是如果有多組參數就會出現上面我說的那個現象了
? {
?? int i = 0;
?? for (int size = paramCount; i < size; i++)
??? info.getParameters().add(params[i]);
? }
? logSql(info);
? sbAddBatch.setLength(0);
? return ret;
?}
我改動的方法是這樣的
private ArrayList paramsList = new ArrayList();
public class DBPreparedStatement extends DBStatement implements
??PreparedStatement
{
?.
?.
?.
?public void addBatch() throws SQLException
?{
??//sbAddBatch.append(sql).append(";");
???? ArrayList pListTemp = new ArrayList();
???? for (int i = 0; i < paramCount; i ++)
???? {
???????? pListTemp.add(params[i]);//把每一組參數存到一個ArrayList里面
???? }
????
???? paramsList.add(pListTemp);//再把那個臨時的TempList存到一個ArrayList里面
??
??((PreparedStatement) stmt).addBatch();
?}
?.
?public int[] executeBatch() throws SQLException
?{
??
???? sbAddBatch.append(sql);
????
???? SQLInfo info = new SQLInfo();
??info.setSqlType(SQLTypeEnum.executeBatch);
??info.setBeginTime(JdbcUtils.getTimeStamp());
??info.setSql(sbAddBatch.toString());
??int[] ret = stmt.executeBatch();
??info.setEndTime(JdbcUtils.getTimeStamp());??
??
??if (paramsList != null && paramsList.size() != 0)
??{
???for (int i = 0; i < paramsList.size(); i ++)
???{
?????? info.getParameters().add(paramsList.get(i));//取到每一個TempList
???}
?????
??}
??logSql(info);
??sbAddBatch.setLength(0);
??return ret;
?}
?.
?.
?.
}
public class SQLInfo implements Serializable
{
?.
?.
?.
?public String toString()
?{
??StringBuffer sb = new StringBuffer();
??sb.append("begintime:").append(beginTime).append("\n");
??sb.append("endtime:").append(endTime).append("\n");
??sb.append("sqlType:").append(sqlType).append("\n");
??sb.append("sql:").append(sql).append("\n");
??if(parameters.size()>0)
??{
????? for (int i = 0; i < parameters.size(); i ++)
????? {
????????? sb.append("paramters:").append((ArrayList)parameters.get(i)).append("\n");//循環取TempList里的參數
????? }
??}
??return sb.toString();
?}
}
得到的結果為
begintime:2006-05-25 13:16:00.218
endtime:2006-05-25 13:16:00.234
sqlType:executeBatch
sql:insert into tmm_bill (billname, billdesc) values (?, ?)
paramters:[songzho, yufn]
paramters:[2, 3]
也不知道各位看官看明白了沒有,其實不懂也沒什么關系,我只是想在這里給大家說一下我們輸出方式,總結一下就是我們做了自己的DBConnect,DBStatetment,
DBPrepareStatement....,都是繼承了JDBC的原型,在實現這些功能的之前,先把信息記錄在SqlInfo里,再跟據配置的寫日志方式進行寫日志.
作者月光光是CowNew開源團隊(http://www.cownew.com)JDBMonitor開發組的核心開發人員,在J2EE開發方面頗有造詣。