Java:JDBC连接完整通俗易懂指南(图文表格版)
JDBC 链接,简单来说,就是Java 程序连接数据库的“地址”和“通道”。
它的全称是Java Database Connectivity (Java数据库连接),是一套让 Java 代码能和不同数据库(如 MySQL、Oracle、PostgreSQL 等)对话的标准 API(应用程序编程接口),由 SUN 公司制定规范,各大数据库厂商实现底层驱动。
通俗类比:JDBC 相当于数据库通行证+通讯管道,连接字符串就是通行证密码,告诉Java程序:数据库在哪、走什么通讯规则、账号密码、附加校验规则。
1. JDBC连接核心结构(拆解+通俗注解)
以MySQL8.x标准连接地址为例:
jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8
拆分完整组成,补齐原有文档缺失的驱动协议细分规则,全部表格化:
组成部分 | 细分规则+含义 | 标准示例值 | 必填与否 |
|---|---|---|---|
顶层协议 | 固定前缀jdbc:,代表启用JDBC通讯规范,所有数据库必须保留,不可修改 | jdbc: | 必填 |
数据库子协议 | 区分数据库类型,驱动识别标识,mysql/oracle/postgresql各不相同 | mysql:// | 必填 |
主机Host | 数据库服务器IP,localhost仅代表本机;线上必须填写外网/内网IP | localhost、127.0.0.1、192.168.3.105 | 必填 |
端口Port | 数据库监听端口,每个数据库默认端口固定,不可随意修改 | 3306(MySQL)、1521(Oracle) | 必填 |
业务库名 | 连接目标业务数据库,不是MySQL服务本身,必须提前手动创建 | mydb、user_db、order_db | 必填 |
扩展连接参数 | 配置编码、时区、加密、超时、认证规则,多个参数使用&分隔 | ?serverTimezone=Asia/Shanghai | 可选(生产必加) |
2. 主流数据库完整对照表(补齐驱动类+maven依赖,生产可用)
原有文档缺失驱动类、适配版本、特殊语法,整合为最全对照表,区分老旧版本与新版本,规避报错:
数据库类型 | JDBC连接地址 | 完整驱动类 | 默认端口 | 适配场景 |
|---|---|---|---|---|
MySQL8.x | jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true | com.mysql.cj.jdbc.Driver(新版) | 3306 | 主流生产环境、SpringBoot2.x/3.x |
MySQL5.x | jdbc:mysql://localhost:3306/mydb?useSSL=false&characterEncoding=utf-8 | com.mysql.jdbc.Driver(旧版,已废弃) | 3306 | 老旧遗留项目 |
Oracle | jdbc:oracle:thin:@localhost:1521:xe | oracle.jdbc.OracleDriver | 1521 | 金融、国企老旧项目 |
PostgreSQL | jdbc:postgresql://localhost:5432/mydb | org.postgresql.Driver | 5432 | 云原生、大数据项目 |
SQL Server | jdbc:sqlserver://localhost:1433;databaseName=mydb | com.microsoft.sqlserver.jdbc.SQLServerDriver | 1433 | 传统Windows业务系统 |
SQLite | jdbc:sqlite:D:/db/mydb.db | org.sqlite.JDBC | 无端口 | 本地轻量化单机项目 |
避坑关键点:MySQL8.x 禁止使用旧驱动com.mysql.jdbc.Driver,会直接启动告警、连接失败;必须带时区参数!
3. JDBC原生代码优化版(修复旧代码缺陷)
3.1 原有代码存在问题
强行编写Class.forName加载驱动,JDBC4.0+完全冗余
未处理SQL异常、资源关闭不严谨
时区参数错误,线上时间错乱
3.2 生产级精简代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JdbcProdExample { public static void main(String[] args) { // 1. 生产标准链接地址 String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&allowPublicKeyRetrieval=true"; String username = "root"; String password = "root123456"; // 2. JDBC4.0自动加载驱动,无需手动Class.forName // 3. try-with-resources自动关闭连接,杜绝连接泄露(核心优化点) try (Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT name,id FROM users")) { // 遍历查询结果 while (rs.next()) { System.out.println("用户ID:"+rs.getInt("id")+" 用户名:" + rs.getString("name")); } } catch (Exception e) { // 生产环境禁止直接打印堆栈,需要日志输出 e.printStackTrace(); } } }4. SpringBoot全场景配置(补充多环境+废弃参数说明)
4.1 application.properties 标准生产配置
# 数据库连接地址 spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&allowPublicKeyRetrieval=true # 账号密码 spring.datasource.username=root spring.datasource.password=root123456 # MySQL8固定驱动类,禁止简写 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 开启打印sql日志(调试专用) logging.level.com.zaxxer.hikari=DEBUG4.2 application.yml 标准生产配置
spring: datasource: url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8 username: root password: root123456 driver-class-name: com.mysql.cj.jdbc.Driver4.3 废弃参数补充(高频踩坑)
废弃参数 | 问题 | 替代方案 |
|---|---|---|
useLegacyDatetimeCode | MySQL8彻底废弃,引发时间报错 | 直接删除,使用serverTimezone统一时区 |
driverClassName=com.mysql.jdbc.Driver | 过期驱动,SpringBoot3直接启动失败 | 替换为com.mysql.cj.jdbc.Driver |
5. MySQL连接参数完整版(分类表格,区分开发/生产)
扩充原有参数,拆分必填参数、优化参数、故障修复参数,适配线上生产:
参数名称 | 详细作用 | 适用环境 |
|---|---|---|
serverTimezone=Asia/Shanghai | 指定东八区时区,解决相差8小时、时间回显错误,生产必填 | MySQL8全局 |
useSSL=false | 关闭SSL加密连接,本地开发关闭;外网公网必须开启true | 本地开发关闭,线上生产开启 |
characterEncoding=utf-8 | 统一通讯编码,解决新增、查询中文乱码 | 全环境必填 |
allowPublicKeyRetrieval=true |
