草庐IT

如何通过JDBC访问MySQL数据库?手把手实现登录界面(图解+完整代码)

兴趣使然黄小黄 2023-04-08 原文

💁 个人主页:黄小黄的博客主页
❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
🎏 格言:一步一个脚印才能承接所谓的幸运

本文来自专栏:JDBC从入门到实战
欢迎点击支持订阅专栏 ❤️


写在前面

本文环境: jdk1.8mysql8.0IntelliJ IDEA 2021.3DataGrip 2021.3
 撰写本文是由于一位粉丝的求助,凑巧又是笔者本次的实验内容,所以本文只对 JDBC 如何访问数据库作操作性的叙述,并不涉及 JDBC 基础相关内容,有需要请期待专栏后续更新。本文仅供同学们交流学习使用,图片均有水印,请勿 copy,如需转载,欢迎私信。


文章目录


1 操作准备

1.1 导入 Mysql 对应的 jar 包

  1. 首先进入 Mysql 下载官网: https://www.mysql.com/downloads/,将页面滑动到底端,点击 MySQL Community (GPL) Downloads
  2. 选择 Connector/J
  3. 选择 General Availability(GA) Releases,在 Select Operating System 下拉列表选择 Platform Independent,然后选择任意一种压缩包格式的文件 Download,根据提示下载,如果需要其他版本,可以点击 Archives
  4. 下载完成后进行解压,即可在当前文件夹中看到下载好的 jar 包了。
  5. 打开 idea 创建一个项目 JDBC 并创建 Moudle JDBCtest,在该模块下创建个目录 lib,并将刚刚下载好的 jar 包拷贝过来。
  6. 右键将 jar 包, Add as Library

1.2 创建Mysql数据库与基本表

🐰 打开 datagrip,新建一个查询,通过下面的代码创建一个 myuser 数据库用于 JDBC 访问练习,并创建一个表并录入数据,具体代码及表数据如下:

CREATE DATABASE myuser;
USE myuser;
CREATE TABLE IF NOT EXISTS account(
    name VARCHAR(50) PRIMARY KEY NOT NULL ,
    password VARCHAR(50) NOT NULL
);

INSERT INTO account VALUES ('张三', '123');
INSERT INTO account VALUES ('李四', '123');


2 JDBC基础实验

2.1 编写JDBC连接MySQL数据库myuser,查询并显示account表数据实例

🐻 1. 先创建项目、包及 Test.java,如下图所示:

🐦 2.运行下面的JDBC代码,代码后附运行结果图,记得将数据库密码(你的密码)位置处改成自己的密码:

package JDBC_test;

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

/**
 * @author 小黄小黄不再迷茫
 * @version 1.0
 */

public class Test {
    public static void main(String args[]) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");     //加载MYSQL JDBC驱动程序
            System.out.println("Success loading Mysql Driver!");
        }
        catch (Exception e) {
            System.out.print("Error loading Mysql Driver!");
            e.printStackTrace();
        }
        try {
            Connection connect = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/myuser","root","你的密码");
            //建立连接,URL为jdbc:mysql//服务器地址/数据库myuser ,后面的2个参数分别是登陆用户名和密码

            System.out.println("Success connect Mysql server!");
            Statement stmt = connect.createStatement(); //创建运行对象
            ResultSet rs = stmt.executeQuery("select * from account");//执行查询account表

            while (rs.next()) {
                System.out.println(rs.getString("name"));//获取name列的值(字符串型)
            }
        }
        catch (Exception e) {
            System.out.print("get data error!");
            e.printStackTrace();
        }
    }
}

2.2 编写JDBC连接MySQL数据库,实现myuser数据库的增、删、改查的实例

🐰 1. 创建如下包、类:

🐦 2.通过下面代码对 myuser 数据库的 account 表实现增删改查的操作:
Tips:同样别忘记将“你的密码”改成你的数据库密码哦!

package JDBC_test2;

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


/**
 * @author 小黄小黄不再迷茫
 * @version 1.0
 */


public class Test2 {
    static Connection conn;
    static Statement st;

    public static void main(String[] args) {
        insert();   //插入添加记录
        update();   //更新记录数据
        delete();   //删除记录
        query();    //查询记录并显示
    }

    //(2)连接的获取,在操作前必须先获取与数据库的连接。
    private static Connection getConnection() {
        String driver = "com.mysql.cj.jdbc.Driver"; //若报错使用com.mysql.jdbc.Driver
        String url = "jdbc:mysql://localhost:3306/myuser?serverTimezone=UTC "; //myuser是数据库名称
        String username = "root"; //数据库用户名
        String password = "你的密码"; //数据库用户密码
        Connection conn = null;
        try {
            Class.forName(driver); //classLoader,加载对应驱动
            conn = (Connection) DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //(3) 插入(insert)操作
    public static void insert() {
        conn = getConnection(); // 首先要获取连接,即连接到数据库
        try {
            String sql = "insert into account (name,password) values('lucy','123')"; // 插入数据的sql语句
            st = (Statement) conn.createStatement();    // 创建用于执行静态sql语句的Statement对象
            int count = st.executeUpdate(sql);  // 执行插入操作的sql语句,并返回插入数据的个数
            System.out.println("向account表中插入 " + count + " 条数据"); //输出插入操作的处理结果
            conn.close();   //关闭数据库连接
        } catch (SQLException e) {
            System.out.println("插入数据失败" + e.getMessage());
        }
    }

    //(4) 更新(update)操作
    public static void update() {
        conn = getConnection(); //同样先要获取连接,即连接到数据库
        try {
            String sql = "update account set password='0000' where name = '张三'";// 更新数据的sql语句
            st = (Statement) conn.createStatement();    //创建用于执行静态sql语句的Statement对象,st属局部变量
            int count = st.executeUpdate(sql);// 执行更新操作的sql语句,返回更新数据的个数
            System.out.println("account表中更新 " + count + " 条数据");      //输出更新操作的处理结果
            conn.close();   //关闭数据库连接
        } catch (SQLException e) {
            System.out.println("更新数据失败");
        }
    }

    //(5)查询(query)操作
    public static void query() {
        conn = getConnection(); //同样先要获取连接,即连接到数据库
        try {
            String sql = "select * from account";     // 查询数据的sql语句
            st = (Statement) conn.createStatement();    //创建用于执行静态sql语句的Statement对象,st属局部变量
            ResultSet rs = st.executeQuery(sql);    //执行sql查询语句,返回查询数据的结果集
            System.out.println("最后的查询结果为:");
            while (rs.next()) { // 判断是否还有下一个数据
                // 根据字段名获取相应的值
                String name = rs.getString("name");
                String password = rs.getString("password");
                //输出查到的记录的各个字段的值
                System.out.println(name + " " + password + " ");
            }
            conn.close();   //关闭数据库连接
        } catch (SQLException e) {
            System.out.println("查询数据失败");
        }
    }
    //(6)删除(delete)操作
        public static void delete () {
            conn = getConnection(); //同样先要获取连接,即连接到数据库
            try {
                String sql = "delete from account  where name = '李四'";// 删除数据的sql语句
                st = (Statement) conn.createStatement();    //创建用于执行静态sql语句的Statement对象,st属局部变量
                int count = st.executeUpdate(sql);// 执行sql删除语句,返回删除数据的数量
                System.out.println("account表中删除 " + count + " 条数据\n");    //输出删除操作的处理结果
                conn.close();   //关闭数据库连接
            } catch (SQLException e) {
                System.out.println("删除数据失败");
            }

    }
}


🐱 3.回到 datagrip 查看 account 表的数据,发现表的数据成功被更新:


3 JDBC进阶实验——简易登录界面

3.1 具体实现

🐰 1. MyConnection类,实现数据库连接:
Tips:同样别忘记将“你的密码”改成你的数据库密码哦!

package JDBC_test3;

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


/**
 * @author 小黄小黄不再迷茫
 * @version 1.0
 */
public class MyConnection {
    public static Connection getConnection() {
        String driver = "com.mysql.cj.jdbc.Driver";//使用Jar包驱动
        String url = "jdbc:mysql://localhost:3306/myuser?serverTimezone=UTC";//链接数据库端口,数据库名
        String username = "root";//数据库用户名
        String password = "你的密码";//数据库密码
        Connection conn = null;
        try {
            Class.forName(driver); //classLoader,加载对应驱动
            conn = (Connection) DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {//异常捕获
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

}

🐦 2. Login 类,实现登录界面:

package JDBC_test3;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 1. @author 小黄小黄不再迷茫
 2. @version 1.0
 */
public class Login  extends JFrame{

    private JLabel JLname;
    private JLabel JLpwd;
    private JTextField JTname;
    private JPasswordField JTpwd;
    private JButton JBsure;
    private JButton JBexit;

    public Login(String title){
        super(title);
        JLname = new JLabel("用户名:");//设置Label和按钮名
        JLpwd = new JLabel("密  码:");
        JTname = new JTextField(20);
        JTpwd = new JPasswordField(20);
        JBsure = new JButton("确定");
        JBexit = new JButton("取消");

        JLname.setBounds(40, 40, 60, 25);//设置Label和按钮大小
        JTname.setBounds(100, 40, 170, 25);
        JLpwd.setBounds(40,80,60,25);
        JTpwd.setBounds(100,80,170,25);
        JBsure.setBounds(110,130,60,25);
        JBexit.setBounds(180,130,60,25);


        this.setLayout(null);
        this.add(JLname);
        this.add(JTname);
        this.add(JLpwd);
        this.add(JTpwd);
        this.add(JBsure);
        this.add(JBexit);

        JBsure.addActionListener(new ActionListener(){//添加按钮监听

            public void actionPerformed(ActionEvent arg0) {
                dispose();
                loginCheak(JTname,JTpwd);
            }
        });

        JBexit.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {

                System.exit(0);
            }

        });

    }

    public void loginCheak(JTextField tf,JPasswordField pf) {
        String username = tf.getText();
        String password = String.valueOf(pf.getPassword());
        System.out.println(password);//输出填写的密码

        if("".equals(username)){//判断用户名是否为空
            JOptionPane.showMessageDialog(null,"账号不能为空","Warning",JOptionPane.WARNING_MESSAGE);
            return;
        }
        if("".equals(password)){//判断密码是否为空
            JOptionPane.showMessageDialog(null,"密码不能为空","Warning",JOptionPane.WARNING_MESSAGE);
            return;
        }
        try{
            new MyConnection();
            Connection con = MyConnection.getConnection() ;//调用MyConnection.java中的getConnection方法
            Statement stmt=con.createStatement();
            String sql = "select * from account where name = '" + username + "' and password = '" + password + "'"; //SQL选择查询语句
            ResultSet rs=stmt.executeQuery(sql);

            if (rs.next()) {
                JOptionPane.showMessageDialog(this, "成功登录", "提示",  JOptionPane.INFORMATION_MESSAGE);
                this.dispose();
            }
            else {
                JOptionPane.showMessageDialog(this, "帐号或密码错误!", "警告",  JOptionPane.WARNING_MESSAGE);
                pf.requestFocus();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main (String []args){//主函数
        Login ft=new Login("欢迎登陆");
        ft.setSize(340, 240);
        ft.setLocation(300, 300);
        ft.setVisible(true);
        ft.setResizable(false);
    }
}

3.2 效果展示

  1. 登录界面展示,用户名和密码依次输入 张三、0000:

  2. 点击确定,提示登录成功:

  3. 重新运行,输入张三和一个错误密码,提示登录失败:

  4. 直接点击登录,提示用户名不能为空:


写在最后

🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!

共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”

有关如何通过JDBC访问MySQL数据库?手把手实现登录界面(图解+完整代码)的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  8. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

随机推荐