日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

java通过jdbc登陆系统_JDBC模拟登录

發布時間:2025/3/20 windows 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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模拟登录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。