详解Java GUI连接Derby数据库,实现注册登录功能

2021/6/18 2:03:16

本文主要是介绍详解Java GUI连接Derby数据库,实现注册登录功能,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

0x01 功能分析

  1. 连接Derby数据库
    在Java中,要想连接Derby数据库,首先要确保Derby数据库的三个jar文件添加到系统环境变量CLASSPATH中(如果是使用集成IDE开发,则对应不同的IDE要具体配置)。
    然后,使用Class.forName("org.apache.derby.jdbc.EmbeddedDriver");加载驱动,使用DriverManager.getConnection("jdbc:derby:【这里是数据库的路径】")连接数据库,当然,要先创建好,否则是连接不上的。
  2. 实现查询数据库功能
    使用SQL查询语句在Java中的封装:Connection(与数据库建立的连接)、Statement(SQL语句的抽象)、ResultSet(数据库返回的结果集)。
    例如下:
    Connection conn = DriverManager.getConnection("jdbc:derby:test;create=true");// 连接到test数据库,如果不存在则新建一个
    Statement stat = conn.createStatement("SELECT * FROM users");// SQL语句的封装
    ResultSet rs = stat.executeQuery();// 返回的结果集合
    
  3. 注册页面(布局)
    public class RegisterPanel extends JPanel {
    
    	RegisterPanel() {
        	setLayout(new FlowLayout());
        	init();
    	}
    	
    	void init() {
        	var idText = new JTextField(10);
        	var pasText = new JTextField(10);
        	var dateText = new JTextField(10);
        	var registerButton = new JButton("注册");
        	add(new JLabel("ID:"));
        	add(idText);
        	add(new JLabel("密码:"));
        	add(pasText);
        	add(new JLabel("出生日期(****-**-**):"));
        	add(dateText);
        	add(registerButton);
    	}
    }
    
  4. 登录页面(布局)
    public class LoginPanel extends JPanel {
    
    	LoginPanel() {
        	setLayout(new FlowLayout());
        	init();
    	}
    
    	void init() {
        	var idText = new JTextField(10);
        	var pasText = new JTextField(10);
        	var loginButton = new JButton("登录");
        	add(new JLabel("ID:"));
        	add(idText);
        	add(new JLabel("密码:"));
        	add(pasText);
        	add(loginButton);
    	}
    }
    

0x02 代码实现

DbBridge.java

package Login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 处理与数据库的通讯
 * 
 * @since 10
 * @author TagBug {@link https://github.com/tagbug}
 */
public class DbBridge {
    private Connection conn;
    private static final String registerQuery = "INSERT INTO users VALUES(?,?,?)";// 预处理
    private static final String passwordQuery = "SELECT password FROM users WHERE id=?";// 预处理

    /**
     * 默认构造方法,建立与数据库的连接
     * 
     * @throws ClassNotFoundException 加载数据库驱动失败
     * @throws SQLException           建立连接失败
     */
    DbBridge() throws ClassNotFoundException, SQLException {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");// 加载Derby数据库驱动
        conn = DriverManager.getConnection("jdbc:derby:test;create=true");// 连接到test数据库,如果不存在则新建一个
    }

    /**
     * 注册,将信息存入数据库
     * 
     * @param id        用户ID
     * @param password  用户密码
     * @param birthDate 出生日期
     * @return 是否成功
     */
    public boolean register(String id, String password, String birthDate) throws SQLException {
        var preStat = conn.prepareStatement(registerQuery);// 预处理SQL语句
        preStat.setString(1, id);
        preStat.setString(2, password);
        preStat.setString(3, birthDate);
        if (preStat.executeUpdate() != 0) {
            return true;
        }
        return false;
    }

    /**
     * 登录,读取与ID对应的密码,检测给出的密码与数据库中的密码是否一致 (在实际运用中一般是将密码做Hash处理,将Hash值作比较,而非直接明文)
     * 
     * @param id       用户ID
     * @param password 用户密码
     * @return 是否成功
     */
    public boolean login(String id, String password) throws SQLException {
        var preStat = conn.prepareStatement(passwordQuery);// 预处理SQL语句
        preStat.setString(1, id);
        try (ResultSet rs = preStat.executeQuery()) {
            if (rs.next()) {
                if (rs.getString(1).equals(password)) {
                    return true;
                }
            }
        }
        return false;
    }
}

LoginPanel.java

package Login;

import java.awt.FlowLayout;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * 登录界面视图
 * 
 * @since 10
 * @author TagBug {@link https://github.com/tagbug}
 */
public class LoginPanel extends JPanel {
    private DbBridge dbBridge;

    LoginPanel(DbBridge dbBridge) {
        this.dbBridge = dbBridge;
        setLayout(new FlowLayout());
        init();
    }

    void init() {
        var idText = new JTextField(10);
        var pasText = new JTextField(10);
        var loginButton = new JButton("登录");
        loginButton.addActionListener(e -> {
            try {
                if (dbBridge.login(idText.getText(), pasText.getText())) {
                    JOptionPane.showMessageDialog(this, "登录成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(this, "登录失败!ID不存在或密码错误!", "错误", JOptionPane.ERROR_MESSAGE);
                }
            } catch (SQLException e1) {
                // 出现其他异常的处理
                e1.printStackTrace();
                JOptionPane.showMessageDialog(this, "注册失败:" + e1, "错误", JOptionPane.ERROR_MESSAGE);
            }
        });
        add(new JLabel("ID:"));
        add(idText);
        add(new JLabel("密码:"));
        add(pasText);
        add(loginButton);
    }
}

RegisterPanel.java

package Login;

import java.awt.FlowLayout;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * 注册界面视图
 * 
 * @since 10
 * @author TagBug {@link https://github.com/tagbug}
 */
public class RegisterPanel extends JPanel {
    private DbBridge dbBridge;

    RegisterPanel(DbBridge dbBridge) {
        this.dbBridge = dbBridge;
        setLayout(new FlowLayout());
        init();
    }

    void init() {
        var idText = new JTextField(10);
        var pasText = new JTextField(10);
        var dateText = new JTextField(10);
        var registerButton = new JButton("注册");
        registerButton.addActionListener(e -> {
            try {
                if (dbBridge.register(idText.getText(), pasText.getText(), dateText.getText())) {
                    JOptionPane.showMessageDialog(this, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(this, "注册失败!ID不能重复!", "错误", JOptionPane.ERROR_MESSAGE);
                }
            } catch (SQLException e1) {
                // 出现其他异常的处理
                e1.printStackTrace();
                JOptionPane.showMessageDialog(this, "注册失败:" + e1, "错误", JOptionPane.ERROR_MESSAGE);
            }
        });
        add(new JLabel("ID:"));
        add(idText);
        add(new JLabel("密码:"));
        add(pasText);
        add(new JLabel("出生日期(****-**-**):"));
        add(dateText);
        add(registerButton);
    }
}

MainFrame.java

package Login;

import java.awt.BorderLayout;
import java.sql.SQLException;

import javax.swing.JFrame;
import javax.swing.JTabbedPane;

/**
 * 主窗体
 * 
 * @since 10
 * @author TagBug {@link https://github.com/tagbug}
 */
public class MainFrame extends JFrame {
    private DbBridge dbBridge;

    MainFrame() throws ClassNotFoundException, SQLException {
        dbBridge = new DbBridge();
        setTitle("登录&注册");
        setBounds(10, 10, 600, 140);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
        setVisible(true);
    }
    
    void init() {
        var tabPanel = new JTabbedPane();
        var loginPanel = new LoginPanel(dbBridge);
        var registerPanel = new RegisterPanel(dbBridge);
        tabPanel.add("我要注册", registerPanel);
        tabPanel.add("我要登陆", loginPanel);
        add(tabPanel, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        try {
            new MainFrame();
        } catch (ClassNotFoundException e) {
            System.out.println("驱动加载失败!" + e);
        } catch (SQLException e) {
            System.out.println("数据库连接失败!" + e);
        }
    }
}


这篇关于详解Java GUI连接Derby数据库,实现注册登录功能的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程