java通过jdbc登陆系统_JDBC模拟登录
一、需求
系統需求
在使用該系統之前,需要先使用已注冊(假設已注冊)的用戶名和密碼進行登錄,系統驗證登錄信息準確后才能進入該系統使用其功能。
用戶需求
用戶在使用一個系統之前需要先進行用戶驗證,才能使用系統的功能。
二、設計
2.1 數據庫設計
用戶信息表
表名:t_user
字段:id(自增主鍵),username(用戶名),password(登陸密碼)
數據類型:int,varchar(255),varchar(255)
字段值長度:32,255,255
主外鍵:id
約束:
2.2 業務流程設計
主頁面
瀏覽器打開系統的地址
加載登陸主頁面
用戶登錄
用戶輸入登錄用戶名
用戶輸入密碼
系統連接數據庫,驗證用戶輸入的登陸用戶名和密碼是否正確
三、實現
連接數據庫的信息db.properties文件
#數據庫驅動
sqlDriver = com.mysql.jdbc.Driver
#數據庫的ip地址 端口號 數據庫實例
url = jdbc:mysql://127.0.0.1:3306/xxxxx你的數據庫實例
#數據庫用戶
user = xxxxx你的賬戶名
#密碼
password = xxxxx你的數據庫密碼
3.1 業務合體版
所有的功能集成在一個類中,(顯得復雜)
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Scanner;
public class LoginTest {
public static void main(String[] args) {
//進入登陸頁面
System.out.println("歡迎來到登陸界面,請在下方輸入:");
//調用初始化頁面方法--會返回在登陸頁面輸入的用戶名和密碼
Map loginInfo = initUI();
//調用登陸方法:將輸入的用戶名和密碼 進行數據庫查詢完成登錄
//boolean isLogin = login(loginInfo.get("loginName"),loginInfo.get("loginPassword"));
boolean isLogin = login(loginInfo);
//是否登錄成功
System.out.println(isLogin?"歡迎您回來!":"登陸失敗!請重新輸入用戶名或密碼");
}
//連接數據,驗證用戶登錄信息
private static boolean login(Map loginInfo) {
//通過配置文件獲取 數據庫驅動 和 數據庫信息
ResourceBundle rsBundle = ResourceBundle.getBundle("db");
//獲取數據庫驅動
String driver = rsBundle.getString("sqlDriver");
//獲取數據庫ip地址
String url = rsBundle.getString("url");
//獲取數據庫信息
String user = rsBundle.getString("user");
String userpassword = rsBundle.getString("password");
java.sql.Connection con = null;
Statement stat = null;
ResultSet rs = null;
// 判斷驗證是否成功的標志
boolean loginIsSuccess = false;
try {
//1、注冊數據庫驅動(加載數據庫驅動)
Class.forName(driver);
//2、連接數據庫
con = DriverManager.getConnection(url,user,userpassword);
//3、創建數據庫操作對象
stat = con.createStatement();
//4、編寫sql語句
// 先查詢數據庫數據再匹配用戶輸入的信息(效率低下)
// String sql = "select username,password from t_user ";
// 使用 用戶輸入的信息到數據庫中查詢得到,則說明登錄成功
String sql = "select username,password from t_user " +
"where username = '" + loginInfo.get("loginName")+
"' and password = '" + loginInfo.get("loginPassword")+ "'";
//5、執行sql語句(DML語句)
//5.1、執行sql語句(DQL語句),返回查詢結果集
rs = stat.executeQuery(sql);
//5.1.1、處理查詢結果集
if (rs.next()){
loginIsSuccess = true;
}
/* while (rs.next()){
String username1 = rs.getString("username");
String password1 = rs.getString("password");
//
if (username1.equals(loginName) && password1.equals(loginPassword)){
return true;
}
break;
}*/
}catch (Exception e){
e.printStackTrace();
}finally {
//6、關閉資源,從小到大逐層關閉
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return loginIsSuccess;
}
//用戶登陸頁面
private static Map initUI() {
// 接收用戶從鍵盤輸入的用戶名和密碼
Scanner s = new Scanner(System.in);
System.out.print("用戶名:");
String loginName = s.nextLine();
System.out.print("密碼:");
String loginPassword = s.nextLine();
//將用戶輸入的用戶名和密碼存入Map--用于將信息返回到驗證中
Map userInfo = new HashMap<>();
userInfo.put("loginName",loginName);
userInfo.put("loginPassword",loginPassword);
//將保存的用戶信息返回,以和數據庫信息做匹配
return userInfo;
}
}
3.2 業務拆分版(注意訪問控制權限)
初始化登陸頁面 + 用戶輸入登錄用戶名和密碼等信息
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
//登錄頁面類
public class UI {
//用戶登陸頁面
public static Map initUI() {
System.out.println("歡迎來到登陸界面,請在下方輸入:");
Scanner s = new Scanner(System.in);
System.out.print("用戶名:");
String loginName = s.nextLine();
System.out.print("密碼:");
String loginPassword = s.nextLine();
//將輸入的用戶名和密碼存入Map
Map userInfo = new HashMap<>();
userInfo.put("loginName",loginName);
userInfo.put("loginPassword",loginPassword);
//將保存的用戶信息返回,以和數據庫信息做匹配
return userInfo;
}
}
系統連接數據庫 + 查詢驗證用戶輸入的登錄信息
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import java.util.ResourceBundle;
// 鏈接驗證類
public class Connection {
//先連接數據庫
public static boolean getConnection(Map loginInfo) {
//通過配置文件獲取 數據庫驅動 和 數據庫信息
ResourceBundle rsBundle = ResourceBundle.getBundle("db");
//獲取數據庫驅動
String driver = rsBundle.getString("sqlDriver");
//獲取數據庫ip地址
String url = rsBundle.getString("url");
//獲取數據庫信息
String user = rsBundle.getString("user");
String userpassword = rsBundle.getString("password");
java.sql.Connection con = null;
Statement stat = null;
ResultSet rs = null;
// 判斷登錄成功的標志
boolean loginIsSuccess = false;
try {
//1、注冊數據庫驅動(加載數據庫驅動)
Class.forName(driver);
//2、連接數據庫
con = DriverManager.getConnection(url,user,userpassword);
//3、創建數據庫操作對象
stat = con.createStatement();
//4、編寫sql語句
//String sql = "select username,password from t_user";
String sql = "select username,password from t_user " +
"where username = '" + loginInfo.get("loginName")+
"' and password = '" + loginInfo.get("loginPassword")+ "'";
//5、執行sql語句(DML語句)
//5.1、執行sql語句(DQL語句),返回查詢結果集
rs = stat.executeQuery(sql);
//5.1.1、處理查詢結果集
if(rs.next()){
// 若使用 用戶輸入的信息到數據庫中查詢得到,則說明登錄成功
loginIsSuccess = true;
}
}catch (Exception e){
e.printStackTrace();
}finally {
//6、關閉資源,從小到大逐層關閉
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return loginIsSuccess;
}
}
完成登錄
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Map;
import java.util.ResourceBundle;
// 用戶登陸類
public class Login {
public static void main(String[] args) {
//初始化登陸頁面--獲取用戶輸入的登錄信息
Map loginInfo = UI.initUI();
// 驗證用戶輸入的登錄信息
boolean isLogin = Connection.getConnection(loginInfo);
// 登錄的結果
System.out.println(isLogin?"歡迎您回來!":"登陸失敗!請重新輸入用戶名或密碼");
}
}
四、難點
用戶輸入的登錄信息(用戶名和密碼)應該保存到哪?
使用字符串接收用戶輸入的信息
Scanner s = new Scanner(System.in);
System.out.print("用戶名:");
String loginName = s.nextLine();
System.out.print("密碼:");
String loginPassword = s.nextLine();
使用集合保存用戶輸入的信息(Map的key和value的映射)
Scanner s = new Scanner(System.in);
System.out.print("用戶名:");
String loginName = s.nextLine();
System.out.print("密碼:");
String loginPassword = s.nextLine();
//將輸入的用戶名和密碼存入Map
Map userInfo = new HashMap<>();
userInfo.put("loginName",loginName);
userInfo.put("loginPassword",loginPassword);
如何將用戶輸入的用戶登錄信息和數據庫表數據進行查詢匹配?
查詢所有數據再和輸入的用戶信息匹配(效率低下且不安全)
private static boolean login(String loginName,String loginPassword) {
try {
//4、編寫sql語句
String sql = "select username,password from t_user " ;
//5、執行sql語句(DQL語句),返回查詢結果集
rs = stat.executeQuery(sql);
//5.1、處理查詢結果集
while (rs.next()){
String username = rs.getString("username");
String password = rs.getString("password");
// 使用數據庫查詢的數據 和 用戶輸入的進行匹配
if (username.equals(loginName) && password.equals(loginPassword)){
return true;
}
break;
}
}
}
使用用戶輸入的信息作為查詢條件到數據庫中查詢(效率較高)
private static boolean login(Map loginInfo) {
boolean loginIsSuccess = false;
try {
//4、編寫sql語句
String sql = "select username,password from t_user " +
"where username = '" + loginInfo.get("loginName")+
"' and password = '" + loginInfo.get("loginPassword")+ "'";
//5、執行sql語句(DQL語句),返回查詢結果集
rs = stat.executeQuery(sql);
//5.1、處理查詢結果集
if (rs.next()){
// 直接判斷查詢結果集,有數據則說明查詢返回相同的用戶信息
loginIsSuccess = true;
}
}
return loginIsSuccess;
}
對用戶信息和數據庫信息匹配結果的處理?
根據不同的查詢語句,會有不同的返回結果集,具體需不需要遍歷結果集,還是只需要判斷查詢結果集是否有數據再看思維邏輯。
存在sql注入問題?
在真正需要執行的SQL執行之前,整個SQL框架和用戶輸入的"條件字段"會一同進行編譯再去執行,這就引起用輸入的"條件字段"若是帶有SQL關鍵字時,會連同SQL框架一起進行編譯,從而曲解原SQL框架的執行意愿。
//3、創建數據庫操作對象
stat = con.createStatement();
//4、編寫sql語句 -- SQL框架 連同 用戶輸入的"條件字段"一起拼接編譯
String sql = "select username,password from t_user " +
"where username = '" + loginInfo.get("loginName")+
"' and password = '" + loginInfo.get("loginPassword")+ "'";
//5、執行sql語句,返回查詢結果集
rs = stat.executeQuery(sql);
//5.1、處理查詢結果集
解決SQL注入:使用預編譯的數據庫操作對象--PreparedStatement類,將SQL框架和用戶輸入的"拼接字段"分開編譯和執行,先對整個SQL框架進行預編譯,再限定用戶輸入的"拼接字段"只能為"字段值",最后編譯過的SQL框架再連同"拼接字段"進行一起執行。
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
// 判斷登錄成功的標志
boolean loginIsSuccess = false;
try {
//3、獲取數據庫操作對象--預編譯對象
//3.1、預編譯的SQL框架--不含用戶輸入的拼接"條件字段"
String sql = "select * from t_user where username=? and password=?";
ps = conn.prepareStatement(sql);
//4、執行sql前的準備
//經過預編譯的SQL框架,缺少具體執行的"條件字段",SQL框架中的一個?代表一個"條件字段"
ps.setString(1,loginName);
ps.setString(2,loginPassword);
//5、執行sql
rs = ps.executeQuery();
//5.1.1、處理查詢結果集
if(rs.next()){
// 若使用 用戶輸入的信息到數據庫中查詢得到,則說明登錄成功
loginIsSuccess = true;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
總結
以上是生活随笔為你收集整理的java通过jdbc登陆系统_JDBC模拟登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java读取frp_【原创】FRP初探(
- 下一篇: php 半角全角,PHP 全角转半角实现