有這樣一個現(xiàn)象:數(shù)據(jù)庫中有兩個表格 學生表(學生姓名,所在班級),班級表(班級號(自增長的主鍵),班級人數(shù))。
現(xiàn)在我往班級表插入一條信息, 只提供班級人數(shù),班級號由自增長自動生成。然后我們插入一條學生信息入這個新的班,這就需要新增的班級的班級號,但是這個班級號由自增長自動生成,那么我們該如何正確把這個學生的信息插入呢?
看下面代碼演示吧~
public class AutoIncrement { Connection connection = null; @Test public void TestAuto() throws Exception { //獲取連接 connection = sqlUtil.getconnection(); //準備SQL語句 String classSQL = "insert into class(ccount) values(?)"; String studentSQL = "insert into student values(?,?)"; //獲取對象,先往CLASS表插入一條數(shù)據(jù),使用有兩個參數(shù)的方法。 //第二個參數(shù)Statement.RETURN_GENERATED_KEYS 可以獲得自增長的值 PReparedStatement preparedStatement = connection.prepareStatement(classSQL,Statement.RETURN_GENERATED_KEYS); //設(shè)置參數(shù) preparedStatement.setObject(1, 66); //執(zhí)行 preparedStatement.executeUpdate(); //下面就來獲得這個自增長的ID值 Integer cid = null; //使用getGeneratedKeys()獲得自增長參數(shù)的一個結(jié)果集 ResultSet res = preparedStatement.getGeneratedKeys(); //迭代得到該值,我這里只有一個自增長的參數(shù) if(res.next()) { cid = res.getInt(1); } //******得到該增長的值后,我們就 來插入員工信息******** preparedStatement=connection.prepareStatement(studentSQL); //設(shè)置參數(shù),把獲取的自增長的值作為參數(shù) preparedStatement.setObject(1, "張三"); preparedStatement.setObject(2, cid); //執(zhí)行 preparedStatement.executeUpdate(); //關(guān)閉資源 sqlUtil.close(preparedStatement, connection); }}2.事務(wù)大家都知道,數(shù)據(jù)庫中常常會用到事務(wù),那么如何用java代碼來操作呢~看下面代碼和說明吧~
有一個表:bank(bname,money),用來記錄人物的姓名和金錢數(shù)
@Test public void doCommit() throws Exception { // 獲取連接 connection = sqlUtil.getconnection(); // Jack向Mark轉(zhuǎn)賬100元。 String sql1 = "update bank set money=money-100 where bname='Jack'"; // Mark的賬戶獲得100元 String sql2 = "update bank set money=money+100 where bname='Mark'"; // 開始事務(wù),false表示關(guān)閉自動提交,即開啟事務(wù) // true 表示自動提交SQL connection.setAutoCommit(false); // Jack執(zhí)行轉(zhuǎn)賬100 PreparedStatement state = connection.prepareStatement(sql1); state.executeUpdate(); // Mark獲得100 state = connection.prepareStatement(sql2); state.executeUpdate(); // 提交事務(wù) connection.commit(); // 關(guān)閉資源 sqlUtil.close(state, connection); }這樣就能創(chuàng)建和提交一個事務(wù)。
那么,如果在”Jack執(zhí)行轉(zhuǎn)賬100“ 這個操作執(zhí)行后,出現(xiàn)了異常,沒有執(zhí)行:sql2語句, 那兩個用戶豈不是都有損失? 這時候就體現(xiàn)出事務(wù)的重要性,事務(wù)還有一個功能:回滾
下面就故意制造一個異常,然后回滾事務(wù)吧~
public class CommitTest { Connection connection = null; @Test public void doCommit() { // Jack執(zhí)行轉(zhuǎn)賬100 PreparedStatement state = null; try { // 獲取連接 connection = sqlUtil.getconnection(); // Jack向Mark轉(zhuǎn)賬100元。 String sql1 = "update bank set money=money-100 where bname='Jack'"; // Mark的賬戶獲得100元 String sql2 = "update bank set money=money+100 where bname='Mark'"; // 開始事務(wù),false表示關(guān)閉自動提交,即開啟事務(wù) // true 表示自動提交SQL connection.setAutoCommit(false); // Jack執(zhí)行轉(zhuǎn)賬100 state = connection.prepareStatement(sql1); state.executeUpdate(); //故意制造異常 int a = 1/0; // Mark獲得100 state = connection.prepareStatement(sql2); state.executeUpdate(); // 提交事務(wù) connection.commit(); } catch (SQLException e) { e.printStackTrace(); try { //遇到任何異常情況,回滾事務(wù) connection.rollback(); } catch (SQLException e1) { e1.printStackTrace(); throw new RuntimeException(e); } }finally{ // 關(guān)閉資源 sqlUtil.close(state, connection); } }}
新聞熱點
疑難解答