JDBC1(JDBC相关类与接口 ​连接mysql数据库​ 测试 不同数据库厂商实现-MySQL和Oracle)

目录

一、JDBC

1. JDBC相关类与接口

1.1 DriverManager

1.2 Connection

1.3 Statement

4.ResultSet

2. JDBC工作原理

二、连接mysql数据库

1. 导入jar包

2. 使用DriverManager加载驱动类

3. Connection接口

4. Statement接口

5. ResultSet接口 

​编辑

6. 关闭并释放资源 

三、测试

1. 连接测试

2. 添加测试

3. 修改测试

4. 查询测试

四、不同数据库厂商实现-MySQL和Oracle 

MySQL实现

Oracle实现


一、JDBC

  • Java Database Connectivity:Java访问数据库的解决方案
  • JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。
  • JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数据库厂商实现无关,从而在不同数据库之间轻易的进行切换 

1. JDBC相关类与接口

  • Driver 接口:加载驱动程序。
  • DriverManager 类:装人所需的 JDBC 驱动程序,编程时调用它的方法来创建连接。
  • Connection 接口:编程时使用该类对象创建 Statement 对象。
  • Statement 接口:编程时使用该类对象得到 ResultSet 对象。
  • ResultSet 类:负责保存 Statement 执行后所产生的查询结果。

1.1 DriverManager

  • DriverManager:驱动管理对象
  • 注册驱动(告诉程序该使用哪一个数据库驱动)
    • 在com.mysql.jdbc.Driver类中存在静态代码块(通过查看源码发现)
      //这是com.mysql.jdbc.Driver的静态代码块,只要使用这个类,就会执行这段代码
      //而Class.forName("com.mysql.jdbc.Driver")就正好使用到了这个类
      static {
      	try {
      		java.sql.DriverManager.registerDriver(new Driver());
      	} catch (SQLException E) {
      		throw new RuntimeException("Can't register driver!");
      	}
      }
      

    • 注意:我们不需要通过DriverManager调用静态方法registerDriver(),因为只要Driver类被使用,则会执行其静态代码块完成注册驱动

    • 所以后边我们其实可以省略注册驱动的步骤(可以注释掉上个案例的注册驱动的步骤,也可以查询到数据)
    • mysql5之后可以省略注册驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
  • 获取数据库连接(获取到数据库的连接并返回连接对象)

    • static Connection getConnection(String url, String user, String password);
      • 返回值:Connection数据库连接对象
      • 参数
        • url:指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
        • user:用户名
        • password:密码

1.2 Connection

  • Connection:数据库连接对象
    • 获取执行者对象
      • 获取普通执行者对象:Statement createStatement();
      • 获取预编译执行者对象:PreparedStatement prepareStatement(String sql);
    • 管理事务
      • 开启事务:setAutoCommit(boolean autoCommit); 参数为false,则开启事务。
      • 提交事务:commit();
      • 回滚事务:rollback();
    • 释放资源
      • 立即将数据库连接对象释放:void close();

1.3 Statement

  • Statement:执行sql语句的对象
    • 执行DML语句:int executeUpdate(String sql);
      • 返回值int:返回影响的行数
      • 参数sql:可以执行insert、update、delete语句。
    • 执行DQL语句:ResultSet executeQuery(String sql);
      • 返回值ResultSet:封装查询的结果
      • 参数sql:可以执行select语句。
    • 释放资源
      • 立即将执行者对象释放:void close();

4.ResultSet

  • ResultSet:结果集对象
    • 判断结果集中是否还有数据:boolean next();
      • 有数据返回true,并将索引向下移动一行
      • 没有数据返回false
    • 获取结果集中的数据:XXX getXxx(“列名”);
      • XXX代表数据类型(要获取某列数据,这一列的数据类型)
      • 例如:String getString(“name”); int getInt(“age”);
    • 释放资源
      • 立即将结果集对象释放:void close();

2. JDBC工作原理

二、连接mysql数据库

1. 导入jar包

  1. 创建一个 lib 目录
  2.  将mysql-connector-java-8.0.15驱动复制进去
  3.  右键添加路径 Eclipse: Build Path

2. 使用DriverManager加载驱动类

  • 加载驱动类
  • 通过Class.forName( )方法(反射) 完成驱动类的注册

找到驱动类 右键复制全路径

3. Connection接口

根据URL连接参数找到与之匹配的Driver对象, 调用其方法获取连接

注:Connection只是接口!真正的实现是数据库厂商提供的驱动包完成的。

jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT

4. Statement接口

Statement用于执行SQL语句

注:不同的SQL语句,要调用不同的方法来执行。

Statementstmt = conn.createstatement();

int count= stmt.executeUpdate(sql);
ResultSet rs=stmt.executeQuery(sql);

Statement用于执行DML

int count = stmt.executeUpdate(sq1);

Statement用于执行DQL

ResultSet rs =stmt.executeQuery(sql);

5. ResultSet接口 

Statement用于执行DQL

ResultSet rs =stmt.executeQuery(sql);

执行查询SQL语句后返回的结果集,由 ResultSet接口接收。

常用处理方式:遍历/判断是否有结果

String sql="select *from emp";
ResultSet rsstmt.executeQuery(sql);

查询结果存放在ResultSet对象的一系列行中

  • ResultSet对象的最初位置在行首
  • ResultSet.next()方法用来在行间移动
  • ResultSet.getXXX()方法用来取得字段的内容

遍历ResultSet

while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getstring("ename")

System.out.println(empno+","+ename);
}

6. 关闭并释放资源 

数据库操作执行完毕以后要释放相关资源

  • Connection 
  • Statement
  • ResultSet
rs.close();
stmt.close();
Conn.close();

三、测试

1. 连接测试

public class TestConn {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. 加载驱动 com.mysql.cj.jdbc.Driver.class
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2. 获取连接对象 url
		String url = "jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT";
		String user = "root";
		String pwd = "123456";

		Connection conn = DriverManager.getConnection(url, user, pwd);

		// 测试
		System.out.println(conn);

		// 3. 释放资源
		conn.close();
		
		

	}

测试成功

2. 添加测试

public class TestAdd {
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		// 1. 加载驱动
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2. 获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT",
				"root", "123456");

		// 3. 创建一条sql语句
		String sql = "insert into student(sname,birthday,ssex,classid) values('凹凸曼','1999-4-4','男',1)";

		// 3.1 创建执行sql语句的对象
		Statement statement = conn.createStatement();

		// 3.2 执行sql语句
		int ret = statement.executeUpdate(sql);

		// 逻辑
		if (ret > 0) {
			System.out.println("添加成功");
		} else {
			System.out.println("添加失败");
		}

		// 4. 释放资源 JDBC资源都是先获取的后释放
		statement.close();
		conn.close();

	}

 测试成功

3. 修改测试

public class TestUpdate {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		Scanner input = new Scanner(System.in);

		// 1. 加载驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2. 获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT",
				"root", "123456");

		// 3. sql语句
		System.out.println("要修改哪个学生,请写出编号:");
		int sid = input.nextInt();
		System.out.println("修改学生姓名:");
		String sname = input.next();
		System.out.println("修改学生生日(yyyy-MM-dd):");
		String bir = input.next();
		System.out.println("修改学生性别:");
		String sex = input.next();
		System.out.println("修改学生班级编号:");
		int classid = input.nextInt();

		String sql = "update student set sname='" + sname + "',birthday='" + bir + "'," + "ssex='" + sex + "',classid="
				+ classid + " where sid =" + sid;

		Statement statement = conn.createStatement();
		int ret = statement.executeUpdate(sql);

		if (ret > 0) {
			System.out.println("修改成功");
		} else {
			System.out.println("修改失败");
		}

		// 释放资源
		statement.close();
		conn.close();
	}

 测试成功

4. 查询测试

public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. 加载驱动
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2. 获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT", "root",
				"123456");

		// 3. sql
		String sql = "select birthday,sid,classid,sname,ssex from student";

		Statement statement = conn.createStatement();

		ResultSet rs = statement.executeQuery(sql);

		// 解析结果集
		while (rs.next()) {
//					int sid = rs.getInt(1); // jdbc相关索引都是从1开始
//					String sname = rs.getString(2);
//					Date bir = rs.getDate(3);
//					String sex = rs.getString(4);
//					int classid = rs.getInt(5);

			// 推荐
			int sid = rs.getInt("sid");
			Date bir = rs.getDate("birthday");
			String sname = rs.getString("sname");
			String sex = rs.getString("ssex");
			int classid = rs.getInt("classid");

			System.out.println(sid + sname + bir + sex + classid);
		}

		// 4.释放资源
		rs.close();
		statement.close();
		conn.close();
	}

四、不同数据库厂商实现-MySQL和Oracle 

MySQL实现

  1. 下载对应的数据库驱动jar包 mysql-connector-java-5.0.4-bin.jar
  2. 将驱动jar包加载到项目中 Eclipse:BuildPath
  3. 加载驱动类 Class.forName(“com.mysql.jdbc.Driver”)

Oracle实现

  1. 下载对应的数据库驱动jar包 ojdbc6.jar/ojdbc14.jar
  2. 将驱动jar包加载到项目中 Eclipse:BuildPath
  3. 加载驱动类 Class.forName(“oracle.jdbc.OracleDriver”)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主成分分析(PCA)详解与Python实现

1. 引言 主成分分析(PCA)是一种统计方法,它通过正交变换将一组可能相关的变量转换成一组线性不相关的变量,这些不相关变量称为主成分。PCA常用于降维、数据压缩和模式识别等领域。 喜欢的伙伴们点个关注哦~~❤❤❤ 2. 理论基础…

第15周:RNN心脏病预测

目录 前言 二、前期准备 2.1 设置GPU 2.2 导入数据 2.2.1 数据介绍 2.2.2 导入代码 2.2.3 检查数据 三、数据预处理 3.1 划分训练集与测试集 3.2 标准化 四、构建RNN模型 4.1 基本概念 4.2 搭建代码 五、编译模型 六、训练模型 七、模型评估 总结 前言 &#…

掌握 Python 中 isinstance 的正确用法

👋 简介 isinstance() 函数用于判断一个对象是否是一个特定类型或者在继承链中是否是特定类型的实例。它常用于确保函数接收到的参数类型是预期的。 📖 正文 1 语法 isinstance(object, classinfo) object参数是要检查的对象;classinfo参数…

幻兽帕鲁联机延迟高、无法联机、联机卡顿?这样解决

幻兽帕鲁是一款超人气的冒险游戏,该作曾被讽刺为抄袭怪、缝合怪,但是依旧架不住其在全球的爆火的架势,近期该作更新了游戏内的首个大型地图,并且还新增了区域系统上限、多人专用斗技场和部分游玩内容优化,也吸引了很多…

昇思25天学习打卡营第03天 | 张量 Tensor

昇思25天学习打卡营第03天 | 张量 Tensor 文章目录 昇思25天学习打卡营第03天 | 张量 Tensor张量张量的创建张量的属性Tensor与NumPy转换稀疏张量CSRTensorCOOTensor 总结打卡 张量 张量(Tensor)是一种类似于数组和矩阵的特殊数据结构,是神经…

AI智能在Type-C领域的应用

随着科技的飞速发展,Type-C接口凭借其卓越的性能和广泛的应用场景,已成为现代电子设备中不可或缺的一部分。而AI智能技术的兴起,为Type-C领域带来了革命性的变革,推动了其功能的进一步完善和应用领域的拓展。本文将探讨AI智能在Ty…

Redis缓存管理机制

在当今快节奏的数字世界中,性能优化对于提供无缝的用户体验至关重要。缓存在提高应用程序性能方面发挥着至关重要的作用,它通过将经常使用或处理的数据存储在临时高速存储中来减少数据库负载并缩短响应时间,从而减少系统的延迟。Redis 是一种…

基于深度学习的水果蔬菜检测识别系统(Python源码+YOLOv8+Pyqt5界面+数据集+训练代码 MX_004期)

系统演示: 基于深度学习的水果蔬菜检测识别系统 界面图: 技术组成: 深度学习模型(YOLOv8): YOLOv8是基于YOLO系列的目标检测模型,具有较快的检测速度和良好的准确率,适合于实时应用场…

在 Java 中的使用Selenium 测试框架

Selenium 测试框架:在 Java 中的使用 Selenium 测试框架就是这样一个强大的工具,它为 Web 应用的自动化测试提供了全面且高效的解决方案。 一、Selenium 简介 Selenium 是一个开源的自动化测试工具集,专门用于测试 Web 应用程序。它支持多…

聊一聊质量测试框架

质量测试框架的概述: 质量测试框架是一个为测试人员提供指导、工具和技术的系统,用于确保软件满足预定的质量标准和用户需求。它涵盖了测试计划、测试用例设计、测试执行、结果分析和测试报告等多个方面。 质量测试框架相关术语: 外部性质的…

解决OneDrive “拒绝访问文件” 问题

问题描述: 在尝试将其他文件拖入oneDrive或是打开OneDrive中的文件时。出现如下报错: 拒绝访问文件 无法访问XXXXXXX中的文件。可能已移动或删除了此文件,或者受制于文件权限而不能访问。 ERR_ACCESS_DENIED 解决办法: 1. 找到O…

【MySQL备份】Percona XtraBackup实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练:利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

论文笔记:MobilityGPT: Enhanced Human MobilityModeling with a GPT mode

1 intro 1.1 背景 尽管对人类移动轨迹数据集的需求不断增加,但其访问和分发仍面临诸多挑战 首先,这些数据集通常由私人公司或政府机构收集,因此可能因泄露个人敏感生活模式而引发隐私问题其次,公司拥有的数据集可能会暴露专有商…

侯捷C++面向对象高级编程(上)-6-三大函数:拷贝构造、拷贝复制、析构

1. 2.三个特殊函数 3.构造函数和析构函数 4.浅拷贝(系统默认仅把指针拷贝过去) 5.拷贝构造函数(深拷贝,拷贝的内容,重写string函数) 6.拷贝赋值

遇到多语言跨境电商系统源码问题?这里有解决方案!

从手机到电脑,从线下到线上,如今,跨境电商正在打破地域界限,成为全球贸易的新引擎。在这个全球化的背景下,跨境电商平台的运营也面临着一系列的挑战,其中之一就是多语言问题。如果你遇到了多语言跨境电商系…

每日一题-字符串相加

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Solution { public:string addStrings(string num1, string num2) {//11123//从个位开…

基于偏微分方程模型的一维信号降噪(MATLAB)

自然界很多领域如天文、物理、生物、化学等的运动和状态的变化受多个因素影响&#xff0c;而偏微分方程恰好可以描述这种多变量问题&#xff0c;因此被引入科学研究是一种必然。偏微分方程早期的时侯用来描述机械物体和流体的自然运动和物理规律&#xff0c;且其应用领域不断拓…

【收藏】SaaS运营方法论:寻找合适的合作伙伴的四大方法

一、使用关键字研究工具查找您所在行业的相关博客、频道和网站 但是&#xff0c;根据你的业务规模和性质&#xff0c;如果你需要主动出击寻找合适的推广伙伴&#xff0c;而不仅限于让潜在合作伙伴找你&#xff0c;你可以使用关键字研究工具。 实话实说&#xff0c;最好的联盟营…

告别手工录入,企业财务凭证同步迈入智能新时代!

一、客户介绍 某金融租赁股份有限公司作为一家领先的金融租赁企业&#xff0c;一直秉持着创新驱动、服务至上的经营理念。随着业务的快速发展&#xff0c;该公司在财务管理和凭证管理方面遇到了新的挑战。为了更好地提升工作效率&#xff0c;降低运营成本&#xff0c;该公司决…

vue+js实现鼠标右键页面时在鼠标位置出现弹窗

首先是弹窗元素 <div class"tanchuang move-win1"id"tanchuang1"><el-button>111</el-button></div>然后在需要弹窗的地方监听点击事件&#xff0c;可以将这个方法写在页面载入事件中 // 获取弹窗元素 var tanchuang document.…