Java讲课笔记32:利用JDBC实现系统登录功能

零、本讲学习目标

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;

/**
 * 功能:用户实体类
 * 作者:华卫
 * 日期:2020年06月02日
 */
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;

/**
 * 功能:数据库连接管理类
 * 作者:华卫
 * 日期:2020年06月02日
 */
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() {
    }

    /**
     * 获取数据库连接方法
     *
     * @return 数据库连接
     */
    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;
    }

    /**
     * 关闭数据连接方法
     *
     * @param conn
     */
    public static void closeConnection(Connection conn) {
        // 判断数据库连接是否为空
        if (conn != null) {
            try {
                // 判断数据库连接是否关闭
                if (!conn.isClosed()) {
                    // 关闭数据库连接
                    conn.close();
                }
            } catch (SQLException e) {
                System.err.println("温馨提示:数据库连接关闭失败!");
            }
        }
    }

    /**
     * 测试数据库连接是否成功
     *
     * @param args
     */
    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;

/**
 * 功能:用户数据访问对象
 * 作者:华卫
 * 日期:2020年06月02日
 */
public class UserDao {
    public boolean login(String username, String password) {
        // 1. 获取数据库连接
        Connection conn = ConnectionManager.getConnection();
        try {
            // 2. 定义SQL字符串
            String strSQL = "select * from t_user where username = ? and password = ?";
            // 3. 创建预备语句对象
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 4. 设置占位符的值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            // 5. 执行SQL语句,返回结果集
            ResultSet rs = pstmt.executeQuery();
            // 6. 判断结果集是否为空
            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;

/**
 * 功能:测试用户数据访问对象类
 * 作者:华卫
 * 日期:2020年06月02日
 */
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;

/**
 * 功能:用户登录
 * 作者:华卫
 * 日期:2020年06月02日
 */
public class LoginFrame extends JFrame {
    /**
     * 构造方法
     *
     * @param title
     * @throws HeadlessException
     */
    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的布局为表格布局
        panel.setLayout(new GridLayout(3, 1));
        // 将三个小面板添加到面板panel里
        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);
                }
            }
        });
    }

    /**
     * 主方法
     *
     * @param args
     */
    public static void main(String[] args) {
        // 实例化登录窗口对象
        LoginFrame loginFrame = new LoginFrame("登录窗口");
    }
}
  • 运行程序,查看结果
    在这里插入图片描述

三、课后作业:完成用户注册窗口程序

在这里插入图片描述

  • 在UserDao类里添加添加用户记录的方法public int insert(User user)
  • 单击【注册】按钮,利用窗口输入的数据创建用户对象,再调用UserDao对象的insert()方法,插入新注册的用户
  • 注册成功,弹出消息框“恭喜,注册成功!”,关闭窗口
  • 注册失败,弹出消息框“遗憾,注册失败”
  • 单击【取消】按钮,关闭窗口

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/106437726