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

news2024/10/6 20:38:30

目录

一、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”)

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

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

相关文章

Drools开源业务规则引擎(一)- 安装与介绍

文章目录 [toc] Drools开源业务规则引擎(一)- 安装与介绍0.何为规则引擎1.Drools介绍1.1.依赖模块1.2.规则引擎 2.Drools安装2.1.依赖导入2.2.规则的输入和输出类型输入类型输出类型 2.3.创建规则文件2.4.构建可执行规则库2.5.执行结果: 3.Dr…

CesiumJS【Basic】- #040 绘制渐变线(Primitive方式)

文章目录 绘制渐变线(Primitive方式)1 目标2 代码2.1 main.ts绘制渐变线(Primitive方式) 1 目标 使用Primitive方式绘制渐变线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

【ubuntu18.04】 局域网唤醒 wakeonlan

ai服务器经常因为断电,无法重启,当然可以设置bios 来电启动。 这里使用局域网唤醒配置。 自动开关机设置 工具:ethtool 端口 : enp4s0 Wake-on: d 表示禁用Wake-on: g 激活 ,例如:ethtool -s eth0 wol g 配置/etc/rc.local ,这个文件不存在,自己创建工具下载 tengxun W…

机器学习项目-基于随机森林的航空公司用户满意度分析

摘要 ​ 航空旅行是人们出行的常用方式之一,乘客对于航空公司的服务质量有着较高的要求。满意度是衡量服务质量的重要指标,因此预测航空公司乘客的满意度对于提高服务质量具有重要意义。 ​ 近年来,机器学习在预测领域得到了广泛应用。机器…

机器人入门路线及参考资料(机器人操作方向)

机器人(操作方向)入门路线及参考资料 前言1 数理基础和编程2 机器人学理论3 计算机视觉4 机器人实操5 专攻方向总结Reference: 前言 随着机器人和具身智能时代的到来,机器人越来越受到大家的重视,本文就介绍了机器人(…

基于公有云部署wordpress

云平台选择 腾讯云 阿里云 华为云 项目部署 一、架构讲解 1.1、定义与组成 LNMP是Linux、Nginx、MySQL(或MariaDB)和PHP(或Perl、Python)的首字母缩写,代表在Linux系统下使用Nginx作为Web服务器,MySQL作为…

vue3 elementplus Springboot 商品系统,商城类后台管理案例源码

系统演示 项目获取地址 Springboot vue3 elementplus 商品管理系统 商城后台管理系统案例源码 附带系统演示,环境搭建教程,开发工具 技术栈:SpringBoot Vue3 ElementPlus MybatisPlus 开发工具:idea 后端构建工具:Maven 前端构建工具:vite 运行环境:Windows …

Linux基础IO操作详解

C文件IO相关接口 fopen函数 pathname: 要打开的文件名字符串mode: 访问文件的模式 模式描述含义“r”读文件不存在失败返回null“r”读写文件不存在打开失败返回null,文件存在则从头开始覆盖现有的数据(不会清空数据)“w”写文件不存在创建…

[leetcode]文件组合

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> fileCombination(int target) {vector<vector<int>> vec;vector<int> res;int sum 0, limit (target - 1) / 2; // (target - 1) / 2 等效于 target /…

[机器学习]-4 Transformer介绍和ChatGPT本质

Transformer Transformer是由Vaswani等人在2017年提出的一种深度学习模型架构&#xff0c;最初用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;特别是机器翻译。Transformer通过自注意机制和完全基于注意力的架构&#xff0c;核心思想是通过注意力来捕捉输入序列…

RuoYi-Vue项目后端增加自己的模块,要注意的点,只看我这一片就够了。

若依版本&#xff1a; RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 背景&#xff1a; 后端想自己增加一个模块&#xff0c;但是包路径…

气膜建筑照明:吊式与落地灯杆的利弊—轻空间

气膜建筑以其独特的设计和高效的功能性&#xff0c;广泛应用于体育场馆、工厂等各类场所。在这些气膜建筑中&#xff0c;照明方式的选择尤为重要。尽管有多种照明方式可供选择&#xff0c;但常用的反射光源形式在气膜建筑中尤为普遍。轻空间将重点介绍两种常用的反射照明方式&a…

内容营销专家刘鑫炜:越是赚不到钱,越要加大推广力度

这两天&#xff0c;一位跟我们有长期合作关系的小微企业主老苏问我。 “现在钱这么不好赚&#xff0c;品牌推广应该怎么做&#xff1f;” 我说&#xff1a;“这是好机会&#xff0c;加大投放力度&#xff01;” 老苏很是不解&#xff0c;这时候不开源节流&#xff0c;还要加…

激光粒度分析仪计量校准规范:确保测量精度的关键

激光粒度分析仪作为现代科研与工业生产中不可或缺的分析工具&#xff0c;广泛应用于陶瓷、土壤、制药、建材、环保等众多领域。 其通过激光散射原理&#xff0c;快速准确地测量颗粒材料的粒度分布&#xff0c;为材料科学研究、产品质量控制及环境保护等提供了强有力的技术支持…

绘唐3一键追爆款文刻创作聚星文社

聚星文社是一个中国的文学社交平台&#xff0c;提供了一个让作家和读者相互交流和分享作品的平台。 在聚星文社&#xff0c;作家可以在平台上发布自己的作品&#xff0c;获得读者的阅读和评论&#xff0c;同时也可以与其他作家进行交流与学习。 点击下载即可 读者可以在平台上…

视频号视频怎么下载保存到手机,视频号视频如何下载到电脑本地

在数字化浪潮的推动下&#xff0c;视频号成为了我们获取信息、分享生活的重要平台。但有时候&#xff0c;我们遇到一些精彩的内容&#xff0c;想要保存下来以便日后观看&#xff0c;却发现视频号并不提供直接的下载功能。下面我就来为大家详细介绍视频号视频下载的方法&#xf…

maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包

一 、springboot jar包 maven的pom文件 1 在resources下放了一些文件想打进去jar包 2 在lib下放了其他稀奇古怪jar包文件想打进去jar包 编写如下引入jar <build><!-- 打包名称 --><finalName>${project.artifactId}</finalName><resources><…

【C++】C++指针在线程中调用与受保护内存空间读取方法

引言 在C的多线程编程中&#xff0c;正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时&#xff0c;对受保护内存空间的访问必须谨慎处理&#xff0c;以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…

CV每日论文--2024.6.27

1、Text-Animator: Controllable Visual Text Video Generation 中文标题&#xff1a;Text-Animator&#xff1a;可控视觉文本视频生成 简介&#xff1a;视频生成是各行业中具有重要价值但同时也极具挑战性的任务,例如在游戏、电子商务和广告领域。在文本到视频(T2V)生成中,一…