JDBC技术(MySQL)之建立数据库连接

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 笔记

一、加载驱动程序


在编程实现数据库连接时,JVM必须先加载特定厂商提供的数据库驱动程序。使用Class.forName()方 法实现驱动程序加载过程

不同驱动程序的装载方法如下:

//JDBC-ODBC桥接,Java自带
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
//数据库厂商提供
Class.forName("特定的JDBC驱动程序类名");

例如加载MySQL驱动程序代码如下:

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

问题:在运行时有时会抛出这个东西

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

解决方法:

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

如果直接这样运行程序会抛出如下的ClassNotFoundException异常。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

原因是程序无法找到MySQL驱动程序com.mysql.jdbc.Driver类。MySQL驱动程序是在MySQL的Connector.J X文件中的mysql-connector-java-xxx.jar文件中,也就是说需要导入这个jar包。


导入这个jar包具体操作见链接https://blog.csdn.net/weixin_45366499/article/details/104579591


这里有一个测试代码:

public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }
    }
}

二、建立数据连接


驱动程序加载成功就可以进行数据库连接了。建立数据库连接可以通过调用DriverManager类的 **getConnection()**方法实现。


static Connection getConnection(String url):尝试通过一个URL建立数据库连接,调用此方法时,DriverManager会试图从已注册的驱动中选择恰当的驱动来建立连接。

static Connection getConnection(String url,Properties info):尝试通过一个URL建立数据库连接,一些连接参数(如user和password)可以按照键值对的形式放置到info中,Properties是Hashtable的子类,它是一种Map结构。

static Connection getConnection(String url, String user, String password):尝试通过一个URL建立数据库连接,指定数据库用户名和密码。

上面的几个getConnection()方法都会抛出受检查的SQLException异常,注意处理这些异常。


JDBC的URL类似于其他场合的URL,它的语法如下:

jdbc:<subprotocol>:<subname>

这里有三个部分,它们用冒号隔离。


协议:jdbc表示协议,它是唯一的,JDBC只有这一种协议。

子协议:主要用于识别数据库驱动程序,也就是说,不同的数据库驱动程序的子协议不同。

子名:它属于专门的驱动程序,不同的专有驱动程序可以采用不同的实现。

对于不同的数据库,厂商提供的驱动程序和连接的URL都不同,如图总结:1.png

以MySQL为例,他的URL为

url = "jdbc:mysql://localhost:3306/数据库名"

建立数据连接示例代码如下(第一种写法):

mport java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/2/29
 * @time : 4:21 下午
 */
public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }
        String url = "jdbc:mysql://localhost:3306/JAVA";
        String user = "root";
        String password = "199911";
        try (Connection conn = DriverManager.getConnection(url,user,password){
            System.out.println("数据库连接成功"+conn);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Connection对象代表的数据连接不能被JVM的垃圾收集器回收,在使用完连接后必须关闭 (调用close()方法),否则连接会保持一段比较长的时间,直到超时。这里是通过自动资源管理技术释放资源的。


上面代码虽然可以成功建立连接,但是有时控制台会有警告,这是由于现在的网络通信为了提高网络完全,都要求使用SSL (Secure Sockets Layer 安全套接层) 安全 协议。但是由于各种原因,很多服务器并未使用SSL安全协议,特别是对于学习和测试阶段可以不使 用SSL安全协议。为此,需要修改url连接字符串:

"jdbc:mysql://localhost:3306/MyDB?verifyServerCertificate=false&useSSL=false"

verifyServerCertificate设置为false表示不进行安全认证,useSSL设置为false表示不使用SSL进行网 络通信。

有的url字符串会很长维护起来不方便,可以把这些参数对放置到Properties对象中,示例代码如 下(第二种写法):

mport java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/2/29
 * @time : 4:21 下午
 */
public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }
        String url = "jdbc:mysql://localhost:3306/JAVA";
//        第二种写法
//        创建Properties对象
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","199911");
        info.setProperty("verifyServerCertificate","false");
        info.setProperty("useSSL","false");
        try (Connection conn = DriverManager.getConnection(url,info)){
            System.out.println("数据库连接成功"+conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

上述代码代码通过创建Properties对象,调用setProperty()方法,法键和值都是 字符串类型。解决了数据连接的url字符串有很多参数对的问题,和有的url字符串会很长维护起来不方便的问题。

但是上述代码还是有不足的地方,就是这些参数都是“硬编码 ”。在程序代码中的,程序编译之后不能修改。但是数据库用户名、密码、服务器主机名、端口等等这一切,在开发阶段和部署阶段可能完全不同,这些参数信息应该可以配置的,可以放到一个属性文件中,借助于输入流,可以在运行时读 取属性文件内容到Properties对象中。


如何创建配置文件:config.properties:

在src文件夹下创建文件。2.png

在config.properties文件中写下内容如下:

user=root
password=199911
useSSL=false
verifyServerCertificate=false


示例代码如下(第三种写法):

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/2/29
 * @time : 4:21 下午
 */
public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }
        String url = "jdbc:mysql://localhost:3306/JAVA";
//        第三种写法
        Properties info = new Properties();
        try {
//            获得config.properties配置文件的输入流对象,需要自己创建在src文件里
            InputStream inputStream = HelloWorld.class.getClassLoader().getResourceAsStream("config.properties");
//            从流中加载信息到properties对象中
            info.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        try (Connection conn = DriverManager.getConnection(url,info)){
            System.out.println("数据库连接成功"+conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

注意:属性 文件一般放到src目录与源代码文件放置在一起,但是编译时,这些文件会复制到字节码文件所在的目录中,这种目录称为资源目录,获得资源目录要通过Java反射机制,

格式如下:

类名.class.getClassLoader().getResourceAsStream("config.properties")

语句能够获得运 行时config.properties的文件输入流对象。

在开发和部署阶段使用文本编辑器修改该文件,不需要修改程序代码。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
人工智能 物联网 大数据
解密时序数据库的未来:TDengine Open Day技术沙龙精彩回顾
在数字化时代,开源已成为推动技术创新和知识共享的核心力量,尤其在数据领域,开源技术的涌现不仅促进了行业的快速发展,也让更多的开发者和技术爱好者得以参与其中。随着物联网、工业互联网等技术的广泛应用,时序数据库的需求愈发强烈,开源的兴起更是为这一技术的创新与普及提供了强有力的支持。
16 3
|
14天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
49 15
|
2月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
120 61
|
28天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
8天前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
2月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
2月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
148 3
|
2月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
61 3
|
2月前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
2月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
50 1