本篇文章写于2022年12月Java实训之后,对于jdbc技术有了一点点了解,故有了这篇文章;重点介绍java代码实现

jdbc是什么

JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface应用程序设计接口)。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库

这里的数据库指的是市面上流行的数据库。如MySQL、Oracle、SQL server等数据库。

jdbc主要能完成的任务

简单地说,JDBC能完成下列三件事:

1)同一个数据库建立连接;

2)向数据库发送SQL语句;

3)处理数据库返回的结果

本片文章的环境

java版本:jdk1.8.0_221

数据库:MySQL 5.7.26

编译器:IntelliJ IDEA 2021.2.3

代码实现

手动调用Class.forName()

先来看实现数据库连接的代码

Class.forName("com.mysql.jdbc.Driver");//加载MySQL连接驱动

加载驱动,我们进到driver类中看一下,这个类长下面这样

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

关键代码为DriverManager.registerDriver(new Driver()); 先new一个Driver对象,然后将他注册到DriverManager中

跟进到DriverManager.registerDriver这个方法中

public static synchronized void registerDriver(java.sql.Driver driver)
    throws SQLException {

    registerDriver(driver, null);
}

继续跟进registerDriver(driver, null) 方法

public static void registerDriver(java.sql.Driver driver, DriverAction da)
        throws SQLException {
        if (driver != null) {
            //如果该驱动尚未注册,那么将他添加到 registeredDrivers 中去。这是一个支持并发情况的特殊ArrayList
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }
        println("registerDriver: " + driver);
    }

关于这个支持并发情况的ArrayList,在该类的开头有提到过

private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();

到这里Class.forName(“com.mysql.jdbc.Driver”) 的工作就完成了,工作就是:将mysql驱动注册到DriverManager中去。接下来我们看是怎么进行调用的

DriverManager.getConnection方法分析

注册完成后就可以进行MySQL的连接

Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/music_db?serverTimezone=UTC&useSSL=false", "root", "root");

参数为你要连接的数据库地址+用户名和密码

这里我加上serverTimezone=UTC&useSSL=false是因为在MySQL高版本情况下因为时区的问题以及安全ssl连接问题导致连接失败,所以手动设置一下时区以及关闭ssl,关于具体内容可以看这位大佬的文章:https://blog.csdn.net/BestEternity/article/details/104382446

跟进DriverManger.getConnection方法

public static Connection getConnection(String url,
    String user, String password) throws SQLException {
    java.util.Properties info = new java.util.Properties();

    if (user != null) {
        info.put("user", user);
    }
    if (password != null) {
        info.put("password", password);
    }

    return (getConnection(url, info, Reflection.getCallerClass()));
}

方法很简单判断是否非空,最后再次调用自己,继续跟进getConnetction,进到getConnection方法

对上文提到静态变量 registeredDrivers 进行了遍历,调用了connect(url, info)方法,这是一个接口,由各个不同的驱动自己实现。

那么到此为止,我们就获得了connection对象,可以对数据库进行操作了

调用方法并实现MySQL数据库操作

接下来就可以直接调用该方法对相应表进行增删改查操作了,如下

向musci_db数据库中的tb_user表中插入username=admin&password=admin的一条数据

完整实现代码

public class jdbc_insert {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName("com.mysql.jdbc.Driver");//加载MySQL连接驱动

        //建立MySQL连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/music_db?serverTimezone=UTC&useSSL=false", "root", "root");

        //定义sql执行语句
        String sql = "insert into tb_user(username,password) values(?,?)";

        //创建并调用prepareStatement方法执行执行sql语句
        PreparedStatement ps = conn.prepareStatement(sql);

        //给变量赋值构成完成sql语句
        ps.setString(1, "admin");//第一个?处赋username=admin
        ps.setString(2, "admin");//第二个?处赋password=admin

        //判断是否成功
        int i = ps.executeUpdate();
        if (i > 0) {
            System.out.println("success!");
        } else {
            System.out.println("default!");
        }
        ps.close();
        conn.close();

    }
}

运行尝试是否成功,显示插入成功,并且数据库已经成功显示这条数据,关于删改查也是一样的套路,就不再详细介绍了