MySQL数据库 JDBC 编程(Java 连接 MySQL)

来自:网络
时间:2022-01-09
阅读:
目录

1. 数据库编程的基础条件

如果你想实现代码操作数据库,那么以下条件是你实现它的前提

编程语言:

例如 Java、C++、Python 等等,这些语言都能够实现操作数据库

某个数据库的操作:

例如我在前面章节就介绍了关于 MySQL 的操作,实现其它数据库如 Oracle、SQL Server 等等也要学会对应数据库的一些操作

安装数据库驱动包:

不同的数据库对应不同的编程语言提供了不同的数据库驱动包,这些驱动包内实现了操作对应数据库的 API

2. Java 的数据库编程:JDBC

由于不同数据库的厂商实现数据库的 API 其实是不太一样的,因此很多语言就把这些数据库的 API 进行再一次的封装,封装出了一套统一的 API。这样就可以通过一套代码来操作多个不同的数据库了

在 Java 中,这样的封装就是由 Java 标准库来完成的,封装出了一套统一的数据库 API 称为 JDBC

拓展:

Java 本身是跨平台语言,虽然不同操作系统提供了不同的 API,但是 Java 本身也把这些 API 封装了起来,在标准库中提供了统一的接口,因此 Java 就可以一次编译,到处运行

JDBC 介绍:

  • JDBC,即 Java Database Connectivity,是指 Java 数据库连接。是一种用于执行 SQL 语句的 Java API,它是 Java 中的数据库连接规范。
  • 这个 API 由 java.sql javax.sql 包中的一些类和接口组成,它为 Java 开发人员操作数据库提供了一个标准的 API,可以为多种关系数据库提供统一访问

注意:

  • JDBC API 是 Java 标准库自带的,可以直接用,但是 MySQL 的 JDBC 驱动不是系统自带的,因此需要额外进行下载安装
  • MySQL 的 JDBC 驱动其实就是对 JDBC API 里面一些类和接口的具体实现

3. JDBC 访问数据库的层次结构

MySQL数据库 JDBC 编程(Java 连接 MySQL)

4. MySQL 数据库操作介绍

在前面章节我就介绍了关于 MySQL 的一些知识了,如果你在这方面有漏洞的话,可以直接通过下面的文章来进行补充。

第一章链接: 【MySQL 数据库】数据库的基础知识

第二章链接: 【MySQL 数据库】MySQL 的对库的操作及其数据类型

第三章链接: 【MySQL 数据库】数据表的基本操作

第四章链接: 【MySQL 数据库】数据库的约束及数据表的设计原理

第五章链接: 【MySQL 数据库】聚合查询和联合查询操作

第六章链接: 【MySQL 数据库】MySQL 的索引和事务

5. MySQL 驱动包的下载及添加到项目

由于 MySQL 的 JDBC 驱动不是系统自带的,因此需要额外进行下载安装

各大数据库的官网就有对应数据库的 JDBC 驱动,但这里我推荐使用一些中央仓库来进行下载,例如 mvnrepository

驱动包下载步骤:

进入 mvnrepository 网站,在搜索栏搜索 MySQL,就可以查询到以下结果

MySQL数据库 JDBC 编程(Java 连接 MySQL)

选择第一个 MySQL Connector/J,就可以跳转到下载版本选择的页面

MySQL数据库 JDBC 编程(Java 连接 MySQL)

选择好自己对应的数据库版本的驱动(大版本一定要对应,小版本区别不大可以随意选),由于我自己是 5.x 系列的MySQL,因此,我选择大版号是5的就行。选择后就跳到了最终下载的页面

MySQL数据库 JDBC 编程(Java 连接 MySQL)

点击 jar 就开始下载了(这个 jar 包就是将这个驱动包中的一些 .class 文件以压缩包的形式进行打包了)

下载完成后,这个驱动包就已经下载到你本地了,只再将它引入到你的项目就可以是用了

驱动包添加到项目步骤(以下介绍一种方法):

  • 首先用自己的编译器创建一个项目(我个人用的 IDEA,但是其它编译器方式也一样)
  • 在你的项目里面新建一个目录,目录名随意(我个人起的是 lib)

MySQL数据库 JDBC 编程(Java 连接 MySQL)

  • 将下载的驱动包添加到这个目录中,直接 CV 就行,添加成功后就会出现

MySQL数据库 JDBC 编程(Java 连接 MySQL)

让我们新建的这个添加了驱动包的目录成为一个库(IDEA 中右键该目录,选择 add as Library… 就可以)

MySQL数据库 JDBC 编程(Java 连接 MySQL)

将这个库加好之后,就可以使用驱动包中的类和方法了,此时就可以进行数据库编程了

6. JDBC 使用步骤

6.1 创建数据库源,连接 Connection

创建一个数据库源:

DataSource dataSource=new MysqlDataSource();
// DataSource 是来自于 Java 标准库的一个接口,它用来表示“数据库在哪”
// MysqlDataSource 是来自于 MySQL 的驱动包,它是实现了 DataSource 接口的类

数据库就是一个服务器程序,可以通过 DataSource 来描述服务器的 地址、端口、用户名、密码、要访问的数据库名等

把数据库的位置信息,设置到 DataSource

// 1)通过一个 URL 来表示连接的数据库、数据库的 ip、端口、数据库名、编码方式、是否加密
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&setSSL=false");
// 2)设置登录数据库的用户名
((MysqlDataSource)dataSource).setUser("root");
// 3)设置登录数据库的密码
((MysqlDataSource)dataSource).setPassword("1234");

由于 setURLsetUsersetPassword 都是 MysqlDataSource 实现的,所以使用时需要向下转型
上述 URL 是一种固定的写法,例如:jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&setSSL=false

  • jdbc 表示使用 JDBC 访问数据库
  • mysql 表示访问的数据库是 MySQL
  • 172.0.0.1 是 IP 地址,IP 地址是用来区分是哪个主机,172.0.0.1 这个 IP 地址表示当前使用的主机自身,因为我的 MySQL 服务器也装在自己电脑上,自行修改
  • 3306 是端口号,这是安装数据库服务器时手动设置的,一般默认是3306,它是用来区分主机上的某个程序
  • test 是要访问的数据库名,这是我数据库里面的,自行修改
  • characterEncoding=utf8 是用来指定编码方式的,此处是使用 utf8,需要和使用的数据库便方式对应,自行修改
  • useSSL=false 是用来表示是否加密的,此处表示不加密,自行修改

连接数据库,进行真正的网络通信:

Connection connection=dataSource.getConnection();


Connection 是 Java 标准库里的,虽然 MySQL 驱动里面也有。它是用来进行和数据库服务器进行网络连接的
getConnection 用于获得试图建立到指定数据库 URL 的连接,如果连接成功就返回一个 Connection 对象,如果失败就抛出异常
由于 getConnection 可能会连接失败(例如 IP 地址、端口等输入错误),因此就需要在方法声明时通过 throws 给上层调用者抛出异常或者使用 try-catch 去处理异常

6.2 构造 SQL 语句,为执行的操作做准备

通过字符串,构造一个要执行的 sql

// 例如要执行新增元素操作(表名为 student,有两列 id 和 student
Scanner scanner=new Scanner(System.in);
System.out.print("请输入 id:");
int id=scanner.nextInt();
System.out.print("请输入 姓名:");
String name=scanner.next();
String sql="insert into student values(?,?)";

  1. sql 就是构造的 SQL 语句,里面就是要执行的具体操作
  2. sql 语句中可以不用加分号
  3. 表示通配符,可以通过它对 sql 语句里的内容进行动态替换,需要替换的内容用 ?代替,后续再使用 PreparedStatement 对象的一些方法将其再替换成具体要更改的值

例如:

void setInt(int paramenterIndex, int x) :paramenterIndex 表示 sql 语句中要替换通配符的具体位置(从1开始),x 表示要替换掉具体值
void setString(int parameterIndex, String x) :paramenterIndex 表示 sql 语句中要替换通配符的具体位置(从1开始),x 表示要替换掉具体值
通过 prepareStatement(sql) 方法,将构造的字符串 sql 转化成真正的数据库底层的 SQL 语句

PreparedStatement statement=connection.prepareStatement(sql);
// 通过 setInt 方法,将 SQL 语句中的第一处通配符进行具体值的替换
statement.setInt(1,id);
// 通过 setString 方法,将 SQL 语句中的第二处通配符进行具体值的替换
statement.setString(2,name);

JDBC 中,使用 Connection 和数据库建立了连接对象 connection,那么 connection 就可以调用 prepareStatement(String sql) 方法对参数 sql 指定的 SQL 语句进行编译预处理,生成该数据库底层的内部命令,并将该命令封装在 PreparedStatement 对象中

6.3 执行 SQL,并处理结果集

通过 PreparedStatement 对象的 executeQuery 或者 executeUpdate 方法来执行 SQL

如果是执行内容变更的操作(增加、修改、删除),就使用 int executeUpdate() 方法

int ret=statement.executeUpdate();
// executeUpdate 的返回结果是执行该操作后影响的行数

// 可以通过打印返回值来显示影响的行数
System.out.println("ret: "+ret);

如果要是要执行查询操作,就使用 ResultSet executeQuery() 方法

ResultSet resultSet=statement.executeQuery();
// executeQuery 的返回结果是执行该操作后查询到的类似于临时表的结构,存放在 ResultSet 对象中

// 接下来我们可以对它进行遍历,类似于迭代器的遍历,方法如下
while(resultSet.next()){
    // 假设有两列 id 和 name
    int id=resultSet.getInt(id);
    String name=resultSet.getString(name);
    System.out.println("id="+id+", name="+name);
}

SQL 查询语句对数据库的查询操作将返回一个 ResultSet 对象,ResultSet 对象由按列(字段)组织的数据行构成
ResultSet 对象一次只能看到一行数据,使用 next() 方法,可以移到下一个数据行(类似于 i++)
可以使用 ResultSet 对象的 getXxx() 方法,去获得字段。常用方法后面讲将介绍

6.4 释放资源

当我们执行完了我们的 SQL 语句后,如果不再使用某些对象,就需要把连接关闭,释放掉对应的资源

// 如果有 ResultSet 对象不需要使用后,需要关闭这个连接
resultSet.close();

// Connection 不需要使用后,需要关闭这个连接
connection.close();

// PreparedStatement 不需要使用后,需要关闭这个连接
statement.close();

ResultSetConnectionPreparedStatement 这些对象都对应着一些及机器的硬件资源,如果不使用的话就要及时还回去。就类似于借书,如果大家在图书馆只借书,不还书,那么图书馆的书籍资源就会一直减少
这些对象可以使用 close() 方法,来关闭和客户端与服务器建立的连接,以此释放占用的资源

6.5 JDBC 编程模板

通过上面五步,就可以进行基础的 Java 的 JDBC 编程了,虽然方法不止这一种,但如果你还不会的话,掌握这个方法就行了。最后再总结下整个的模板,依据它,我们就可以用 Java 语言对 MySQL 数据库进行各种操作

public static void test(){
    // 1. 创建数据库源,连接 Connection
 DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();

    // 2. 构造一个 SQL 语句,为要进行的操作做准备
    String sql="";
    PreparedStatement statement=connection.prepareStatement(sql);

 // 3. 执行 SQL,并处理结果集
    int ret=statement.executeUpdate();

    // 4. 执行完成,释放资源
    statement.close();
    connection.close();
}

7. JDBC 常用接口和类

上述 JDBC 编程步骤中已经将以下接口和类介绍了很多,所以可以互相补充漏洞

7.1 DataSource 和 MysqlDataSource

补充:

上述代码也可以直接使用 MysqlDataSource 来创建一个数据源,这样就可以不用使用向下转型了。但是如果使用 DataSource 的话,那么代码中其它代码其实都是使用 DataSource 这个类型的,这是和具体数据库类型无关的类,当你需要切换数据库时,就不需要大幅度修改代码

7.2 Connection

Connection 接口实现类由数据库提供,获取 Connection 对象通常有两种方式:

方式一: 通过 DataSource(数据源)对象获取

// 创建一个数据库源
DataSource dataSource=new MysqlDataSource();

// 设置数据库具体信息
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1234");

// 创建数据库连接
Connection connection=dataSource.getConnection();

方式二: 通过 DriverManager(驱动管理类)的静态方法获取

// 加载 JDBC 驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");

// 创建数据库连接
Connection connection=DriverManager.getConnection(url);

MySQL 数据库驱动程序被封装在 Driver 类中,该类的包名是 com.mysql.cj.jdbc,该类不是 Java 运行环境类库中的类

上述两种方式的区别:

  • DriverManager 类来获取的 Connection 连接,是无法重复利用的,每次使用完以后释放资源时,通过 connection.close() 都是关闭物理连接
  • DataSource 提供连接池的支持。连接池在初始化时创建一定数量的数据库连接,这些连接是可以重复利用的,每次使用完数据库连接,通过 connection.close() 释放资源,都是将 Connection 连接对象回收

7.3 PreparedStatement

PreparedStatement 是 JDBC API 提供的三种可以将 SQL 语句发送到数据库的对象之一。这里对这三种做一个简单介绍

  • Statement: 用于执行不带参数的简单 SQL
  • PreparedStatement
  1. 用于执行带或者不带参数的 SQL 语句
  2. SQL 语句会预编译在数据库系统
  3. 执行速度快于 Statement 对象
  • CallableStatement: 用于执行数据库存储过程的调用

7.4 ResultSet

ResultSet 对象它被称为结果集,它代表符合 SQL 语句条件的所有行,并且它通过一套 getXxx() 方法提供了对这些行中数据的访问
ResultSet 里的数据是一行一行排列的,每当有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用 ResultSet next() 方法,可以通过结合 while 循环来遍历 ResultSet 里的所有记录

常见 ResultSet 对象方法:

MySQL数据库 JDBC 编程(Java 连接 MySQL)

注意:

ResultSet 对象和数据库连接对象 Connection 实现了紧密连接,一旦连接对象被关闭,ResultSet 对象中的数据就会立刻消失

8. Java 操作数据库实例

8.1 往表中新增数据

在 student 表中新增学生 id 和 name:

public static void testInsert() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    Scanner scanner=new Scanner(System.in);
    System.out.print("请输入id:");
    int id=scanner.nextInt();
    System.out.print("请输入姓名:");
    String name=scanner.next();
    String sql="insert into student values(?,?)";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setInt(1,id);
    statement.setString(2,name);
    int ret=statement.executeUpdate();
    System.out.println("ret: "+ret);
    statement.close();
    connection.close();
}

8.2 删除表中的数据

在表名为 student 的表中,删除学生表中符合 id 条件的记录:

public static void testDelete() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    Scanner scanner=new Scanner(System.in);
    System.out.print("请输入要删除的 id:");
    int id=scanner.nextInt();
    String sql="delete from student where id=?";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setInt(1,id);
    int ret=statement.executeUpdate();
    System.out.println("ret: "+ret);
    statement.close();
    connection.close();
}

8.3 修改表中的数据

在表名为 student 的表中,将符合 id 条件的学生姓名进行修改:

public static void testUpdate() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    Scanner scanner=new Scanner(System.in);
    System.out.print("情输入你要更改的学生 id:");
    int id=scanner.nextInt();
    System.out.print("请输入你要更改后的学生姓名:");
    String name=scanner.next();
    String sql="update student set name=? where id=?";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setString(1,name);
    statement.setInt(2,id);
    int ret=statement.executeUpdate();
    System.out.println("ret: "+ret);
    statement.close();
    connection.close();
}

8.4 查找表中的数据

查找表名为 student 的表中的所有数据:

public static void testSelect() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    String sql="select * from student";
    PreparedStatement statement=connection.prepareStatement(sql);
    ResultSet resultSet=statement.executeQuery();
    while(resultSet.next()){
        int id=resultSet.getInt("id");
        String name=resultSet.getString("name");
        System.out.println("id = "+id+", name = "+name);
    }
    resultSet.close();
    statement.close();
    connection.close();
}

返回顶部
顶部