更新時(shí)間:2021-12-13 來源:黑馬程序員 瀏覽量:
在實(shí)際開發(fā)中,用戶信息是存放在數(shù)據(jù)庫(kù)中的,登錄時(shí)的賬號(hào)和密碼信息也需要去數(shù)據(jù)庫(kù)中查詢,本節(jié)將使用JDBC技術(shù)來完善QQ登錄案例。
在jdbc數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)表tb_qquser,并在表中插入3條數(shù)據(jù),其執(zhí)行的SQL語(yǔ)句如下:
CREATE TABLE tb_qquser ( id INT PRIMARY KEY AUTO_INCREMENT, qqnumber VARCHAR (50), password VARCHAR(50) ); INSERT INTO tb_qquser (qqnumber, password) VALUES ('123456789', '123'); INSERT INTO tb_qquser (qqnumber,password) VALUES ('987654321', '456'); INSERT INTO tb_qquser (qqnumber,password) VALUES ('1314520888', '123abe');
在實(shí)際開發(fā)中,用戶信息是存放在數(shù)據(jù)庫(kù)中的,登錄時(shí)的賬號(hào)和密碼信息也需要去數(shù)據(jù)庫(kù)中查詢,本節(jié)將使用JDBC技術(shù)來完善QQ登錄案例。
創(chuàng)建一個(gè)用于實(shí)現(xiàn)用戶登錄相關(guān)操作的類LoginDao,并在類中編寫查詢用戶的方法findUser(),如例9-2所示。
例9-2 LoginDao.java
import java.sql.*; public class LoginDao { PreparedStatement prestnt =null; Connection conn =null; ResultSet rs =null, //查詢用戶 public Boolean findUser (String qqnumber, String pwd) throws SQLException { try { //1.加載數(shù)據(jù)庫(kù)驅(qū)動(dòng) Class.forName("com.mysq1.jdbc.Driver"); String url ="jdbc:mysql://localhost:3306/jdbc": String username ="root"; String password ="root"; //2.獲取數(shù)據(jù)庫(kù)連接 conn =DriverManager .getConnection (url, username, password) ; //3.定義需要執(zhí)行的SQL String sql ="select * from tb_qquser " +"where qqnumber =? " +"and password =?"; //4.創(chuàng)建PreparedStatement對(duì)象 prestmt =conn.prepareStatement(sql); prestmt.setString(1, qqnumber); prestmt.setString (2, pwd); //5.執(zhí)行SQL并將獲取的數(shù)據(jù)信息存放在ResultSet中 rs =prestmt.executeQuery(); //如果查詢的結(jié)果集中有超過一條的記錄,則登錄成功 if (rs.next()) { return true; } } catch (Exception e) { e.printStackTrace(); } finally { //6.釋放資源 if (rs !=null) {rs.close(); } if (prestnt !=null){prestmt.close();} if (conn !=null) {conn.close();} } return false; } }
在上述的查詢用戶方法中,加粗部分的代碼就是查詢操作的主要代碼。在定義的SQL中,使用占位符“?”來表示查詢條件,并通過PreparedStatement對(duì)象的setString()方法設(shè)置參數(shù)值。執(zhí)行SQL后,如果結(jié)果集中有超過一條以上的數(shù)據(jù),那么就表示數(shù)據(jù)表中有此用戶,會(huì)返回true;否則表示沒有此用戶,將返回false。
將登錄監(jiān)聽器類LoginListener中 actionPerformed()方法內(nèi)的模擬查詢用戶名和密碼的代碼修改為查詢數(shù)據(jù)庫(kù)的方法,修改后的方法代碼如下:
public void actionPerformed (ActionEvent e) { //1.獲取登錄的賬號(hào)和密碼 String name = (String) jco.getSelectedItem(); String pwd =new String (jpa.getPassword () ); //創(chuàng)建LoginDao對(duì)象 LoginDao loginDao =new LoginDao () ; //查詢登錄用戶,如果有此用戶并且密碼正確則返回true Boolean bl =false; try { bl =loginDao.findUser (name, pwd) ; } catch (SQLException el) el.printStackTrace(); { //2判斷輸入的賬號(hào)和密碼是否正確 If(bl) { //賬號(hào)正確,先關(guān)閉當(dāng)?shù)腏Erame登錄窗口 jf.diapose (): //模監(jiān)顯示登錄成功后的QQ窗口 JFrane jfn =new JErame(); Jfn.setSize(289, 687); jfn.setLocation(800, 100); jfn.setUndecorated(true); jfn.setResizable (true); jfn.setVisible (true); //為QQ顯示窗口添加背景圖片和退出按鈕組件 JPanel panel =new JPanel (); panel.setLayout (null); panel.setPreferredSize(new Dimension (0, 140)); ImageIcon image =new ImageIcon("images/qqSuccess.jpg"); JLabel background =new JLabel (image); background.setBounds (0, 0, 289, 687); panel.add (background); //添加退出按紐 JButton out = new JButton (new ImageIcon("images/close2 normal.jpg")); out.setBounds(265, 0, 26, 26); out.setRolloverIcon(new ImageIcon("images/close2 hover.jpg")); out.setBorderPainted(false); panel.add (out); jfn.add(panel); //為退出按鈕注冊(cè)監(jiān)聽器,關(guān)閉當(dāng)前窗口 out.addActionListener (event ->jfn.dispose ()); ) else ( //QQ賬號(hào)或密碼輸入錯(cuò)誤,彈出提示信息 J0ptionPane.showMessageDialog (null, “你輸入的賬戶名或密碼不正確,請(qǐng)重新輸入!”); } }
從上述代碼可以看出,所修改的部分其實(shí)非常簡(jiǎn)單。首先創(chuàng)建了LoginDao對(duì)象,然后使用該對(duì)象的findUser()方法來查詢是否存在所輸入的用戶,如果返回結(jié)果為true,則表示存在該用戶,可以成功登錄;如果為false,則提示賬戶名或密碼錯(cuò)誤。
修改完成后,即可啟動(dòng)程序,此時(shí)的登錄窗口如圖9-5所示。
在QQ登錄窗口分別輸入正確的賬號(hào)和密碼并單擊登錄按鈕后,將顯示登錄后的窗口信息,如圖9-6所示。
從圖9-6可以看出,用戶已登錄成功,這說明使用JDBC已正確查詢出了數(shù)據(jù)表中的數(shù)據(jù)。如果通過其他兩個(gè)賬號(hào),在輸入正確的密碼后,將同樣可以登錄成功。這里就不再演示了,讀者可自行測(cè)試。
猜你喜歡:JDBC處理CLOB數(shù)據(jù)和BLOB數(shù)據(jù)
使用MySQL數(shù)據(jù)庫(kù),實(shí)現(xiàn)你的第一個(gè)JDBC程序