Java課程設計---實現登錄(2)
阿新 • • 發佈:2018-06-14
mage dax stat 2018年 const SQ getc RF ktr
前面已經完成了登錄界面的設計,單擊確認按鈕可以獲取輸入的用戶名和密碼,下面來將演示實現真實的登錄(輸入值和數據庫的比對)
1、設計“登錄服務”
通常我們根據業務關系,對相應的操作人員提供對外的各種服務,下面創建一個管理員服務類AdminService
AdminService.java(定義服務,方法實現下面補充)
package com.demo.service; /* * 項目名稱: * * 文件名稱為:AdminService.java * 文件創建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午10:04:15 * @copyright daxiang */ public class AdminService { /** * 登錄服務 * * @param id * @param pwd * @return 1、成功 2、用戶名錯誤 3、密碼錯誤 */ public int login(String id, String pwd) { return 0; } /** * 修改密碼服務 * * @param id * @param pwd * @param newpwd * @return false 修改失敗 true 修改成功 */ public boolean changePwd(String id, String pwd, String newpwd) { return false; } }
2、為登錄服務提供數據庫查詢操作
在第一節中為管理員提供了兩種服務1、登錄 2、修改密碼,但並未實現具體過程,下面來完成登錄服務的具體過程。
要判斷用戶是否能成功登錄需要兩步
(1)根據輸入的用戶名查詢數據庫中是否有該用戶
(2)如存在該用戶則比對輸入的密碼是否和數據庫中存儲的密碼相同
接下來看看傳統的查詢方式(一個完整的查詢)
package com.java.mysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * <p> * Title: db.java * </p> * * @author daxiang * @version 1.0 創建時間:2018年5月22日 上午8:00:22 */ public class DB { public static void main(String[] args) { Connection con;// 聲明Connection對象 String driver = "com.mysql.jdbc.Driver";// 驅動程序名 String url = "jdbc:mysql://localhost:3306/db_student";// URL指向要訪問的數據庫名db_student String user = "root";// MySQL配置時的用戶名 String password = "123";// MySQL配置時的密碼 try { Class.forName(driver);// 加載驅動程序 con = DriverManager.getConnection(url, user, password);// 使用getConnection()方法,連接MySQL數據庫!! if (!con.isClosed()) System.out.println("成功連接mysql數據庫"); // 2.創建statement類對象,用來執行SQL語句!! Statement statement = con.createStatement(); // 要執行的SQL語句 String sql = "select * from admin"; // 3.ResultSet類,用來存放獲取的結果集!! ResultSet rs = statement.executeQuery(sql); System.out.println("-----------------"); System.out.println("執行結果如下所示:"); System.out.println("-----------------"); System.out.println("id" + "\t" + "admin" + "\t" + "password"); System.out.println("-----------------"); // 遍歷查詢結果集 while (rs.next()) { String id = rs.getString(1);// 獲取第一列數據 String username = rs.getString(2); // 獲取第二列數據 String pwd= rs.getString(3); // 獲取第三列數據 System.out.println(id + "\t" + username + "\t" + pwd);// 輸出結果 } rs.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("無法加載驅動"); e.printStackTrace();// 數據庫驅動類異常處理 } catch (SQLException e) { e.printStackTrace();// 數據庫連接失敗異常處理 } catch (Exception e) { e.printStackTrace(); } } }
上面完成了對db_student數據庫中admin表的查詢,而且得到了結果
但是這樣的並沒有實現代碼復用,當別的實體需要查詢或者其他操作時,還需要重復的連接等過程,所以我們對常用操作進行封裝,將數據庫的基本“增、刪、查、改”封裝到一個類裏面
DbUtil.java(數據庫操作工具類)
package com.demo.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /* * 項目名稱: * * 文件名稱為:DbUtil.java * 文件創建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午7:56:46 * @copyright daxiang */ public class DbUtil { // 定義連接對象 private Connection connection; // 定義操作對象 private Statement statement; /** * * @throws Exception */ public DbUtil() throws Exception { this.connection = getCon(); this.statement = connection.createStatement(); } /** * 獲取數據庫連接 * * @return 數據庫連接Connection * @throws Exception */ public Connection getCon() throws Exception { // 說明AppConstants類中已經將一些參數作為靜態常量存儲 Class.forName(AppConstants.JDBC_DRIVER); Connection con = DriverManager.getConnection(AppConstants.JDBC_URL, AppConstants.JDBC_USERNAME, AppConstants.JDBC_PASSWORD); return con; } /** * 關閉數據庫連接 * * @param con * @throws SQLException */ public void closeCon(Connection con) throws SQLException { if (con != null) { con.close(); } } /** * 贈、刪、改 * * @param sql * @return * @throws SQLException */ public boolean execute(String sql) throws SQLException { return statement.execute(sql); } /** * 查詢 * * @param sql * @return * @throws SQLException */ public ResultSet query(String sql) throws SQLException { return statement.executeQuery(sql); } }
AppConstants .java(常量參數類)
package com.demo.util; /* * 項目名稱: * * 文件名稱為:AppConstants.java * 文件創建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午7:57:10 * @copyright daxiang */ public class AppConstants { // jdbc public static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/db_student?useUnicode=true&characterEncodeing=UTF-8"; public static final String JDBC_USERNAME = "root"; public static final String JDBC_PASSWORD = "123"; public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; }
這樣封裝後我們就可以簡化服務類中的代碼,請看
新建一個Admin實體數據庫操作類,利用dbutil工具實現查詢
AdminDao.java
package com.demo.dao; import java.sql.ResultSet; import com.demo.model.Admin; import com.demo.util.DbUtil; /* * 項目名稱: * * 文件名稱為:AdminDao.java * 文件創建人:daxiang * * 修改記錄: * 修改人 修改日期 備註 * * * * @author daxiang * @version * @time 2018年6月13日 下午10:25:06 * @copyright daxiang */ public class AdminDao { public Admin query(String username) throws Exception { // 實例化操作類 DbUtil dbUtil = new DbUtil(); // 查詢語句,由於username是字符串,所以需要username=‘" + username+"‘"這樣拼接 String sql = "select * from admin where username=‘" + username+"‘"; // 執行查詢 ResultSet rs = dbUtil.query(sql); // 創建null的admin對象 Admin admin = null; // 判斷是否有結果,並循環 while (rs.next()) { // new一個新對象賦值給admin admin = new Admin(); // 給對象賦值 admin.setId(rs.getInt("id")); admin.setUsername(rs.getString("username")); admin.setPassword(rs.getString("password")); } // 返回查詢結果 return admin; } }
下面完善AdminService中的登錄服務
package com.demo.service; import com.demo.dao.AdminDao; import com.demo.model.Admin; /* * 項目名稱: * * 文件名稱為:AdminService.java * 文件創建人:daxiang * * @author daxiang * @version * @time 2018年6月13日 下午10:04:15 * @copyright daxiang */ public class AdminService { /** * 登錄服務 * * @param id * @param pwd * @return 1、成功 2、用戶名錯誤 3、密碼錯誤 * @throws Exception */ public int login(String username, String pwd) throws Exception { // 新建admin數據庫操作對象 AdminDao adminDao = new AdminDao(); // 1、根據輸入的用戶名查詢數據庫中是否有該用戶 Admin admin = adminDao.query(username); // 判斷查詢出的用戶是否存在 if (admin != null) { //2、比對輸入的密碼是否和數據庫中存儲的密碼相同 if (admin.getPassword().equals(pwd)) { // 返回成功的代碼 return 1; } // 返回密碼錯誤的代碼 return 3; } // 返回用戶名錯誤的代碼 return 2; } /** * 修改密碼服務 * * @param id * @param pwd * @param newpwd * @return false 修改失敗 true 修改成功 */ public boolean changePwd(String id, String pwd, String newpwd) { return false; } }
修改LoginView中的處理
button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { // 獲取管理員操作服務 AdminService adminService = new AdminService(); // 處理登錄 int i = adminService.login(textField.getText(), new String( passwordField.getPassword())); //顯示各種結果 switch (i) { case 1: JOptionPane.showMessageDialog(null, "登錄成功"); // 釋放屏幕資源 dispose(); // 打開主界面 new MainView(); break; case 2: JOptionPane.showMessageDialog(null, "用戶名錯誤!"); break; case 3: JOptionPane.showMessageDialog(null, "密碼錯誤!"); break; default: break; } } catch (Exception e1) { e1.printStackTrace(); } } });
截圖
用戶名錯誤
密碼錯誤
登錄成功
Java課程設計---實現登錄(2)