搭建好了Java的Springboot架构后,如果需要连接数据库,我们应该怎么处理呢?

   举个例子,我们在做线上监控时,需要从数据库中将接口运行的结果拿出来,处理好数据后显示给前端。怎么从数据库中将数据取出来呢?这时候就有很多选择了,我们今天主要讲下JDBC和Mybatis两种方法

什么是JDBC:

JDBC的全称为 Java Database Connectity  JDBC可以通过载入不同的数据库的"驱动程序"而与不同的数据库进行连接。

JDBC的优点:

使用的驱动不同,即可连接不同的数据库。

使用同一套操作来操作不同的数据库

如果每一个数据库java都制定一套连接方式,那么当不同的数据库进行更新的时候,java也需要更新自己的代码。使用JDBC后,使用同一套代码来操作,使用不同的驱动程序(驱动程序由数据库厂商提供)来连接,这使得可以连接不同的数据库。目前我们使用比较多的是 MySQL和MongoDB数据库。

导入对应数据库的驱动类:

  1. 在对应的数据库厂商网站获取对应的jar包
  2. 将对应的jar包添加到引用

先下载好jar包,然后导入到 idea中,怎么导入呢。在 https://dev.mysql.com/downloads/connector/j/  选择如下

使用Java数据库驱动程序连接MySQL数据库实现增删改查 java 数据库驱动_jdbc驱动jar文件放哪

下载好文件后,在 idea中点击 File->File structure 选择 Modules 目前高亮的项目就是你需要添加的项目。很多资料都说点击左上角的加号,mac的需要点击左下角的加号并选择下载好的 jar包 详情见图

使用Java数据库驱动程序连接MySQL数据库实现增删改查 java 数据库驱动_jdbc驱动jar_02

然后在External Libraries里,可以看到有 mysql-connector-java-5.1.39-bin.jar 包,这时候就可以使用JDBC了。我们来看下代码:

public class JdbcMysqlDemo {
    // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_Url = "jdbc:mysql://localhost:3306/Hello";
    //数据库的用户名和密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "123456";
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        try {
            //注册JDBC驱动
            Class.forName(JDBC_DRIVER);
            //打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_Url,USER,PASS);
            //执行查询
            System.out.println("实例化Statement对象...");
            stmt = conn.createStatement();
            //数据库
            String sql;
            sql = "select * from cool";
            ResultSet rs = stmt.executeQuery(sql);
            //展开结果集数据库
            while(rs.next()){
                //通过字段检索
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int score = rs.getInt("score");
                //输入数据
                System.out.println("ID: " + id);
                System.out.println("NAME: " + name);
                System.out.println("SCORE: " + score);
                //完成后关闭
                rs.close();
                stmt.close();
                conn.close();
            }
        }catch (Exception se){
            //处理JDBC的错误
            se.printStackTrace();
        }finally{
            //关闭资源
            try{
                if (stmt != null) stmt.close();
            }catch (Exception se2){
            }//什么都不做
            try{
                if (conn != null) conn.close();
            }catch (Exception se){
                se.printStackTrace();
            }
        }
    System.out.println("Goodbye!");
    }
}

来运行下,看下结果:

连接数据库...

Thu Oct 01 22:25:00 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
实例化Statement对象...
ID: 1
NAME: QQ
SCORE: 78
java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6313)
    at BasicFunction.JdbcMysqlDemo.main(JdbcMysqlDemo.java:36)
Goodbye!

可以看出来,打印的东西已经都打印了。但是提示了安装的mysql版本需要ssh设置,那我们就来设置下,按照 mysql server 8.0以上版本的设置

static final String DB_Url = "jdbc:mysql://localhost:3306/Hello?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
运行后还是报错,仔细看了下代码,发现有2处错误public class JdbcMysqlDemo {
    // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_Url = "jdbc:mysql://localhost:3306/Hello?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    //数据库的用户名和密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "123456";
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        try {
            //注册JDBC驱动
            Class.forName(JDBC_DRIVER);
            //打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_Url,USER,PASS);
            //执行查询
            System.out.println("实例化Statement对象...");
            stmt = conn.createStatement();
            //数据库
            String sql;
            sql = "select * from cool";
            ResultSet rs = stmt.executeQuery(sql);
            //展开结果集数据库
            while(rs.next()){
                //通过字段检索
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int score = rs.getInt("score");
                //输入数据
                System.out.println("ID: " + id);
                System.out.println("NAME: " + name);
                System.out.println("SCORE: " + score);
                //完成后关闭
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch (SQLException se){
            //处理JDBC的错误
            se.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        } finally{
            //关闭资源
            try{
                if (stmt != null) {
                    stmt.close();
                }
            }catch (Exception se2){
            }//什么都不做
            try{
                if (conn != null) {
                    conn.close();
                }
            }catch (Exception se){
                se.printStackTrace();
            }
        }
    System.out.println("Goodbye!");
    }
}

一个是代码位置,一个是多了一条语句

看下运行结果:

连接数据库...
实例化Statement对象...
ID: 1
NAME: QQ
SCORE: 78
ID: 2
NAME: 李大志
SCORE: 88
ID: 3
NAME: 葫芦
SCORE: 77
ID: 4
NAME: 王五子
SCORE: 77
ID: 5
NAME: 11
SCORE: 66
ID: 6
NAME: 100
SCORE: 100
ID: 7
NAME: 糊涂
SCORE: 88
Goodbye!
Process finished with exit code 0和数据库中的数据进行对比:
mysql> select * from cool;
+----+-----------+------------+-------+-----------+
| id | name      | time       | score | country   |
+----+-----------+------------+-------+-----------+
|  1 | QQ        | NULL       |    78 | 中国      |
|  2 | 李大志    | NULL       |    88 | 俄罗斯    |
|  3 | 葫芦      | NULL       |    77 | 英国      |
|  4 | 王五子    | NULL       |    77 | 挪威      |
|  5 | 11        | NULL       |    66 | NULL      |
|  6 | 100       | 2020-07-06 |   100 | 阿根廷    |
|  7 | 糊涂      | 2020-07-23 |    88 | USA       |
+----+-----------+------------+-------+-----------+
7 rows in set (0.08 sec)


数据终于对了!

好的,今天就先到这里了