02-获取连接数据库的Connection对象的方式

获取连接对象连接数据库的方式

JDBC编程六步

  • 创建并注册驱动对象 : 告诉Java程序即将要连接的是哪个品牌的数据库(注意使用反射机制加载Driver类时会自动完成驱动的创建和注册)
  • 使用注册对象获取连接对象: 表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,使用完之后一定要关闭通道
  • 获取数据库操作对象: 专门执行sql语句的对象
  • 利用数据库操作对象执行SQL语句: 如DQL DML语句等
  • 处理查询结果集: 只有执行的是select语句的时候才需要处理查询结果集
  • 释放资源: Java和数据库属于进程间的通信,使用完后一定要关闭资源

手动创建驱动对象调用方法

各大数据库厂商都实现java.sql.Driver接口,我们创建某个厂商的驱动对象然后调用connect方法获取连接对象

方法名作用
Connection connect(url, properties)获取连接对象, properties中封装了用户名和密码

第一种: 静态创建数据库的驱动对象然后调用connect方法获取连接对象

@Test
public void connect01() throws SQLException {// 创建oracle的驱动对象// Driver driver = new oracle.jdbc.driver.OracleDriver();// 创建mysql的驱动对象,由于数据库厂商都实现了java.sql.Driver接口,所以可以使用多态机制Driver driver = new com.mysql.jdbc.Driver(); // 编写连接数据库的url,用户名和密码(保存在Properties对象中,user和password是规定好的键名)String url = "jdbc:mysql://localhost:3306/hsp_db02";Properties properties = new Properties();properties.setProperty("user", "root");properties.setProperty("password", "123456");// 调用驱动对象的connect方法获取连接对象,参数就是url,用户名和密码Connection connect = driver.connect(url, properties);System.out.println("静态获取的数据库连接对象 = " + connect); // com.mysql.jdbc.JDBC4Connection@41cf53f9
}

第二种: 利用反射机制动态创建数据库的驱动对象然后调用connect方法获取连接对象,代码更加灵活减少依赖性

@Test
public void connect02() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {//使用反射机制动态加载Driver类然后创建数据库的驱动对象Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver)aClass.newInstance();// 编写连接数据库需要的url,用户名和密码(保存在Properties对象中,user和password都是规定好的键名)String url = "jdbc:mysql://localhost:3306/hsp_db02";Properties properties = new Properties();properties.setProperty("user", "root");properties.setProperty("password", "123456"); // 调用驱动对象的connect方法获取连接对象,参数就是url,用户名和密码Connection connect = driver.connect(url, properties);System.out.println("使用反射机制获取的数据库连接对象 = " + connect); 
}

手动注册驱动对象到驱动管理类

将创建好的驱动对象注册到驱动管理类中进行管理,这样DriverManager(驱动管理对象)就可以对driver(驱动对象)的方法进行扩展

方法名功能
static Connection getConnection(url,uesr,pwd)直接传入参数信息, 获取连接对象(底层干活的还是 driver 对象)
static void registerDriver(driver)在驱动管理类中完成驱动注册后它就会对驱动对象进行管理
@Test
public void connect03() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {// 使用反射机制动态加载Driver类然后创建数据库的驱动对象Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver) aClass.newInstance();// 编写连接数据库的url,用户名和密码(保存在Properties对象中,user和password是规定好的键名)String url = "jdbc:mysql://localhost:3306/hsp_db02";String user = "root";String password = "hsp";// 调用DriverManager的registerDriver静态方法完成驱动的注册DriverManager.registerDriver(driver);// 调用DriverManager的getConnection静态方法获取连接对象Connection connection = DriverManager.getConnection(url, user, password);System.out.println("使用驱动管理类获取的数据库连接对象=" + connection);
}

自动完成驱动对象创建和注册

执行Class.forName("com.mysql.jdbc.Driver")加载Driver驱动类时会执行静态代码块中的代码自动完成驱动的创建与注册

甚至可以无需显示的调用Class.forName("com.mysql.jdbc.Driver"),因为MySQL默认会加载Driver类,但是写上更加明确

static {try {// 当加载完Driver类时,驱动对象的注册的工作就完成了DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}
}
@Test
public void connect04() throws ClassNotFoundException, SQLException {// 使用反射机制加载Driver类,类加载期间底层自己会完成驱动对象的创建与注册// 因为我们只想用它的类加载动作,所以类加载时不用接收返回值Class.forName("com.mysql.jdbc.Driver");// 编写连接数据库的url,用户名和密码(保存在Properties对象中,user和password是规定好的键名)String url = "jdbc:mysql://localhost:3306/hsp_db02";String user = "root";String password = "hsp";// 调用DriverManager的getConnection静态方法获取连接对象Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);
}

创建属性资源文件

将数据库的连接信息写入到properties配置文件中,以后需要连接其他数据库的时候不需要修改java代码,只需要修改属性配置文件中的内容即可

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.151.9:3306/bjpowernode
user=root
password=981127
@Test
public void connect05() throws IOException, ClassNotFoundException, SQLException {// 通过Properties对象获取配置文件中的信息Properties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");String url = properties.getProperty("url");// 使用资源绑定器绑定属性配置文件并获取相关属性的值ResourceBundle bundle = ResourceBundle.getBundle("jdbc");String driver = bundle.getString("driver");String url = bundle.getString("url");String user = bundle.getString("user");String password = bundle.getString("password");// 连接数据库Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);
}

代码基本骨架和释放资源

finally语句块中关闭资源时需要保证资源一定释放,遵循从小到大关闭和分别try…catch的原则

  • 从小到大: 遵循从里到外即先开启的后关闭
  • 分别try..catch : 当一起try时如果关闭的第一个资源就出现问题,此时会直接进入catch语句块,那么后面的资源就不会关闭
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;public class JDBCTest01{public static void main(String[] args){Connection conn = null;//PreparedStatement ps = null;Statement stmt = null;ResultSet rs = null;try{//1、创建并注册驱动//2、获取连接//3、获取数据库操作对象(Statement专门执行sql语句的)//4、执行sql//5、处理查询结果集}catch(SQLException e){e.printStackTrace();}finally{//6、释放资源if(rs != null){try{rs.close();}catch(Exception e){e.printStackTrace();}}try{if(stmt != null){stmt.close();}}catch(SQLException e){e.printStackTrace();}try{if(conn != null){conn.close();}}catch(SQLException e){e.printStackTrace();}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API无代码开发让尘锋SCRM与营销系统集成,提高电商平台客服效率

API无代码开发的力量 随着电商平台业务的日益增长&#xff0c;客服系统的效率和响应速度成为了企业关注的焦点。API无代码开发的出现&#xff0c;为企业提供了一个高效的解决方案。API(Application Programming Interface&#xff0c;应用编程接口)允许不同的软件系统之间进行有…

C++ IO库

IO类 IO对象不能拷贝和赋值 iostream 表示形式的变化&#xff1a; 将100转换成二进制序列 然后格式化输出 x,y共用一块内存 输出的时候用不同的方式解析同一块内存 操作 格式化&#xff1a;内部表示转换为相应字节序列 缓存&#xff1a;要输出的内容放到缓存 编码转换&…

Linux 防火墙,了解就好

目录 安全技术 防火墙的分类 按保护范围划分 按实现方式划分 按网络协议划分 应用层防火墙&#xff08;7层&#xff09; 防火墙的工作原理 linux防火墙的基本认识 防火墙工具介绍 1.iptables 2.firewalld 3.nftables 安全技术 —— 入侵检测系统&#xff08;Intru…

【Java基础系列】BigDecimal入门

一.基本介绍 1.什么是 BigDecimal? BigDecimal 是 Java 中的一个类&#xff0c;用于表示任意精度的十进制数。它属于 java.math 包&#xff0c;并提供了高精度的浮点数运算。与基本数据类型的浮点数&#xff08;如 float 和 double&#xff09;不同&#xff0c;BigDecimal 可…

Xilinx Zynq-7000系列FPGA多路视频处理:图像缩放+视频拼接显示,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解HLS 图像缩放介绍Video Mixer介绍 4、vivado工程介绍PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他…

【投稿优惠|稳定出版】2023年信息科学和大数据应用国际会议 (ICISBDA 2023)

2023年信息科学和大数据应用国际会议 (ICISBDA 2023&#xff09; 2023 International Conference on Information Science and Big Data Applications &#xff08;ICISBDA 2023&#xff09; 一、会议简介 &#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&…

Tensorflow的日志log记录

if OUTPUT_GRAPH:tf.summary.FileWriter("logs/", sess.graph)自动创建文件夹log

分享一个大学生免费的资源网站(含考研资源,竞赛四六级)

今天不小心从其他地方链接到的网站&#xff0c;里面包含考考研资料&#xff0c;四六级相关的资料&#xff0c;重点都是免费的&#xff0c;部分资料可能需要登录或者关注公众号才可见&#xff0c;&#xff0c;网站链接了CSDN 能跳转到CSND, 网站地址 :忠哥资源共享http://jian…

Pandas时序数据分析实践—基础(1)

目录 1. Pandas基本结构2. Pandas数据类型2.1. 类型概述2.1.1. 整数类型&#xff08;int&#xff09;&#xff1a;2.1.2. 浮点数类型&#xff08;float&#xff09;&#xff1a;2.1.3. 布尔类型&#xff08;bool&#xff09;&#xff1a;2.1.4. 字符串类型&#xff08;object&a…

Android 源码编译

一&#xff0c;虚拟机安装 ​ 1.1 进入https://cn.ubuntu.com/download中文官网下载iso镜像 1.2 这里我们下载Ubuntu 18.04 LTS 1.3虚拟VM机安装ubuntu系统&#xff0c;注意编译源码需要至少16G运行内存和400G磁盘空间&#xff0c;尽量设大点 二 配置编译环境 2.1 下载andr…

C++ day50 动态规划

题目1&#xff1a;123 买卖股票的最佳时机Ⅲ 题目链接&#xff1a;买卖股票的最佳时机Ⅲ 对题目的理解 prices[i]表示股票在第i天的价格&#xff0c;最多可以完成两笔交易&#xff0c;不能同时进行多笔交易 可以买卖一次&#xff0c;两次&#xff0c;也可以不买卖 动态规划…

C++-类和对象

目录 一.C语言和C的区别 二.类的引入 三.类的定义 1.类的定义 2.类的成员方法的两种定义方式&#xff1a; 3.类的成员变量的定义 四.类的访问限定符及封装 1.访问限定符 五.面向对象的三大特征 1.面向对象的三大特征分别是什么 2.封装 六.类的作用域 七.创建类对象 1.类…

Leetcode.330 按要求补齐数组

题目链接 Leetcode.330 按要求补齐数组 hard 题目描述 给定一个已排序的正整数数组 n u m s nums nums &#xff0c;和一个正整数 n n n 。从 [ 1 , n ] [1, n] [1,n] 区间内选取任意个数字补充到 n u m s nums nums 中&#xff0c;使得 [ 1 , n ] [1, n] [1,n] 区间内的…

CAN 一: CAN基础知识介绍

1、CAN介绍 1.1、什么是CAN? (1)CAN&#xff08;Controller Area Network:控制器局域网&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。为满足汽车产业的“减少线束的数量”、“通过多个LAN&#xff0c;进行大量数据的高速通信”的需求。 (2)CAN总线的发展历史&a…

纯代码wordpress主题禁止复制粘贴文章内容的方法

很多站长&#xff0c;尤其是新手站长&#xff0c;通常都是内容的搬运工&#xff0c;那我们如何来扼制这些复制他人网站内容且不保留转载链接和署名这种不道德行为&#xff0c;那我们可以通过代码禁用在网站左右复制或是右健功能&#xff0c; 今天大挖就来给大家说说在wordpress…

【LeetCode】每日一题 2023_12_2 拼车(模拟/差分)

文章目录 刷题前唠嗑题目&#xff1a;拼车题目描述代码与解题思路学习大佬题解 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;拼车 题目链接&#xff1a;1094. 拼车 题目描述 代码与解题思路 func carPooling(trips [][]int…

【Linux】第二十四站:模拟实现C语言文件标准库

文章目录 一、实现细节1.需要实现的函数2.fopen的实现3.fclose4.fwrite5.测试6.缓冲区的实现7.FILE中缓冲区的意义 二、完整代码 一、实现细节 1.需要实现的函数 #include "mystdio.h"int main() {_FILE* fp _fopen("test.txt","w");if(fp N…

超大规模集成电路设计----基本概念(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----基本概念&#xff08;二&#xff09; 简短的历史回顾(A Brief Historical Perspective)第…

观察者设计模式

package com.jmj.pattern.observer;/*抽象观察者类*/ public interface Observer {void update(String message);}package com.jmj.pattern.observer;/*** 抽象主题角色*/ public interface Subject {//添加观察者对象void attach(Observer observer);//删除订阅者void detach(…

LeetCode(51)简化路径【栈】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 简化路径 1.题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff…