執行方法:使用Statement對象。
Statement簡介:
Statement是Connection對象返回的,提供了基本查詢的接口的類,一般用來執行簡單的、無參數的查詢語句。
執行稍微複雜的sql語句,一般選擇PreparedStatement,可以有效防止SQLInjection。
Statement對象的獲取:
Statement stm = Connection.createStatement();
獲取stm對象後,便可以使用以下三種方法執行sql語句:
stm.executeQuery(String sql)用來執行DQL語句。
stm.executeUpdate(String sql)用來執行DML語句。
stm.execute(String sql)可以執行任何SQL語句,不過一般用來執行DDL語句。
例:根據ID查詢員工:
<span style="font-size:14px;"> public void testStatement(int empno){
Connection con = null;
try{
con = DBUtil.getConnection();stm = con.createStatement();
String sql = "SELECT * FROM emp WHERE empno="+empno;
ResultSet rs = stm.executeQuery(sql);
while(rs.next()) //對結果集進行遍歷並輸出
{System.out.println(rs.getString("name")+"..."+rs.getInt("empno"));}
}catch(SQLExeption e){
e.printStackTrack();
throw new RuntimeException("查詢員工失敗",e);
}finally{ DBUtil.close(con);}}</span>
因爲Statement存在漏洞,容易發生SQLInjection,故複雜語句一般用PreparedStatement代替Statement
兩者用法不同:PreparedStatement在傳入sql語句時,用?代替變量,傳入後,會將整個sql語句進行分析後,再傳入其他參數執行語句。所以語義不會產生歧義,加強安全性。
PreparedStatement對象的獲取:
PreparedStatement ps = con.prepareStatement();
例:使用PreparedStatement根據ID查詢員工:
<span style="font-size:14px;"> public void testPreparedStatement(){
//假設傳入了部門ID
int deptId = 1;
try {
Connection con = DBUtil.getConnection();
String sql = "SELECT * FROM emps_zp WHERE deptno="+deptId;
Statement stm = con.createStatement();
/*
* 返回的結果集中包含多行多列數據,
* 該對象採用了迭代器模式,
* 因此可以直接while遍歷,
* 每次遍歷將得到一行數據,
* 再調用方法從這一行中取某列數據。
*/
ResultSet rs = stm.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getInt("empno")+"..."+
rs.getString("ename")+"..."+
rs.getDouble("sal")+"..."+
rs.getInt("deptno"));
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查詢員工失敗",e);
}
}
</span>