【MySQL】从零开始的JDBC编程

1、JDBC的认识

学了这么久的 MySQL,我们一直采用的都是 MySQL 软件自带的客户端(黑框框),来进行跟MySQL服务器进行交互。但是在实际开发中我们很少在黑框框中手动输入SQL,大多数都是通过代码自动执行SQL的。既然大多数都是通过代码自动执行SQL的,那么就需要让其他编程语言来操作数据库服务器。

既然需要让其他编程语言来操作数据库服务器,那么首先就得让其他语言先写一个数据库客户端,然后让数据库客户端与数据库服务器进行交互,这样就可以通过代码自动执行SQL了

MySQL 提供了很多的 API,通过MySQL 提供的API可以让我们比较方便的实现一个MySQL客户端。MySQL的API原本是C语言风格的,但是考虑到 MySQL 使用的非常广泛,也提供了一些其他语言版本的API,但是其他版本的 API 本质上还是调用的是C语言风格的 API 也就是跨语言进行调用

Oracle、SQLServer、SQLite 等数据库都有各自API,不同的数据库 API 也是不同的。学习数据库编程,得学那么多API,这样不就提高了咱们程序猿学习的成本了么

于是在 Java 圈子里,就有大佬把这些API统一成了一套,这套API就是JDBC,JDBC这套API已经成为了Java 标准库的一部分了,由于 Java 影响力很大,以自身作为标准,此时各种数据库厂商都提供了能够适应 JDBC 相关的“驱动包”(驱动包就相当于API 的具体实现)。此时只有掌握了JDBC这套API,无论操作哪个数据库,操作的代码都是基本相同的

JDBC:屏蔽了不同数据库元素API之间的差异,使用同一套API接口规范了所有数据库的编程操作

有了 Java这个标杆之和,后面的语言都纷纷跟进,Python,GO,C#这些语言也都开始做类似的事情了

2、JDBC的使用

2.1 下载对应数据库的驱动包

JDBC屏蔽了不同数据库原生API之间的差距,使用同一套API接口来规范了所有数据库的编程操作

驱动包是数据库厂商实现的,所有我们要去官网或中央仓库中下载

我们这里就主要讲解如何去Maven中央仓库中下载:

  • 第一步:输入Maven中央仓库链接(大家可以关注下述公众号,发送Maven即可获取哦!)

  • 第二步:在 Maven 中央仓库搜索框中搜索mysql

  • 第三步:找到 MySQL Connector Java

  • 第四步:找到 5.1 开头的版本

  • 第五步:点击 jar,即可下载

下载完成后,本地指定存储位置就有一个这样的文件:

这个文件的后缀为.jar,这是一个Java的压缩包

2.2 把 jar 包导入到项目中

第一步:在项目中创建一个目录,把.jar拷贝进去

第二步:将lib目录,添加为依赖库,依赖目录名字可以随便取

2.3 编写数据库代码

JDBC 里面的 API 虽然很多,但是都是固定套路。JDBC里面的很多关键API都是 interface 接口,它们都是由具体的数据库驱动包来提供对应的实现类

接下来我们就用 JDBC 编程来实现 MySQL 的增删查改

用 JDBC 编程进行增删查改,是对指定库中指定表进行操作的,所以在JDBC编程之前需要考虑对数据库中的哪个库,哪个表进行操作,然后再进行 JDBC 编程

2.3.1 增加

public static void main(String[] args) throws SQLException {
        //1.创建数据源,描述数据库服务器在哪
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
        //设置数据库所在位置,当前固定写法
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("111111");

        //2.连接,选中后 Alt + Enter 将受查异常抛给调用者处理
        Connection connection = (Connection) dataSource.getConnection();

        //3.构造 SQL 语句
        String sql = "insert into student value(?,?)";
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入id:");
        int id = scanner.nextInt();
        System.out.print("请输入name:");
        String name = scanner.next();
        //JDBC 中还需要搭配一个特定的对象,来描述这里的 SQL 的情况
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);

        //4.执行 SQL,针对增删改,使用 executeUpdate ,针对查,使用 executeQuery
        //返回结果的含义是,这个操作影响了几行
        int ret = statement.executeUpdate();
        if (ret != 0) {
            System.out.println("增加成功");
        }

        //5.断开连接,释放资源
        statement.close();
        connection.close();
    }

代码解析:

1.创建数据源,描述数据库服务器在哪

DataSource dataSource = new MysqlDataSource();

向上转型,DataSource 是一个 interface 的接口类,我们下载的驱动包中的MysqlDataSource实现了这个DataSource接口类

((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");

向下转型,调用MysqlDataSource里面的 setUrl 方法来描述数据库服务器在哪

((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");

root:root是 mysql 自带的用户名,也可以配置成其他的,如果没有配置成其他的默认就是 root

111111:这个是登录数据库的密码

问题:为什么不直接用 MysqlDataSource dataSource = new MysqlDataSource(),这样不就不需要向下转向了么,为什么要先向上转型再向下转型呢?

答:因为 MysqlDataSource 是 MySQL 驱动包中的,DataSource 是 JDBC 中的。不同的驱动包中实现DataSource 的类是不同的,代码中使用 DataSorce 类型的实例,可以避免 MysqlDataSource 这个名字扩散到代码的各个地方,未来要换数据库只需要改动创建数据源代码即可

2.连接操作

上面的数据源的创建操作,只是描述了服务器在哪,并没有真正进行访问。只有连接了,才能真正的开始通过网络进行通信

Connection connection = (Connection) dataSource.getConnection();

Conection:意为“连接”

在连接的时候会有受查异常,我们直接按键盘上的 Alt+Enter 键抛给调用者处理

3.构造SQL

连接建立后,我们就可以构造SQL来操作数据库了

String sql = "insert into student value(?,?)";
Scanner scanner = new Scanner(System.in);
System.out.print("请输入id:");
int id = scanner.nextInt();
System.out.print("请输入name:");
String name = scanner.next();

先用字符串类型存储命令,把输入的实参通过变量来存储

PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);

再搭配一个特定的对象,来描述这里的 SQL 的情况,将实参替换到SQL语句中

4.执行SQL

int ret = statement.executeUpdate();
if (ret != 0) {
    System.out.println("增加成功");
}

增删改操作使用 executeUpdate来执行 ,查操作使用 executeQuery来执行

返回结果的含义是,这个操作影响了几行

5.断开连接,释放资源

statement.close();
connection.close();

先释放里面的资源,再释放外面的资源

2.3.2 查询

public void selData() throws SQLException {
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("111111");
    Connection connection = (Connection) dataSource.getConnection();
    String selSql = "select * from student order by id asc";
    PreparedStatement statement = connection.prepareStatement(selSql);
    ResultSet resultSet = statement.executeQuery();
    while (resultSet.next()) {
        Student student = new Student();
        student.setId(resultSet.getInt("id"));
        student.setName(resultSet.getString("name"));
        System.out.println(student);
    }
    System.out.println("查询成功");
    resultSet.close();
    statement.close();
    connection.close();
}

猜你喜欢

转载自blog.csdn.net/m0_66488562/article/details/129527427
今日推荐