在本節中,我們將通過一個示例說明如何利用JDBC對數據庫進行增刪查改等各種操作,以及怎樣對結果集中的數據進行處理。
我們假設現在數據庫中有一張表tbl_user用來存放用戶信息。為了簡便起見,我們只設了3個字段:用戶名vcUsername、密碼vcPassword和注冊日期dtRegDate。
新用戶注冊時要將客戶的相關信息存入數據庫;用戶登錄時要進行密碼驗證;用戶注銷時要將其信息刪除;用戶修改自己的信息時要對數據庫中的數據進行修改。
在這個示例中我們將調用示例13-1獲取數據庫連接。另外,我們還編寫了一個User類用來操作用戶信息,如示例13-2所示。
【程序源代碼】
1// ==================== Program Description ==========================2// 程序名稱:示例13-2: User.java3// 程序目的:創建一個用來操作用戶信息的類4// ==============================================================5public class User 6{7 private String username;8 private String password;9 private String regDate;1011 // 獲取用戶名12 public String getUsername() {13 return username;14 }1516 // 設置用戶名17 public void setUsername(String username) {18 this.username = username;19 }2021 // 獲取用戶密碼22 public String getPassword() {23 return password;24 }2526 // 設置用戶密碼27 public void setPassword(String password) {28 this.password = password;29 }3031 // 獲取用戶注冊時間32 public String getRegDate() {33 return regDate;34 }3536 // 設置用戶注冊時間37 public void setRegDate(String regDate) {38 this.regDate = regDate;39 }40} |
示例13-3的UserMgr類中封裝了對數據庫中的用戶信息進行增刪查改等操作的方法。
【程序源代碼】
1// ==================== Program Description ==========================2// 程序名稱:示例13-3: UserMgr.java3// 程序目的:利用JDBC對數據庫進行增刪查改操作4// ==============================================================5import java.sql.*;6import test.DBConnection;78public class UserMgr 9{10 // 向數據庫中添加用戶信息11 public boolean addUser(User user) 12 {13 // 構造SQL語句14 String sql = "insert into tbl_user (vcUsername, vcPassword,dtRegDate) values('" +15 user.getUsername() + "','" + user.getPassword() +"',getDate())";16 Statement stmt;17 Connection conn;18 try {19 // 獲取數據庫連接20 conn = DBConnection.getConnection();2122 // 創建Statement對象23 stmt = conn.createStatement();2425 // 執行SQL語句26 stmt.executeUpdate(sql);27 stmt.close();28 conn.close();2930 return true;31 } 32 catch (SQLException e) {33 System.out.println(e.getMessage());34 }3536 return false;37 }3839 // 刪除數據庫中某個用戶的信息40 public boolean deleteUser(User user)41 {42 String sql="delete from tbl_user wherevcUsername="+"'"+user.getUsername()+"'";43 Connection conn;44 Statement stmt;4546 try {47 conn=DBConnection.getConnection();48 stmt=conn.createStatement();49 stmt.executeUpdate(sql);50 stmt.close();51 conn.close();5253 return true;54 }55 catch (SQLException e)56 {57 System.out.println(e.getMessage());58 }5960 return false;61 }6263 // 根據用戶名查詢數據庫獲取一個用戶對象64 public User getUser( String username )65 {66 User user;67 String sql="select * from tbl_user where vcUsername='"+username+"'";68 Statement stmt;69 Connection conn;7071 try {72 conn= DBConnection.getConnection();73 stmt=conn.createStatement();7475 // 執行SQL語句并將查詢結果放入結果集中76 ResultSet rs=stmt.executeQuery(sql);7778 // 將結果集中的數據取出放入User類的對象中79 if (rs.next())80 {81 user=new User();82 user.setUsername(rs.getString("vcUsername"));83 user.setPassword(rs.getString("vcPassword"));84 user.setRegDate(rs.getDate("dtRegDate").toString());85 stmt.close();86 conn.close();87 return user;88 }89 }90 catch (SQLException e)91 {92 System.out.println(e.getMessage());93 }9495 return null;96 }9798 // 通過驗證密碼鑒定用戶的身份99 public int checkUser(User user)100 {101 User dbUser= getUser(user.getUsername());102 if (dbUser==null)103 return 0;104 else if (dbUser.getPassword().equals(user.getPassword()) )105 return 1;106 else return -1;107 }108109 // 修改數據庫中某個用戶的信息110 public boolean modifyUser(User user)111 {112 Connection conn;113 Statement stmt;114 String sql="update tbl_user set vcPassword='"+user.getPassword()+"' where 115 vcUsername='"+user.getUsername()+"'";116117 try {118 conn=DBConnection.getConnection();119 stmt=conn.createStatement();120 stmt.executeUpdate(sql);121 stmt.close();122 conn.close();123124 return true;125 }126 catch (SQLException e)127 {128 System.out.println(e.getMessage());129 }130131 return false;132 }133} |
【程序注解】
要對數據庫進行操作,首先必須建立一個數據庫連接。關于這個問題,我們已經在13.3節中進行了詳細討論。因此,本例中直接調用示例13-1中的getConnection()方法(第20行)。當然,在此之前,必須將DBConnection類import進來(第6行)。然后我們就可以利用已經獲取的數據庫連接創建一個Statement對象stmt,并調用Statement類提供的方法執行SQL語句,如executeUpdate(String sql)、executeQuery(String sql)等。
如果是添加、刪除或修改用戶信息,那么執行了executeUpdate(String sql)方法之后即完成了相應操作。但如果是查詢用戶信息,則還需對結果集進行處理。例如,在getUser(String username)方法(第64行)中,我們根據用戶名查詢到了相應用戶的信息并存入了一個結果集中。然后從第78行到第87行對結果集中的數據進行處理,并關閉Statement和Connection對象。
首先判斷rs.next()是否為真,即是否從數據庫中取到了數據。如果為真,則創建一個User類的實例,并調用其set方法將結果集中的數據置入user對象中。值得注意的是,我們在添加用戶的時候,注冊時間是用getDate()方法自動獲取的,這個時間會精確到毫秒級,而我們在獲取用戶注冊時間時往往只要知道用戶是在哪一天注冊的就可以了,因此我們使用了結果集的getDate()方法獲取注冊時間(第84行)。這個方法將返回一個Date型值,但User類的setRegDate()方法要求傳遞一個字符串參數,所以我們要調用Date類的toString()方法將此時間轉化為一個字符串。如果你的確想要獲得用戶的精確注冊時間,也可以直接調用結果集的getString()方法。總之,在完成了對user對象的屬性設置之后,我們便可以將這個對象作為getUser()方法的返回值,以供該方法的調用者使用。
還有一點需要說明的是,我們這里假設數據庫里的用戶名是惟一的。如果數據庫中存在重名的用戶,我們可以定義一個Vector對象,在從結果集中獲取了每一個用戶的信息之后即將該user對象加入vector中,然后將vector作為getUser()方法的返回值。(T111)
本文選自飛思圖書《精通Java核心技術》