1. 程式人生 > >Java課程設計---實現登錄(2)

Java課程設計---實現登錄(2)

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)