三者聯(lián)系
- Statement、PreparedStatement和CallableStatement都是接口(interface)。
- Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement。
- 三者功能特點(diǎn):
- Statement接口提供了執(zhí)行語句和獲取結(jié)果的基本方法;
- PreparedStatement接口添加了處理 IN 參數(shù)的方法;
- CallableStatement接口添加了處理 OUT 參數(shù)的方法。
Statement
Statement用于執(zhí)行不帶參數(shù)的簡單SQL語句,并返回它所生成的結(jié)果,每次執(zhí)行時,數(shù)據(jù)庫都要編譯該SQL語句。
PreparedStatement
表示預(yù)編譯的SQL語句的對象,用于執(zhí)行帶參數(shù)的預(yù)編譯的SQL語句,也可以不帶參數(shù)。編譯一次,執(zhí)行多次,效率高; 安全性好,有效防止Sql注入等問題。
CallableStatement
提供了用來調(diào)用數(shù)據(jù)庫中存儲過程的接口,如果有輸出參數(shù)要注冊,說明是輸出參數(shù)。繼承自PreparedStatement,支持帶參數(shù)的SQL操作。提供了對輸出和輸入/輸出參數(shù)(IN/OUT)的支持。不同數(shù)據(jù)庫的存儲過程是不可移植的,因此CallableStatement面臨移植性差問題。
Statement的使用
- 創(chuàng)建Statement對象
java Statement stmt = connection.creatStatement(); - Statement常用方法
- boolean execute(String sql) 返回boolean類型,在執(zhí)行sql語句后,如果ResultSet檢索到,則返回true,否則返回false。
- int executeUpdate(String sql) 返回int類型,方法用于執(zhí)行sql語句,將返回sql語句影響的行數(shù)。
- ResultSet executeQuery(String sql) 執(zhí)行sql語句,將返回結(jié)果集。用ResultSet實(shí)例化 result去接收返回集。
- 關(guān)閉
java stmt.close(); // 關(guān)閉并釋放資源。
PreparedStatement的使用
//連接數(shù)據(jù)庫
String sql="insert into userInfo(username.password,gender,age) value(?,?,?,?)";
//可以傳入?yún)?shù)
PreparedStatement ps=conn.prepareStatement(String sql);
//調(diào)用setXXX系列方法給問號賦值,下標(biāo)從1開始,代表第一個問號
ps.setString(1,"name");
ps.setInt(2,123456);
ps.setString(3,"男");
ps.setInt(4,25);
//執(zhí)行插入
ps.executeUpdate();
ps.close();
conn.close();
- 常用方法:
-
boolean execute()在進(jìn)行數(shù)據(jù)庫或表的創(chuàng)建刪除操作時使用。 -
ResultSet executeQuery()數(shù)據(jù)查詢時使用。 -
int executeUpdate()數(shù)據(jù)的插入刪除、修改時使用。
-
- 關(guān)閉
java ps.close(); // 關(guān)閉并釋放資源。
CallableStatement的使用
- 創(chuàng)建一個CallableStatement
存儲過程存在的三種參數(shù):IN OUT INOUT- IN 創(chuàng)建SQL語句時其參數(shù)值是未知的。 使用setXXX()方法將值綁定到IN參數(shù)。
- OUT 由SQL語句返回的參數(shù)值。可以使用getXXX()方法從OUT參數(shù)中檢索值。
- INOUT 提供輸入和輸出值的參數(shù)。使用setXXX()方法綁定變量并使用getXXX()方法檢索值。
- 如果存儲過程只是IN
String sql="{call getEmpName (?, ?)}"; //conn.prepareCall() 與conn.preparedStatement()功能一樣 CallableStatement cstmt=conn.prepareCall(sql); cstmt.setString(1,"aaa"); cstmt.setInt(2,123); //發(fā)送參數(shù),所有調(diào)用存儲過程的sql語句都是使用executeQuery方法執(zhí)行。 ResultSet rs=cstmt.executeQuery(); - 如果存儲過程是INOUT
//第一個?是輸入?yún)?shù),第二個?是輸出參數(shù) String sql = "CALL pro_test2(?,?)"; CallableStatement cstmt=conn.prepareCall(sql); //設(shè)置輸入?yún)?shù) cstmt=setInt(1,5); //設(shè)置輸出參數(shù),用registerOutParameter綁定 cstmt.registerOutParameter(2,java.sql.Types.VARCHAR); //執(zhí)行 cstmt.executeQuery(); //根據(jù)?位置取得數(shù)據(jù)getXXX()方法只用于存儲過程 String rs=cstmt.getString(2); - 關(guān)閉CallableStatement
java cstmt.close();
批量查詢
// Statement的Batch使用:
Statement stmt = conn.createStatement();
String sql = null;
for (int i = 0; i < 20; i++) {
sql = "insert into test(id, name)values(" + i + ", " + i + "_name)";
stmt.addBatch(sql);
}
stmt.executeBatch();
// PreparedStatement的Batch使用:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID =?");
for (int i = 0; i < length; i++) {
pstmt.setBigDecimal(1, param1[i]);
pstmt.setInt(2, param2[i]);
pstmt.addBatch();
}
pstmt.executeBatch();
```