關於資料庫操作多個操作組合的處理

張國平發表於2010-04-23

在mysql資料庫裡建了兩個列數相同的表table1(欄位為id,xuehao,name,sex).table2(欄位為id,age,jiguan,dept),想把兩個表合在一起顯示在jsp網頁上,用了select xuehao,name,sex,age,jiguan,dept from table1 join table2 on table1.id=table2.id;

問題是我現在想給這兩個關聯表同時新增一行資料,
在mysql中我用命令:insert into table1 values();insert into table2 values();select xuehao,name,sex,age,jiguan,dept from table1 join table2 on table1.id=table2.id;可以達到我想要的效果

 

我的想法:

嗯,先說說為什麼要怎麼做吧,感覺從事務層上來解決比較合適。

具體實現有很多方法,
一個實在資料層裡面,可以做一個儲存過程,

一個實在事務層裡面,把這個把著三個sql操作寫成一個方法裡面
根據返回值true和false來決定。

大概寫寫,沒有除錯過
1、儲存過程:
DROP PROCEDURE IF EXISTS insertandread
CREATE PROCEDURE insertandread (IN xuehao INT,
in name varchar(40),
........//省略
........//省略
OUT xuehao int,out name varchar(32),...)//省略
BEGIN
insert into table1 values(xuehao,name);
insert into table2 values(...);//引數
select xuehao,name,sex,age,jiguan,dept from table1 join table2 on table1.id=table2.id;
END;


Java輸入和讀取返回值,大概是下面這樣
   Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, user, pwd);
    cs = conn.prepareCall("{ call insertandread(?,?,?) }");//問號表示引數
    CallableStatement cs.setString(1, "10");
    ...........//省略,這是輸入值定義
    cs.registerOutParameter(2, Types.VARCHAR);//定義返回值,型別和ID
    ............
    cs.execute();


    String name = cs.getString(2);//獲得返回值。
   

這個裡面設計的引數比較多,要注意除錯,基本就是這個樣子,
參考http://hi.baidu.com/icewee/blog/item/dfd9b96f87edfedc81cb4a59.html
可以學學習。
MySql以前看過,現在也算複習下,多多指教
我再想想事務層應該怎麼實現比較還好

事務層的實現,
大概寫寫,
public ResultSet insertandRead(String[] parm1,String[] parm2)
//這裡面偷個懶,全部用String
{
    ResultSet rs=null;
    bool insert1OK=false;
    bool insert2OK=false;
    con.setAutoCommit(false);//禁止自動提交,
    Savepoint sp = con3.setSavepoint();//設定回滾點
    .......
    try{
    PreparedStatement inserttable1 = con.prepareStatement("insert into table1 values(?,?,?,...)");
    inserttable1.setString(1, parm1[0]);
    inserttable1.execute();
    con.commit();//提交
   
    }catch(Exception ex) {

    ex.printStackTrace();
    insert1OK=true;

    try {

    conn.rollback(); //操作不成功則回滾

    }catch(Exception e) {

   e.printStackTrace();

    }
    對table2新增也是一樣,如果不成功就回滾是開始。成功把insert1OK設定為OK。
    if(insert1OK==true&& insert2OK==true){
    ....//執行查詢,返回ResultSet
    }
    return rs;
}

感覺這個程式碼不是很好,太容易出問題了,而和資料庫連線太緊密,
還是應該使用Hibernate這樣的持久化層來處理。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-660573/,如需轉載,請註明出處,否則將追究法律責任。

相關文章