對於一個數據庫,我在對數據進行刪除操作的時候出現了問題
確切的說是PreparedStatement的問題
初步代碼是這樣的結構:
String sql = new String("DELETE FROM flight WHERE ? = ? ");
int res; PreparedStatement pstmt = connect.prepareStatement(sql); pstmt.setString(1, "flightNo"); pstmt.setString(2, flight.getFlightNo());
我起初想把WHERE語句中寫成很多 ? = ?的結構,這樣可以傳入很多自定義參數,不過都是不識別的。
然后進行了錯誤排查,發現錯誤出現在等號前的?中,把等號前的問好改成flightNo,手敲進去就好了
初步猜測是插入參數默認是等號前不能作為參數,因為sql語句中這里表示column
是colunm = 值的對應關系,所以只能是手打進去。
所以sql語句的參數不可以是column項的。
具體代碼如下:此為更改后的版本
@Override public int delete(Flight flight) throws SQLException { // TODO Auto-generated method stub Connection connect = DBUtil.getConnection(); String sql = new String("DELETE FROM flight WHERE flightNo = ? "); int res; PreparedStatement pstmt = connect.prepareStatement(sql); pstmt.setString(1, flight.getFlightNo()); System.out.println(sql); res = pstmt.executeUpdate(); return res; }
~~~~~~~~~~~~~~~~~~~~~分割線~~~~~~~~~~~~~~~~~~~~~~
確定這個sql語句是只接受參數的,字段名是不可以作為問好傳參的。
新的解決辦法為StringBuffer作為sql的儲存體,每次傳入判斷語句就append進去或者中間插入
最后再來執行。
提升運行速度的另一要素是封裝預編譯的方法,連接->預編譯->運行
以及close的方法,涉及到線程的時候不能在增刪改查方法體的try語句塊中關閉
涉及到線程的語句會再次補充