JDBC的“那些事”之初识

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: JDBC的“那些事”之初识

Mysql版本:8.0.26

可视化客户端:sql yog

编译软件:IntelliJ IDEA 2019.2.4 x64

运行环境:win10 家庭中文版

jdk版本:1.8.0_361

前言

随着人工智能与大数据的不断发展,数据库管理与运维这门技术也越来越重要,很多人都开启了学习此项技能的脚步,对于开发者来说,尤其是涉及程序与数据库的数据交互,更是重要,本文带你介绍Java程序与MySQL数据库之间的信息交互的“那些事”。


提示:以下是本篇文章正文内容,下面案例可供参考

一、JDBC是什么?

JDBC,全称Java Database Connectivity,用官方一点的说法解释是:

它代表一组独立于任何数据库管理系统(DBMS)的API,声明在java.sql与javax.sql包中,是SUN(现在Oracle)提供的一组接口规范。由各个数据库厂商来提供实现类,这些实现类的集合构成了数据库驱动jar。

👉用通俗的话来讲:

JDBC就是Java程序用来连接各种数据库的API。 该API是由上述的SUN(Oracle)提供的一组公共接口+各个数据库厂商提供的驱动类构成。

JDBC API的构成关系如下图所示:


二、如何使用JDBC连接数据库?

👉备注:本文以MySQL数据库作为案例

2.1 引入mysql驱动jar包

方式一:单独某个模块使用mysql驱动

👉步骤:

👉①在你的Java项目目录下新建一个名为“jdbclibs”的文件夹,将下载好的jar包复制粘贴到刚才新建的“jdbclibs”的文件夹中。

ps:相关jar包资源我会上传至c站资源

👉②打开你的IDEA,找到下面的图标,点击打开,随后呈现的是“project structure”选项卡。

👉③在project structure 选项卡中,libraries -> + -> java -> select libraries file -> 选中刚才新建的jdbclibs文件夹

👉 ④在choose Modules选项卡选中你要应用的模块,然后点击“ok”

👉⑤为单模块添加mysql驱动已完成

方式二:为整个项目使用mysql驱动

👉 ①打开IDEA,找到如下DE1图标,点击打开,随后呈现的是“project structure”选项卡。

👉 ②在project structure 选项卡中,Modules -> 选中所有的模块 -> + -> library

👉③在chose libraries 界面 选中刚才新加的jdbclibs1 jar包,选择“add selected

👉④选中后,在“dependence”下将新加入的jdbclibs1的scope范围切换为“Compile”,最后点击“ok”完成。

方式三:使用maven

ps:此方法留作后期叙述

2.2 Java程序连接数据库

👉步骤:

1、模块添加了依赖的mysql驱动相关库

注意:我们在2.1中执行的操作就是给Java项目添加需依赖的mysql驱动

2、在内存中加载驱动类(可选)

  • 更早版本mysql驱动类org.gjt.mm.mysql.Driver
  • 最近版本com.mysql.jdbc.Driver
  • MySQL8.0版本com.mysql.cj.jdbc.Driver

👉注意:

如果你的jar包是旧版的,你必须在主方法中首行写下如下的代码,手动加载对应的的驱动类。

代码如下:

Class.forName("com.mysql.cj.jdbc.Driver");

新版的mysql驱动jar可以省略这步,旧版的mysql驱动jar必须加这一步。

👉why?

因为新版mysql驱动jar包下有一个META-INF/services/java.sql.Driver文件

里面有填写mysql驱动类的全名称,DriverManager会自动读取这个文件,并加载对应的驱动类

如下图所示:

👉小tips:

我们在后期使用数据库连接池,或者MyBatis等框架时,在配置文件中需要加这个驱动类的配置

3、连接数据库通过DriverManager工具类获取数据库连接Connection的对象

此时Java程序是MySQL的一个客户端

👉连接数据库需要如下参数:

  • MySQL服务器主机的IP地址
  • 端口号
  • 用户名
  • 密码
  • 要连接的数据库名称(这一点和使用命令行客户端、可视化工具客户端不一样),一个连接只能查看一个数据库

👉 如何把这些信息告诉给驱动类的底层呢?

通过url 传给底层,url是字符串类型,它将下面的内容包成字符串传给底层,使其构建连接

协议://主机名: 端口号/数据库名?参数名=套数值

协议是什么?

如我们司空见惯的网址,例如百度的网址http://www.baidu.com,它采用的就是http协议。

👉而Java程序连接数据库却是采用jdbc协议

👉 jdbc:mysql://localhost:3306/0106db

👉备注:

jdbc是主协议,mysql是子协议,localhost表示连接本机的mysgl数据库,3306是端口号,0106db是一个数据库名

案例:连接数据库0106db

代码演示如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class testJdbc {
    //DriverManager: 驱动管理
    //getConnection: 获取连接
   /*
    A: 提供mysql服务所在主机的IP地址或主机名
    B: 端口号
    C: 用户名
    D: 密码
    E: 要连接的数据库名称(这一点和使用命令行客户端、可视化工具客户端不一样),一个连接只能查看一个数据库
    如何把这些信息告诉底层呢?
    通过url 协议://主机名: 口号/数据库名?参数名=套数值
    http://www.atquigu.com
    jdbc:mysql://localhost:3306/0106db
    jidbc是主协议,mysql是子协议,localhost表示连接本机的mysgl数据库,3306是端口号,atguigu是一个数据库名
    */
    public static void main(String[] args) throws SQLException {
        //Class.forName("com.mysql.cj.jdbc.Driver"),如果在web阶段学习时,Tomcat服务器提示找不到合适的驱动类,但是代码都是对的,可以自己手动加载一下
        Connection root = DriverManager.getConnection(url, "root", "123456");
        System.out.println(root);
    root.close();//断开连接并释放资源
    }
}

原因分析: 当我们的数据库版本是MySQL8.0及以上时,url需要加参数,即serverTimezone=UTC,否则会上述报错

代码修正如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class testJdbc {
    //DriverManager: 驱动管理
    //getConnection: 获取连接
   /*
    A: 提供mysql服务所在主机的IP地址或主机名
    B: 端口号
    C: 用户名
    D: 密码
    E: 要连接的数据库名称(这一点和使用命令行客户端、可视化工具客户端不一样),一个连接只能查看一个数据库
    如何把这些信息告诉底层呢?
    通过url 协议://主机名: 口号/数据库名?参数名=套数值
    http://www.atquigu.com
    jdbc:mysql://localhost:3306/0106db
    jidbc是主协议,mysql是子协议,localhost表示连接本机的mysgl数据库,3306是端口号,atguigu是一个数据库名
    */
    public static void main(String[] args) throws SQLException {
        //Class.forName("com.mysql.cj.jdbc.Driver"),如果在web阶段学习时,Tomcat服务器提示找不到合适的驱动类,但是代码都是对的,可以自己手动加载一下
//      String url="jdbc:mysql://localhost:3306/0106db";  
        /*
        如果不加?serverTimezone=UTC
        会报如下异常:
        Excepton in thread "main" java.sql.SQLException:
        The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
        */
        //修正如下:
        String url="jdbc:mysql://localhost:3306/0106db?serverTimezone=UTC";
        Connection root = DriverManager.getConnection(url, "root", "123456");//开始连接数据库,相当于网络编程中的socket
        System.out.println(root);//打印连接对象
        root.close();//断开连接并释放资源
    }
}

4、断开连接:使用close方法。

代码如下所示:

root.close();//断开连接并释放资源

三、连接数据库后,JDBC如何实现增删改查?

3.1 JDBC实现插入数据

👉步骤:

  1. 连接数据库获取Connection对象 ==>(相当于) Socket
  2. 编写insert的sql语句
  3. 获取一个Preparedstatement对象 ==>(相当于) 输出流/输入流
  4. 使用Preparedstatement对象执行sql语句

👉注意:

只要是修改数据库的数据(添加、删除、修改) ,调用的方法都是 executeUpdate()

  1. 释放资源

案例:使用jdbc连接数据库0225db,在t_deployment表中插入一条数据

插入之前:

代码插入如下:

//jdbc实现插入数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class testInsert {
    public static void main(String[] args) throws SQLException {
        //开始连接数据库,相当于网络编程中的socket
        String url="jdbc:mysql://localhost:3306/0225db?serverTimezone=UTC";
        Connection root = DriverManager.getConnection(url, "root", "123456");
        String sql="INSERT INTO t_department VALUES(7,'保安部','负责安保巡逻工作')";
        PreparedStatement pst = root.prepareStatement(sql);//把sql语句装进去;相当于通过PreparedStatement对象把sql发送给MySQL服务端
        int len=pst.executeUpdate();//len代表的是影响的记录数,真正发送数据的是pst.executeUpdate()
     /*
        int len = pst.executeUpdate()
    执行操作增删改,并返回一个int型数值,表示同步更新的记录条数
    */
        System.out.println(len>0?"添加成功":"添加失败");
        //释放资源
        pst.close();
        root.close();
    }
}

3.2 JDBC实现删除数据

👉步骤:

  1. 连接数据库获取Connection对象 ==>(相当于) Socket
  2. 编写delete的sql语句
  3. 获取一个Preparedstatement对象 ==>(相当于) 输出流/输入流
  4. 使用Preparedstatement对象执行sql语句

👉注意:

只要是修改数据库的数据(添加、删除、修改) ,调用的方法都是 executeUpdate()

  1. 释放资源

案例:使用jdbc连接数据库0225db,在t_deployment表中删除刚才插入的一条数据

删除之前:

代码删除如下:

//jdbc实现删除数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class testDelete {
    public static void main(String[] args) throws SQLException {
        //开始连接本机的MySQL服务端
        String url="jdbc:mysql://localhost:3306/0225db?serverTimezone=UTC";
        Connection root = DriverManager.getConnection(url, "root", "123456");
        String sql="delete from t_department where did=7";
        PreparedStatement pst = root.prepareStatement(sql);//把sql语句装进PreparedStatement对象中,准备发送
        int len = pst.executeUpdate();//真正发送sql语句
     /*
        int len = pst.executeUpdate()
    执行操作增删改,并返回一个int型数值,表示同步更新的记录条数
    */
        System.out.println(len>0?"删除成功":"删除失败");
        //释放资源
        pst.close();
        root.close();
    }
}

3.3 JDBC实现修改数据

👉步骤:

  1. 连接数据库获取Connection对象 ==>(相当于) Socket
  2. 编写update的sql语句
  3. 获取一个Preparedstatement对象 ==>(相当于) 输出流/输入流
  4. 使用Preparedstatement对象执行sql语句

👉注意:

只要是修改数据库的数据(添加、删除、修改) ,调用的方法都是 executeUpdate()

  1. 释放资源

案例:使用jdbc连接数据库,将did为7的dname的值改为安保部

修改之前:

代码修改如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//jdbc实现更新数据
public class testUpdate {
    public static void main(String[] args) throws SQLException {
        //开始连接本机的MySQL服务端
        String url="jdbc:mysql://localhost:3306/0225db?serverTimezone=UTC";
        Connection root = DriverManager.getConnection(url, "root", "123456");
        String sql="UPDATE t_department SET dname='安保部' WHERE did=7";
        PreparedStatement pst = root.prepareStatement(sql);//把sql语句装进PreparedStatement对象中,准备发送
        int len = pst.executeUpdate();//真正发送sql语句
        /*
        int len = pst.executeUpdate()
    执行操作增删改,并返回一个int型数值,表示同步更新的记录条数
    */
        System.out.println(len>0?"更新成功":"更新失败");
    //释放资源
        pst.close();
        root.close();
    }
}

3.4 JDBC实现查询数据

👉步骤:

  1. 连接数据库获取Connection对象 ==>(相当于) Socket
  2. 编写select的sql语句
  3. 获取一个Preparedstatement对象 ==>(相当于) 输出流/输入流
  4. 使用Preparedstatement对象执行sql语句

👉注意:

只要是修改数据库的数据(添加、删除、修改) ,调用的方法都是 executeUpdate()

执行查询数据库的数据,调用的方法是executeQuery(),它的返回值类型ResultSet结果集

  1. 遍历结果集
while(rs.next()){   
  //遍历结果集的每一行 
  变量=rs.getXXX(字段名/字段列表)
}
  1. 释放资源

案例:使用jdbc连接数据库,查询t_employee表中的所有信息

查询之前:

代码查询如下:

import java.sql.*;
//jdbc实现查询数据
public class testSelect {
    public static void main(String[] args) throws SQLException {
        //开始连接本机的MySQL服务端
        String url="jdbc:mysql://localhost:3306/0225db?serverTimezone=UTC";
        Connection root = DriverManager.getConnection(url, "root", "123456");
        String sql="select * from t_department";
        PreparedStatement pst = root.prepareStatement(sql);//把sql语句装进PreparedStatement对象中,准备发送
        ResultSet resultSet = pst.executeQuery();//返回一个结果集;真正发送sql
/*
    //如果查询之前我很清楚表中字段的数据类型,就可以使用如下代码
        while (resultSet.next()){ //相当于Collection系列集合得到的iterator迭代器的hashnext()方法
            int did=resultSet.getInt("did");//"did"是数据库0225db下t_department表的字段名did
            String dname=resultSet.getString("dname");//数据库中的字段名
            String description=resultSet.getString("description");//数据库中的字段名
            System.out.println(did+"\t"+dname+"\t"+description+"\t");
        }
*/
        //如果我不是很清楚表中字段的数据类型,使用下列的代码写法,这样做是为了屏蔽数据库字段的数据类型的差异
        while (resultSet.next()){ //相当于Collection系列集合得到的iterator迭代器的hashnext()方法
            Object did=resultSet.getObject(1);//数据库0225db下t_department表的字段的序号为1
            Object dname=resultSet.getObject(2);//数据库中的字段序号为2
            Object description=resultSet.getObject(3);//数据库中的字段序号为3
            System.out.println(did+"\t"+dname+"\t"+description+"\t");
        }
        //释放资源
        resultSet.close();
        pst.close();
        root.close();
    }
}

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
SQL Java 数据库连接
JDBC是真的啰里啰嗦啊-但是很重要!(下)
JDBC是真的啰里啰嗦啊-但是很重要!
|
6天前
|
Java 关系型数据库 MySQL
JDBC是真的啰里啰嗦啊-但是很重要!(上)
JDBC是真的啰里啰嗦啊-但是很重要!
|
2月前
|
存储 Java 数据库连接
JDBC简单总结
JDBC简单总结
10 0
|
9月前
|
SQL Java 关系型数据库
JDBC详解
JDBC详解
|
9月前
|
SQL 人工智能 数据可视化
JDBC的“那些事“之应当注意的问题(上)
JDBC的“那些事“之应当注意的问题(上)
|
11月前
|
Java 关系型数据库 MySQL
JDBC1.0
JDBC是JAVA十三大规范之一,由JAVA定义顶级接口API,各个数据库厂商去实现。常用的四大接口——Driver,DriverManager,Connection,Statement。 这里先给出结论: 所谓的JAVA制定标准,就是指JAVA给出接口,厂家各自去实现。 比如Driver,Connection,Statement等都是有接口,有实现。 通过向DriverManager注册不同Driver来确定Connection,Statement的类型
46 0
|
12月前
|
SQL Java 关系型数据库
JDBC介绍
JDBC介绍
84 0
|
SQL 安全 Java
33 JDBC实用详解
info 💡 概念:JDBC是java提供的一套用于操作数据库的接口API:java程序员只需要面向这套接口编程即可;
70 0
|
SQL 安全 Java
|
SQL druid Java
jdbc
全称:Java DataBase Connectivity, 意思就是 java连接数据库用到的,用来操作不同数据库的。
107 0