?? operatedb.java
字號:
package book.database;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 操作數據庫,包括增刪改查數據庫的記錄
*/
public class OperateDB {
/**
* 查詢數據庫
* @param sm 與數據庫連接的Statement
* @param sql 查詢SQL語句
* @return 返回一個ResultSet結果集
*/
public static ResultSet queryDB(Statement sm, String sql){
ResultSet rs = null;
try {
// 首先獲得表的所有數據
rs = sm.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
/**
* 修改數據庫
* @param con 數據庫的連接
* @param sql 修改SQL語句
* @return 返回修改影響的行數,為0表示一行數據都沒有被修改
* 為Statement.EXECUTE_FAILED表示執行失敗。
*/
public static int updateDB(Connection con, String sql){
Statement sm = null;
int affectRows = 0;
try {
// 首先獲得表的所有數據
sm = con.createStatement();
affectRows = sm.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
// 如果出現異常,則表示執行失敗。
affectRows = Statement.EXECUTE_FAILED;
} finally {
// 關閉Statement
closeStatement(sm);
}
return affectRows;
}
/**
* 顯示一個ResultSet結果集
* 在顯示之前必須保證它所在的Statement是活著的
* @param rs
*/
public static void showResultSet(ResultSet rs){
if (rs == null){
return;
}
try {
ResultSetMetaData md = rs.getMetaData();
// 獲得該ResultSet中的列數
int columnCount = md.getColumnCount();
// 如果結果集的指針沒有位于第一條記錄的前面
// 將結果集的指針指向第一條記錄的前面
if(!rs.isBeforeFirst()){
rs.beforeFirst();
}
// 從前往后的移動結果集指針,處理每條記錄
while (rs.next()){
// 每條記錄都包含columnCount個列
for (int i=1; i<columnCount; i++){
// 由于不知道該列的類型,所以用getObject方法獲取值
System.out.print(rs.getObject(i) + "\t");
}
System.out.print(rs.getObject(columnCount) + "\r\n");
}
rs.beforeFirst();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 關閉Statement
* @param sm
*/
public static void closeStatement(Statement sm){
if (sm != null){
try {
sm.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
/**
* 關閉連接
* @param con
*/
public static void closeConnection(Connection con){
if (con != null){
try {
con.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String dbName = "studentdb";
String userName = "test";
String password = "test";
String querySQL = "SELECT * FROM student_basic";
String updateSQL = "UPDATE student_basic SET score=82 where name='mary'";
String insertSQL = "INSERT INTO student_basic (name, age, score)"
+ " VALUES ('zhangsan', 17, 86)";
String deleteSQL = "DELETE FROM student_basic where name='wade'";
Connection con = null;
Statement sm = null;
try {
// 獲得數據庫連接
con = DBConnector.getMySQLConnection(null, null, null, dbName,
userName, password);
sm = con.createStatement();
// 查詢
ResultSet rs = OperateDB.queryDB(sm, querySQL);
System.out.println("修改數據表之前的數據:");
OperateDB.showResultSet(rs);
// 修改
OperateDB.updateDB(con, updateSQL);
OperateDB.updateDB(con, insertSQL);
OperateDB.updateDB(con, deleteSQL);
System.out.println();
System.out.println("修改數據表之后的數據:");
// 再查詢
rs = OperateDB.queryDB(sm, querySQL);
OperateDB.showResultSet(rs);
System.out.println();
// 從ResultSet中提取值時可以指定列名和類型
// 將結果集指針指向第一條數據
rs.absolute(1);
System.out.print("name: " + rs.getString("name") + "\t");
System.out.println("age: " + rs.getInt("age"));
rs.absolute(3);
System.out.print("name: " + rs.getString("name") + "\t");
System.out.println("age: " + rs.getInt("age"));
// 關閉結果集
rs.close();
} catch (ClassNotFoundException e1) {
throw e1;
} catch (SQLException e2) {
throw e2;
} finally {
// 關閉數據庫連接
closeStatement(sm);
closeConnection(con);
}
}
// TODO 需要確定statement或者connection關閉后,ResultSet是否還能用
/***
* 注意:
* (1)一個Statement對象同時只能有一個結果集在活動.即使沒有調用ResultSet的close()方法,
* 只要打開第二個結果集就隱含著對上一個結果集的關閉.所以如果你想同時對多個結果集操作,
* 就要創建多個Statement對象,如果不需要同時操作,
* 那么可以在一個Statement對象上順序操作多個結果集.
*
* (2)TODO
* 垃圾回收機制可以自動關閉它們
2.Statement關閉會導致ResultSet關閉
3.Connection關閉不會(?)導致Statement關閉
4.由于垃圾回收的線程級別是最低的,為了充分利用數據庫資源,有必要顯式關閉它們,尤其是使用Connection Pool的時候。
5.最優經驗是按照ResultSet,Statement,Connection的順序執行close
6.如果一定要傳遞ResultSet,應該使用RowSet,RowSet可以不依賴于Connection和Statement。
Java傳遞的是引用,所以如果傳遞ResultSet,你會不知道Statement和Connection何時關閉,不知道ResultSet何時有效
*
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -