用户登录
模拟用户登录功能
配置信息:
- EditPlus 文本编辑器或者 类似 IDEA 的 IDE 工具(2019.3、JDK11)
- MySQL DBMS(MySQL8)
- MySQL 实现 Java.sql 包下接口的 jar 包(mysql-connector-java-5.1.48)
- Power Deisigner(16.5)
1. 首先使用PowerDesigner工具进行数据库中表的设计,得到.pdm
文件。如下:
与此同时,PD为我们写好了简单的sql脚本,保存下来,如下:
这里可以对sql脚本进行适当的编辑,以符合我们的要求:插入几条用户信息到数据库中,以便后面登陆时对其进行验证,脚本程序如下:
drop table if exists t_user;
/*==============================================================*/
/* Table: t_user */
/*==============================================================*/
create table t_user
(
id int auto_increment,
loginName varchar(255),
loginPwd varchar(255),
realName varchar(255),
primary key (id)
);
insert into t_user(loginName, loginPwd, realName) values('zhangsan', '222', '张三');
insert into t_user(loginName, loginPwd, realName) values('lisi', '111', '李四');
insert into t_user(loginName, loginPwd, realName) values('wangwu', '333', '王五');
commit;
select * from t_user;
2. 数据准备好之后,开始写 Java 程序:
说明:
- 这里的数据库用户名用
xxx
代替,密码用yyy
代替,表名用zzz
代替- 一开始运行时出错,在表名后加入
useUnicode=true&characterEncoding=utf-8&useSSL=false
解决
代码:
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* 模拟用户登录功能
* 程序运行时,提供一个输入的入口,让用户输入用户名和密码
* 用户输入用户名和密码之后,提交信息,Java程序收到用信息
* JAVA 程序连接数据库验证用户信息是否合法,合法显示“登录成功”,否则显示“登录失败”
*
* 数据准备:
* 实际开发中,表的设计会使用专业的建模工具。使用PD工具进行数据库表的设计
* (参见user-login.sql脚本)
*/
public class JDBCTest05 {
public static void main(String[] args) {
// 初始化一个界面
Map<String,String> userLoginInfo = InitUI();
// 验证用户名和密码
boolean loginSuccess = login(userLoginInfo);
// 最后输出结果
System.out.println(loginSuccess == true ? "登录成功,欢迎!" : "登录失败!");
}
/**
* 用户登录
* @param userLoginInfo 用户登录输入的信息
* @return 返回 true 表示登录成功,false 表示登录失败
*/
private static boolean login(Map<String, String> userLoginInfo){
// 标记
boolean loginSuccess = false;
String username = userLoginInfo.get("username");
String password = userLoginInfo.get("password");
// JDBC 代码
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/zzz?useUnicode=true&characterEncoding=utf-8&useSSL=false",
"xxx", "yyy");
// 3. 获取数据库操作对象
stmt = conn.createStatement();
// 4. 执行 sql 语句
// 普通的字符串拼接:"+ +"
String sql = "select * from t_user where loginName = '" + username + "' and loginPwd = '" + password + "'";
rs = stmt.executeQuery(sql);
// 这里不用循环,因为只需要查一条记录,如果查不到,说明输入的信息时错的,如果查到了,说明用户信息输入正确
if (rs.next()){
loginSuccess = true;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 6. 释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 5. 处理查询结果集
return loginSuccess;
}
/**
* 初始化用户界面
* @return 返回用户输入的用户名和密码等登录信息
*/
private static Map<String,String> InitUI() {
Scanner s = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = s.nextLine();
System.out.print("请输入密码:");
String password = s.nextLine();
Map<String,String> userLoginInfo = new HashMap<>();
userLoginInfo.put("username",username);
userLoginInfo.put("password",password);
return userLoginInfo;
}
}
3. 运行结果:
如果不是输入我们数据库表中的用户信息,就会导致身份验证失败!