JDBC获取数据库连接的5种方式实例
作者:COWARD_LOVE1 发布时间:2024-01-19 05:14:05
方式一:直接通过数据库厂商提供的相关驱动
步骤
导入相关驱动(Build Path)
创建Driver类的实例化对象
获取要连接数据库的URL
创建Properties类的实例化对象,将账号和密码封装到该对象中
通过Driver实例化对象调用connect(String url,Properties info)方法获取connection对象
package connection;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;
import org.junit.jupiter.api.Test;
public class ConnectionTest {
@Test
public void test() throws SQLException {
//创建Driver实例
Driver driver=new com.mysql.cj.jdbc.Driver();
//获取要读取数据库的URL
String url="jdbc:mysql://localhost:3306/test04_emp";
//将账号密码封装到Properties对象中
Properties info=new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//通过Driver的对象获取连接
Connection connect=driver.connect(url, info);
//调用连接的toString()
System.out.println(connect);
}
}
方法二:通过反射的方式来构造Driver对象
通过Class的forName(Stirng className)获取驱动的运行时类。
通过运行时类的newInstance()来获取运行时类的对象。
获取URL和将账号密码封装到Properties对象中。
使用运行时类的对象调用connect()方法获取连接。
@Test
public void test2() throws Exception {
//通过反射的方式获取运行时类
Class clazz=Class.forName("com.mysql.cj.jdbc.Driver");
//通过反射的方式创建运行时类对象
Driver driver=(Driver)clazz.newInstance();
//获取URL
String url="jdbc:mysql://localhost:3306/test04_emp";
//封装账号密码
Properties info=new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//获取连接
Connection connect=driver.connect(url, info);
System.out.println(connect);
}
方式三:使用DriverManager来替换Driver获取连接
获取Driver的实现类对象。
使用DriverManager的registerDriver(Driver driver)方法来注册驱动。
提供URL、账号和密码。
使用DriverManager的getConnection(String url,String user,String password)来获取连接。
@Test
public void test3() throws Exception {
//通过反射的方式获取Driver对象
Driver driver=(Driver)Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
//调用DriverManager的registerDriver(Driver driver)方法注册驱动
DriverManager.registerDriver(driver);
//提供账号、密码和URL
String user="root";
String password="abc123";
String url="jdbc:mysql://localhost:3306/test04_emp";
//调用DriverManager的getConnection()方法来获取连接
Connection connect=DriverManager.getConnection(url,user,password);
System.out.println(connect);
/*getConnection()还有一种版本:getConnection(String url,Properties info)
* 可以参考方法一和方法二。
*/
}
方法四:省略创建Driver对象和注册驱动
通过反射将Driver类加载到内存中。
提供账号、密码和URL。
通过DriverManager调用getConnection()获取连接。
注意:这里之所以可以省略创建Driver对象和注册驱动是因为,创建Driver对象的目的是给DriverManager调用registerDriver()注册驱动时提供参数,而在Driver类加载到内存中时,有一个static方法会自动调用registerDriver()方法,从而自动注册驱动。
@Test
public void test4() throws Exception {
//通过反射将Driver加载到内存中
Class.forName("com.mysql.cj.jdbc.Driver");
//提供相关信息
String user="root";
String password="abc123";
String url="jdbc:mysql://localhost:3306/test04_emp";
//通过getConnection()获取连接
Connection connect=DriverManager.getConnection(url,user,password);
System.out.println(connect);
}
方式五:通过配置文件的方式
创建配置文件
通过类的加载器生成指向配置文件的流
创建Properties对象,通过调用load()方法将配置文件加载到内存中
通过Properti对象的getProperty(String key)获取相关信息
通过反射的方式加载驱动
调用getConnection()获取连接
@Test
public void test5() throws Exception {
//通过类加载器创建一个指向配置文件的流
InputStream input=ConnectionTest.class.getClassLoader().getResourceAsStream("test.properties");
//创建Properties对象
Properties infoProperties=new Properties();
//以流为参数调用load()加载配置文件
infoProperties.load(input);
//获取相关信息
String driver=infoProperties.getProperty("driver");
String url=infoProperties.getProperty("url");
String user=infoProperties.getProperty("user");
String password=infoProperties.getProperty("password");
//加载驱动
Class.forName(driver);
//获取连接
Connection connection= DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
我们通常都使用方式五
每种方式迭代的原因
第一种方式是直接通过使用指定数据库厂商的驱动来获取数据库连接的,但是我们希望程序具有更好的可移植性,所以采用反射的方式来获取驱动,这就产生了第二种方法;在开发中,我们通常都不使用Driver来获取连接,而是通过使用DriverManager来获得数据库连接,这就从第二种方式到了第三种方式;又因为Driver的实现类中有静态方法调用了regiesterDriver()方法,所以在通过反射的方式将类加载到内存中时,会自动注册驱动,我们可以将注册驱动的过程省略,这就产生了第四种方法;在前面的方法中,我们都是直接把账号密码和URL以及驱动的名称直接写在程序中的额,这不太符合我们日常的规范,也在一定程度上增加了程序的 风险,为此我们将相关信息保存在配置文件中,在程序中通过读取配置文件的方式来获取相关的信息,这就产生了最后一种也是我们最常用的方式。
方式五的优点
将需要的数据放到配置文件中,实现了数据和代码分离,减少了耦合性。
如果需要修改配置文件信息,只需要替换文件就可以,避免了重新打包文件。
来源:https://blog.csdn.net/m0_71987537/article/details/125284985


猜你喜欢
- 如何在聊天室实现趣味答题并计分功能?这个创意确实很好,我们可用在聊天室框架中加入一隐含帧(5分钟刷新一次)的做法来实现这一功能。questi
- 前面章节我们学些了文件对象的创建、写入与读取,并且针对 .py 文件 与 .txt 文件进行了有针对性的小练习。 通过前面的学习我们知道,文
- 原文: gradio.app/interface-s…1.全局状态例子来解释import gradio as grsc
- 目录为什么要画局部放大图?程序逻辑程序实例总结这项功能的目的是为了方便使用opencv做图像标注工具。为什么要画局部放大图?在做图像数据标注
- 视图是一种常用的数据库对象,它将查询的结果以虚拟表的形式存储在数据中。因为视图有非常多的优点:1,可以简化操作,2,可以建立前台和后台的缓冲
- 我的经历前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。这个答案好像并不是他想要的。于是他继续追
- 阅读上一篇:微软建议的ASP性能优化28条守则(3) 技巧 8:迟一点获得资源,早一点释放资源 这里是一个小技巧供您参考。一般来说,最好迟一
- 导言本文简单介绍了如何从网易财经获取某支股票的价格数据,并根据价格数据画出相应的日K线图。有助于新手了解并使用Python的相关功能。包括列
- V5.0之后,我们总结了一些得失。首先要说的是改版的动力。产品设计或产品升级的驱动力只有两个:用户需求和网站目标。之前的我们的多次改版,其驱
- goroutinue基本介绍进程和线程说明进程介绍程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位线程只是进程的一个执行实
- 一、前言为方便描述教程例子,这里给出mysql表结构定义和golang结构体定义。下面是教程用到的foods表结构定义:CREATE TAB
- 完整代码如下:import requestsfrom lxml import etreeimport randomimport osfrom
- python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), i
- 业务场景:前后端分离需要对接数据接口。接口测试是在postman做的,今天才开始和前端对接,由于这是我第一次做后端接口开发(第一次嘛,问题比
- 1、Git本地版本库结构如下图所示:工作区(Working Directory)添加、编辑、修改、删除文件等操作。暂存区(Stage)打算提
- 本文实例讲述了Go语言eclipse环境搭建的方法。分享给大家供大家参考,具体如下:1 下载eclipse2 下载goeclipsehttp
- 相比于2018年,在ICLR2019提交论文中,提及不同框架的论文数量发生了极大变化,网友发现,提及tensorflow的论文数量从2018
- output输出打包后的代码,配置如何输出和输出位置在webpack.config中output包含以下属性:path:代码打包后要输出的位
- 中间件是一个钩子框架,它们可以介入 Django 的请求和响应处理过程。 它是一个轻量级、底层的 插件 系统,用于在 全局修改 Django
- 前言最近由于换工作,开始交接工作。整理以前的工作内容,由于组内就我一个在做go和大数据。 所以开发没有规划,当时是怎么快怎么来。go也是使用