零、本讲学习目标
1、学会分析“用户登录”任务结合JDBC技术改写的实现思路
2、根据思路独立完成连接数据库版本的“用户登录”任务
一、图形界面“用户登录”实现思路
- 第30讲的用户登录程序,实现了图形用户界面,但是用于判断用户是否合法的用户名与密码是在程序里写死了的,并不是连接数据库之后通过查询用户表来判断是否存在用户记录。
- 创建用户数据访问对象类UserDao,提供一个登录方法:
boolean login(String username, String password)
,如果输入的用户名和密码能在用户表里查询到相应记录,则返回true
,否则返回false
。
- 利用login()方法来改写LoginFrame类的登录按钮单击事件处理方法
- 为了封装用户表记录数据,要创建用户实体类User
- 为了更好地获取和关闭数据库连接,要创建数据库连接管理类ConnectionManager
二、图形界面“用户登录”实现步骤
1、创建用户实体类
- 创建用户实体类User
package net.hw.lesson32;
import java.sql.Timestamp;
public class User {
private int id;
private String username;
private String password;
private String telephone;
private Timestamp registerTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public Timestamp getRegisterTime() {
return registerTime;
}
public void setRegisterTime(Timestamp registerTime) {
this.registerTime = registerTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", telephone='" + telephone + '\'' +
", registerTime=" + registerTime +
'}';
}
}
3、创建数据库连接管理类
- 创建数据库连接管理类ConnectionManager
package net.hw.lesson32;
import javax.swing.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionManager {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/student";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private ConnectionManager() {
}
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException e) {
System.err.println("错误提示:数据库驱动程序未找到!");
} catch (SQLException e) {
System.err.println("温馨提示:数据库连接失败!");
}
return conn;
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
System.err.println("温馨提示:数据库连接关闭失败!");
}
}
}
public static void main(String[] args) {
Connection conn = getConnection();
if (conn != null) {
JOptionPane.showMessageDialog(null, "恭喜,数据库连接成功!");
} else {
JOptionPane.showMessageDialog(null, "遗憾,数据库连接失败!");
}
closeConnection(conn);
}
}
- 运行程序,查看结果
3、创建用户数据访问对象类
- 创建用户数据访问对象类UserDao
package net.hw.lesson32;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao {
public boolean login(String username, String password) {
Connection conn = ConnectionManager.getConnection();
try {
String strSQL = "select * from t_user where username = ? and password = ?";
PreparedStatement pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return false;
}
}
4、创建测试用户数据访问对象类
- 创建测试用户数据访问对象类TestUserDao
package net.hw.lesson32;
import java.util.Scanner;
public class TestUserDao {
public static void main(String[] args) {
String username;
String password;
Scanner sc = new Scanner(System.in);
UserDao userDao = new UserDao();
System.out.print("输入用户名:");
username = sc.next();
System.out.print("输入密码:");
password = sc.next();
if (userDao.login(username, password)) {
System.out.println("恭喜,登录成功!");
} else {
System.err.println("遗憾,登录失败!");
}
}
}
- 运行程序,查看结果
- 再运行程序,查看结果
5、创建用户登录窗口类
- 创建用户登录窗口类LoginFrame
package net.hw.lesson32;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginFrame extends JFrame {
public LoginFrame(String title) throws HeadlessException {
super(title);
initGUI();
}
private void initGUI() {
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
JPanel panel = (JPanel) getContentPane();
panel.setLayout(new GridLayout(3, 1));
panel.add(panel1);
panel.add(panel2);
panel.add(panel3);
JLabel lblUsername = new JLabel("用户名:");
JTextField txtUsername = new JTextField(15);
panel1.add(lblUsername);
panel1.add(txtUsername);
JLabel lblPassword = new JLabel("密 码:");
JPasswordField txtPassword = new JPasswordField(15);
panel2.add(lblPassword);
panel2.add(txtPassword);
JButton btnLogin = new JButton("登录");
JButton btnCancel = new JButton("取消");
panel3.add(btnLogin);
panel3.add(btnCancel);
setBounds(200, 200, 300, 200);
setLocationRelativeTo(null);
pack();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String username = txtUsername.getText().toString();
String password = new String(txtPassword.getPassword());
UserDao userDao = new UserDao();
if (userDao.login(username, password)) {
JOptionPane.showMessageDialog(LoginFrame.this,
"欢迎登录系统!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
LoginFrame.this.dispose();
} else {
JOptionPane.showMessageDialog(LoginFrame.this,
"用户名或密码有错误!", "提示信息", JOptionPane.ERROR_MESSAGE);
}
}
});
}
public static void main(String[] args) {
LoginFrame loginFrame = new LoginFrame("登录窗口");
}
}
- 运行程序,查看结果
三、课后作业:完成用户注册窗口程序
- 在UserDao类里添加添加用户记录的方法
public int insert(User user)
- 单击【注册】按钮,利用窗口输入的数据创建用户对象,再调用UserDao对象的insert()方法,插入新注册的用户
- 注册成功,弹出消息框“恭喜,注册成功!”,关闭窗口
- 注册失败,弹出消息框“遗憾,注册失败”
- 单击【取消】按钮,关闭窗口