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.classClass.forName("com.mysql.cj.jdbc.Driver");// 2. 获取连接对象 urlString 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. sqlString 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.mzph.cn/diannao/38930.shtml

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

相关文章

【鸿蒙学习笔记】基础组件Progress:进度条组件

官方文档:Progress 目录标题 作用最全属性迭代追加进度赋值风格样式 作用 进度条组件 最全属性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 颜色.width(200)// 大小.height(50)// 高度.value(50)// 进度可更…

视频转音频:怎样提取视频中的音频?6个提取音频的小技巧(建议收藏)

怎样提取视频中的音频?当我们想从视频中提取出声音时,通常会遇到很多问题。无论是想单独提取出视频里的音频,还是把它转成方便储存或者分享的音频格式,这都会涉及到视频转音频的一个需求。因此,在这篇指南里&#xff0…

Spring Cloud - 项目搭建

1、新建maven项目 新建maven项目,该项目为主项目 1、新建maven项目 2、设置项目类型 3、选择项目原型 4、设置参数 5、等着完成 2、设置项目信息 1、右键,项目属性 2、设置jdk版本 3、选择jdk17 4、修改编译版本 5、右键项目,选择maven->u…

【吊打面试官系列-MyBatis面试题】模糊查询 like 语句该怎么写?

大家好&#xff0c;我是锋哥。今天分享关于 【模糊查询 like 语句该怎么写?】面试题&#xff0c;希望对大家有帮助&#xff1b; 模糊查询 like 语句该怎么写? 第 1 种&#xff1a;在 Java 代码中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

技术派全局异常处理

前言 全局的异常处理是Java后端不可或缺的一部分&#xff0c;可以提高代码的健壮性和可维护性。 在我们的开发中&#xff0c;总是难免会碰到一些未经处理的异常&#xff0c;假如没有做全局异常处理&#xff0c;那么我们返回给用户的信息应该是不友好的&#xff0c;很抽象的&am…

【一篇文章带你搞懂--拉链表!!!拉链表的原理是什么!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下拉链表的原理以及使用,希望对大家有所帮助。 大家可以关注我下方的链接更多优质文章供学习参考。 &#x1f49e;&#x1f49e;代码是你的画笔&#xff0c;创新是你…

Flink 运行时架构

Flink 运行时的组件 作业管理器&#xff08;JobManager&#xff09;资源管理器&#xff08;ResourceManager&#xff09;任务管理器&#xff08;TaskManager&#xff09;分发器&#xff08;Dispatch&#xff09; JobManager 控制一个应用程序执行的主进程&#xff0c;也就是说…

LiveNVR监控流媒体Onvif/RTSP用户手册-概览:CPU使用、存储使用、带宽使用、负载、内存使用、通道统计

LiveNVR监控流媒体Onvif/RTSP用户手册-概览:CPU使用、存储使用、带宽使用、负载、内存使用、通道统计 1、概览1.1、通道统计1.2、负载1.3、CPU使用1.4、存储使用1.5、带宽使用1.6、内存使用 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、概览 1.1、通道统计 显示可用通道&…

Lipschitz 连续,绝对连续

1. Lipschitz 连续 经常听到这个名词&#xff0c; Lipschitz 连续比普通连续更强&#xff0c;不仅要求函数连续&#xff0c;还要求函数的梯度小于一个正实数。 在单变量实数函数上的定义可以是&#xff1a; 对于定义域内任意两个 x 1 x_1 x1​ and x 2 x_2 x2​, 存在一个…

云计算与生成式AI的技术盛宴!亚马逊云科技深圳 Community Day 社区活动流程抢先知道!

小李哥最近要给大家分享7月7日在深圳的即将举办的亚马逊云科技生成式AI社区活动Community Day &#xff0c;干货很多内容非常硬核&#xff0c;不仅有技术分享学习前沿AI技术&#xff0c;大家在现场还可以动手实践沉浸式体验大模型&#xff0c;另外参与现场活动还可以领取诸多精…

顺序表(C语言详细版)

1. 线性表 线性表(lina list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...... 线性表在逻辑上是线性结构&#xff0c;也就是说连续的一条直线。但是在物理结构上并…

一文汇总全球热门新闻API

新闻API通过提供快速、准确和全面的新闻内容&#xff0c;已经成为现代社会不可或缺的一部分&#xff0c;对人们的生活、工作环境和科技发展产生了深远的影响。新闻API使人们能够快速获取来自世界各地的实时新闻和信息&#xff0c;提高了信息的可访问性。通过新闻API&#xff0c…

C++算法学习心得八.动态规划算法(6)

1.最长递增子序列&#xff08;300题&#xff09; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&…

Redis分布式集群部署

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…

关于电商平台分类||电商平台商品分类接口|电商平台商品数据

电商平台 做电商&#xff0c;则要有电商平台&#xff0c;一个为 企业 或 个人 提供网上交易洽谈的平台。. 企业电子商务平台是建立在 Internet 网上进行商务活动的虚拟网络空间和保障商务顺利运营的管理环境&#xff1b;是协调、整合 信息流 、货物流、 资金流 有序、关联、高效…

会员信息一键同步!微盟与客如云联手打造智能服务新体验!

客户介绍 某房地产开发有限公司&#xff0c;自成立以来一直深耕于房地产行业&#xff0c;凭借卓越的开发实力和前瞻性的市场眼光&#xff0c;成为了业界备受瞩目的企业。多年来&#xff0c;该公司始终坚持“品质至上&#xff0c;客户为先”的经营理念&#xff0c;致力于为客户…

掌握React与TypeScript:从零开始绘制中国地图

最近我需要使用reactts绘制一个界面&#xff0c;里面需要以中国地图的形式展示区块链从2019-2024年这五年的备案以及注销情况&#xff0c;所以研究了一下这方面的工作&#xff0c;初步有了一些成果&#xff0c;所以现在做一些分享&#xff0c;希望对大家有帮助&#xff01; 在这…

手把手搞定报名亚马逊科技认证

引言 亚马逊云科技认证考试为我们这些技术从业者提供了提升专业技能的机会。无论选择线上还是线下考试&#xff0c;每种方式都有其独特的优势和挑战。选择合适的考试方式将帮助我们更好地展示自己的技术水平。以下是我对不同考试方式的优缺点介绍&#xff0c;以及各科目的考试…

【pytorch12】什么是梯度

说明 导数偏微分梯度 梯度&#xff1a;是一个向量&#xff0c;向量的每一个轴是每一个方向上的偏微分 梯度是有方向也有大小&#xff0c;梯度的方向代表函数在当前点的一个增长的方向&#xff0c;然后这个向量的长度代表了这个点增长的速率 蓝色代表比较小的值&#xff0c;红色…

七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3

前言 llama 3出来后&#xff0c;为了通过paper-review的数据集微调3&#xff0c;有以下各种方式 不用任何框架 工具 技术&#xff0c;直接微调原生的llama 3&#xff0c;毕竟也有8k长度了 效果不期望有多高&#xff0c;纯作为baseline通过PI&#xff0c;把llama 3的8K长度扩展…