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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值