• 大数据JavaWeb之JDBC基础----快速入门、各个类详解(DriverManager、Connection、Statement)


    通过一次疫情,距离上一次学习大数据已经快过去半年了。。不能半途而废!!!!在前面已经学习了Mysql的基础了,接下来正好可以来学习用Java如何来操纵数据库,也就是JDBC技术,其实这块之前也用过,不过都忘得差不多了,为了打好地基从0开始学习。

    快速入门:

    什么是JDBC?

    它的全称为“Java DataBase Connectivity”,既Java 数据库连接, Java语言操作数据库。嗯,这个是从字面意思来理解的,但是它本质其实是这样的:

    JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。

    用通俗的话来描述其本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
    下面来看一下示意图:

    也可以看到使用JDBC的好处如下:

    • 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
    • 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库。

    JDBC快速入门:

    有了基本概念之后,接下来则尝试来用java操作一下mysql数据库,快速感受一下JDBC的魅力。

    1、在MAC上安装Mysql:

    安装Myql:

    在之前的mysql学习是在windows平台上进行的,而对于一个习惯mac的程序员来说也有必要来搭建一下环境,所以这里重新装一下mac的mysql的环境,为之后的学习做好铺垫,这里借签一下之前https://www.cnblogs.com/webor2006/p/11770756.htmlwindows安装mysql的过程,首先到官网https://dev.mysql.com/downloads/mysql/先下载安装包:

    然后安装方法就不多说了,可以参考:https://www.jianshu.com/p/2906abd8fd47,安装完之后,接下来则需要mysql配置到环境变量中,这样就可以在终端上来输入命令操纵Mysql了:

    验证一下是否配置好:

    命令是生效了,只是目前mysql服务器还没启,此时则需要进“系统偏好设置”启动一下它:

     

    好,再来试一下mysql命令:

    xiongweideMacBook-Pro:ZhiyiCloudScreenS1 xiongwei$ mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 10
    Server version: 8.0.20 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)
    
    mysql> 

    GUI工具:

    对于平常使用肯定需要基于GUI,所以也提前把它给配置好,那在MAC上用哪款可视化的工具呢?这里用它--https://www.jetbrains.com/datagrip/,说到jetbrains就不用多说了,肯定不是太差,当然它不是免费的,只有30天的试用版,由于我买了正版的授权码所以肯定选它了,先来了解一下这个工具:

    嗯,数据库一家统,具体是不是好用得之后再慢慢感受,接下来把它给下载下来,并打开,然后先激活一下:

    接下来则创建数据库连接:

    可以看到市面上的流行数据库都支持,还真是如官网所说:“Many databases, one tool”,咱们当然是创建Mysql的:

    由于我的渣网,经过漫长的等待后,则就可以看到咱们配置的连接是否正确了,如果正确的话则会是如下所示:

    然后点击ok之后,则就可以操作数据库了,比如:

    呃,一定得要写sql才能展现么? 貌似没找到通过可视化的操作来不写SQL也能实现数据库的操作方法,不过,我觉得是好事,学习角度就得对SQL语句多敲,这样才能更加熟练的掌握SQL。关于MAC上的mysql安装就先到这,接下来则开始进入JDBC的学习之中。

    2、 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar

    到Intellij IDEA中新建一个工程,先创建一个空的项目,里面用于JavaWeb的集中学习:

    3、复制mysql-connector-java-bin.jar驱动jar包到项目的libs目录下

    我们知道要想能操纵数据库,则需要下载数据库相印的驱动jar包,上官网:https://dev.mysql.com/downloads/connector/j/5.1.html

    拷到工程中:

    4、右键-->Add As Library

    5、 注册驱动

    接下来则可以撸码来操练Mysql数据库了,由于是快速入门,里面的细节先不用管,先按步骤能达到操作mysql的目的既可,之后再对其进行详细学习。

    package com.jdbc.test;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            Class.forName("com.mysql.jdbc.Driver");
        }
    }

    这个代码在当时学习JVM时提到过,它是属于类的主动使用的一种情况,回忆一下:https://www.cnblogs.com/webor2006/p/8835953.html

    很显然就会导致类被初始化,不多解释了,学习知识得要相互串联,这样学习起来也会在大脑中形成比较好的印象。

    6、 获取数据库连接对象 Connection

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            
        }
    }

    其中“jdbc:mysql://localhost:3306/db3”是不是在我们的DataGrip连接Mysql配置时有看到过:

    7、 定义sql

    接下来则可以定义要执行的SQL语句了,这里咱们用一个更新语句,在库中有一个这个表:

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            //定义要执行的sql
            String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1";
        }
    }

    8、 获取执行sql语句的对象 Statement

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            //定义要执行的sql
            String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1";
            //获得执行sql的对象
            Statement statement = root.createStatement();
        }
    }

    9、 执行sql,接受返回结果

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            //定义要执行的sql
            String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1";
            //获得执行sql的对象
            Statement statement = root.createStatement();
            //执行sql,由于这个sql属于更新操作,所以调用更新相关的API
            int count = statement.executeUpdate(sql);
        }
    }

    10、 处理结果

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            //定义要执行的sql
            String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1";
            //获得执行sql的对象
            Statement statement = root.createStatement();
            //执行sql,由于这个sql属于更新操作,所以调用更新相关的API
            int count = statement.executeUpdate(sql);
            //处理结果
            System.out.println("更新sql执行完成:" + count);
        }
    }

    11、 释放资源

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class JdbcTest1 {
        public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            //定义要执行的sql
            String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1";
            //获得执行sql的对象
            Statement statement = root.createStatement();
            //执行sql,由于这个sql属于更新操作,所以调用更新相关的API
            int count = statement.executeUpdate(sql);
            //处理结果
            System.out.println("更新sql执行完成:" + count);
            //释放资源
            statement.close();
            root.close();
        }
    }

    好!!!接下来运行看一下,第一个JDBC操作mysql的程序能否成功:

    貌似成功了,查一下数据看有没有被更新:

    第一个JDBC的例子就完美运行,但是!!对于它里面的细节还一点都不懂,为啥要这样写代码呢?所以接下来有必要对用到的相关类进行一个了解。

    各个类详解:

    在快速入门的代码中涉及到这几个关键类:

    public static void main(String[] args) throws Exception {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库的连接对象
            Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "12345678");
            //定义要执行的sql
            String sql = "UPDATE salarygrade SET losalary = 6000 WHERE grade = 1";
            //获得执行sql的对象
            Statement statement = root.createStatement();
            //执行sql,由于这个sql属于更新操作,所以调用更新相关的API
            int count = statement.executeUpdate(sql);
            //处理结果
            System.out.println("更新sql执行完成:" + count);
            //释放资源
            statement.close();
            root.close();
        }

    下面则来全面了解一下它们。

    DriverManager:驱动管理对象

    它其实主要是有下两个功能:

    1、注册驱动:告诉程序该使用哪一个数据库驱动jar;

    我们可以看一下这个类中有一个注册的方法:

    而它的调用其实是具体的数据库产品中进行的,也就是我们第一句所写的:

    如之前所提示,它由于主动使用了类,则会对类进行初始化,则会执行它的静态代码块,所以瞅一下这个类的静态代码:

    其实有个细节,这句话可以省略:

    关于这块其实在当时学习JVM的SPI场景分析类加载机制时详细分析过,具体可以参考https://www.cnblogs.com/webor2006/p/9275901.html

    2、获取数据库连接;

    其实也就是对应这句代码:

    下面对这个API稍加解释一下:

                    * 方法:static Connection getConnection(String url, String user, String password) 
                    * 参数:
                        * url:指定连接的路径
                            * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
                            * 例子:jdbc:mysql://localhost:3306/db3
                            * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
                        * user:用户名
                        * password:密码 

    下面咱们来试一下如上所说简写的写法:

    执行:

    确实是!!! 

    Connection:数据库连接对象

    它主要有以下两个作用:

    1、获取执行sql 的对象;

    • Statement createStatement()
    • PreparedStatement prepareStatement(String sql)
      这个暂时还木有用到,这个在最后再来解释。

    2、管理事务; 

    事务这块暂时还木有使用到,不过未来肯定少不了用它的,先提前了解一下:

    • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
    • 提交事务:commit()
    • 回滚事务:rollback()
       

    Statement:执行sql的对象

    它主要是用来执行sql的,主要有如下几种执行方法:

    • boolean execute(String sql) :可以执行任意的sql,不是很常用,了解既可。

    • int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
      返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
    • ResultSet executeQuery(String sql) :执行DQL(select)语句

    接下来咱们则做个小练习,用来对其实践一下:

    1. salarygrade表 添加一条记录

    在上面的入门示例中其实代码是不健全的,异常直接向外抛出了,而且资源的释放没放到finally中:

    所以这次的练习正规化一下,代码比较简单,过一下既可:

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * salarygrade添加一条记录
     */
    public class JdbcTest2 {
        public static void main(String[] args) {
            Statement stmt = null;
            Connection conn = null;
            try {
                //1. 注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2. 定义sql
                String sql = "insert into salarygrade values(6,100000,150000)";
                //3.获取Connection对象
                conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678");
                //4.获取执行sql的对象 Statement
                stmt = conn.createStatement();
                //5.执行sql
                int count = stmt.executeUpdate(sql);//影响的行数
                //6.处理结果
                System.out.println(count);
                if (count > 0) {
                    System.out.println("添加成功!");
                } else {
                    System.out.println("添加失败!");
                }
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //7. 释放资源
                //避免空指针异常
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行一下:

    此时看一下数据库数据:

     

    2. salarygrade表 修改记录

    这个比较简单,不多说:

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * salarygrade修改一条记录
     */
    public class JdbcTest3 {
        public static void main(String[] args) {
            Statement stmt = null;
            Connection conn = null;
            try {
                //1. 注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2. 定义sql
                String sql = "UPDATE salarygrade SET hisalary = 120000 WHERE grade = 6";
                //3.获取Connection对象
                conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678");
                //4.获取执行sql的对象 Statement
                stmt = conn.createStatement();
                //5.执行sql
                int count = stmt.executeUpdate(sql);//影响的行数
                //6.处理结果
                System.out.println(count);
                if (count > 0) {
                    System.out.println("修改成功!");
                } else {
                    System.out.println("修改失败!");
                }
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //7. 释放资源
                //避免空指针异常
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行:

     

    看数据:

    3. salarygrade表 删除一条记录

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * salarygrade删除一条记录
     */
    public class JdbcTest4 {
        public static void main(String[] args) {
            Statement stmt = null;
            Connection conn = null;
            try {
                //1. 注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2. 定义sql
                String sql = "DELETE FROM salarygrade WHERE grade = 6";
                //3.获取Connection对象
                conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678");
                //4.获取执行sql的对象 Statement
                stmt = conn.createStatement();
                //5.执行sql
                int count = stmt.executeUpdate(sql);//影响的行数
                //6.处理结果
                System.out.println(count);
                if (count > 0) {
                    System.out.println("删除成功!");
                } else {
                    System.out.println("删除失败!");
                }
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //7. 释放资源
                //避免空指针异常
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行:

    4、创建一张student表:

    package com.jdbc.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * 创建一张student表
     */
    public class JdbcTest5 {
        public static void main(String[] args) {
            Statement stmt = null;
            Connection conn = null;
            try {
                //1. 注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2. 定义sql
                String sql = "CREATE TABLE student(id int , name varchar(20))";
                //3.获取Connection对象
                conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "12345678");
                //4.获取执行sql的对象 Statement
                stmt = conn.createStatement();
                //5.执行sql
                int count = stmt.executeUpdate(sql);//影响的行数
                //6.注意表的创建其count是为0的
                System.out.println(count);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //7. 释放资源
                //避免空指针异常
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行:

    查看一下表:

  • 相关阅读:
    ExtJs之表单(form)
    tf.where
    kuiper流式计算完整实例演示
    centos下搭建kuiper以及kuiper-manager
    Centos搭建EMQX和EMQ-Dashboard(踩坑精华版)
    代码生成器
    [MIT新技术大会]Jeff Bezos把EC2、S3和土耳其机器人描述为亚马逊“11年来的大规模万维网计算”方面的结晶,强调把后台基础设施作为服务
    《商业周刊》封面文章《谷歌和云的智慧》,讲到谷歌的新战略是“把惊人的计算能力放到众人手里”
    C# 连接 Sqlserver2005 Analysis Service的总结
    POJ_1064 二分搜索
  • 原文地址:https://www.cnblogs.com/webor2006/p/13029226.html
Copyright © 2020-2023  润新知