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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 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的文件输入流对象。

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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6天前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
87 1
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
2342 1
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
166 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
557 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
298 0

热门文章

最新文章

推荐镜像

更多
下一篇
开通oss服务