JDBC的概念 ,核心API的介绍 , 注册驱动介绍

第一章 JDBC

1、JDBC的概念

目标

  1. 能够掌握JDBC的概念
  2. 能够理解JDBC的作用

讲解

客户端操作MySQL数据库的方式

  1. 使用第三方客户端来访问MySQL:SQLyog、Navicat

  2. 使用MySQL自带的命令行方式

  3. 通过Java来访问MySQL数据库,今天要学习的内容

    如何通过Java代码去操作数据库呢?

    Java中给我们提供专门的一套技术,可以通过其中的某些类和接口操作任何的数据库,这个技术就是今天要学习的JDBC。

    什么是JDBC:Sun公司为了简化、统一对数据库的操作,定义了一套java操作数据库的接口的规范,称之为JDBC。JDBC的全称为:java database connection (java和 数据库的连接 ) 就是使用java代码来操作数据库。
    JDBC的作用:Java通过JDBC就可以操作数据库

JDBC的由来
  1. java程序依赖于jdk,jdk和数据库是2个不同的应用程序,那他们是怎么进行访问的呢?

    要想搞清楚这个问题,我们必须了解下电脑是如何和其他硬件设备交互的。假设我们电脑安装完系统之后是一个无驱动的操作系统。那么当我们电脑想播放声音,即安装音响,必须得安装声卡驱动。同时电脑想和u盘硬件进行交互,也必须在电脑上安装对应的驱动。如果驱动安装失败,很显然他们是不能正常的交互的。这个安装驱动的其实就是为了定义他们两个相互交互的规则。只有统一了规则,才能交互。

    具体的解释如下图所示:

    在这里插入图片描述

同理:java程序想和数据库进行交互,也必须得安装数据库驱动,这样才能交互。但是,我们数据库有多种,这样就会导致不同的数据库具备不同的数据库驱动。

从而会导致在开发中作为程序员由于安装不同的数据库驱动而浪费很多时间,同时和数据库交互的java代码也得重新书写,这样都会导致效率很低。所以说,sun公司就会制定一套规则,这套规则就是用来java程序连接数据库的,然后各大数据库厂商只需要实现这个规则即可。这个规则就是jdbc技术,即接口。

换句话就是说,就是数据库厂商使用sun公司提供的接口,然后作为java程序员实现接口中的方法即可。接口中的方法体由具体的数据库厂商来实现。

在这里插入图片描述

JDBC的好处
  1. 我们只需要会调用JDBC接口中的方法即可,使用简单
  2. JDBC有关的类和接口:都在java.sql 和 javax.sql(扩展包) 包下
  3. 方法体由具体的数据库厂商来完成的
  4. 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库

小结

  1. 说出JDBC的概念?Java数据库连接(Java操作数据库的标准规范)
  2. 说出JDBC的作用?Java通过JDBC就可以操作数据库

2、JDBC核心API的介绍

目标

能够理解JDBC四个核心对象

讲解

JDBC会用到的包
  1. java.sql:JDBC访问数据库的基础包,在JavaSE中的包。如:java.sql.Connection
  2. javax.sql: JDBC访问数据库的扩展包
  3. 数据库的驱动,各大数据库厂商来实现。如:MySQL的驱动:com.mysql.jdbc.Driver
JDBC四个核心对象

这几个类都是在java.sql包中

  1. DriverManager(类): 数据库驱动管理类。这个类的作用:1)注册驱动; 2)创建java代码和数据库之间的连接,即获取Connection接口;
  2. Connection(接口): 是一个接口, 建立数据库连接的一个接口。作用:建立数据库和java代码之间的连接。表示与数据库创建的连接
  3. Statement(接口)、PreparedStatement(接口) (解决安全隐患问题,比如sql注入的问题): 数据库操作,向数据库发送sql语句。执行SQL语句的对象
  4. ResultSet: 结果集或一张虚拟表。 Statement 发送sql语句,得到的结果 封装在 ResultSet 中。
    在这里插入图片描述
JDBC访问数据库的步骤
  1. 由DriverManager注册驱动程序
  2. 创建和数据库的连接对象Connection
  3. 由客户端发送SQL语句给服务器执行,SQL语句封装成Statement对象
  4. 查询到的结果集封装成ResultSet对象
  5. 在客户端可以从ResultSet中取出数据,处理结果集
  6. 释放资源,关闭连接对象

小结

JDBC四个核心对象?

  1. DriverManager(类): 用于注册驱动和获取连接
  2. Connection(接口): 表示与数据库创建的连接
  3. Statement(接口): 执行SQL语句的对象
  4. ResultSet(接口): 结果集或一张虚拟表

3、JDBC注册驱动

Connection表示Java程序与数据库之间的连接,只有拿到Connection才能操作数据库。

JDBC获取连接步骤

1.导入mysql驱动Jar包
2.注册驱动
3.获取连接

目标

能够导入mysql驱动Jar包

能够通过JDBC注册数据库驱动

讲解

准备工作

1、确定启动mysql数据库。

此电脑-------》右键管理-------》选择服务

在这里插入图片描述

找到MySQL服务,查看MySQL服务是否已经启动了,如果启动是灰色,说明已经启动了。

在这里插入图片描述

2、创建数据库和创建user表,并添加信息,sql语句如下。

打开可视化工具,将如下sql语句添加到可视化工具中,并执行以下sql语句即可。

在这里插入图片描述

-- 创建数据库
create database day04_db;-- 切换数据库
use day04_db;-- 用户表
create table user (id int primary key auto_increment,username varchar(30) unique not null,password varchar(30)
);insert into user(username, password) values('zhangsan','123');
insert into user(username, password) values('lisi','123');
insert into user(username, password) values('wangwu','123');select * from user;

执行结果:

在这里插入图片描述

导入驱动Jar包

在这里插入图片描述

1、新建项目day04,在项目day04上新建lib文件夹

在这里插入图片描述

2、将mysql驱动的jar包导入到lib文件夹下

在这里插入图片描述

3、在导入的mysql的jar包上右键,选择Add as Library…

在这里插入图片描述

注册驱动

我们Java程序需要通过数据库驱动才能连接到数据库,因此需要注册驱动。
MySQL的驱动的入口类是:com.mysql.jdbc.Driver
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

API介绍

java.sql.DriverManager类用于注册驱动。提供如下方法注册驱动

static void registerDriver(Driver driver)DriverManager 注册给定驱动程序。 

说明:

​ 1)执行完上述语句之后,DriverManager就可以管理mysql驱动了。

​ 2)当前的DriverManager.registerDriver(Driver driver);方法的参数是Driver,这是jdbc的一个接口,所以我们需要给定实现该接口的实现类。如果我们连接的是mysql数据库,那么需要导入mysql数据库提供的包,也就是com.mysql.jdbc.Driver; 下的Driver类。如果我们连接的是oracle数据库,那么需要导入oracle数据库提供的包。

使用步骤

1.DriverManager.registerDriver(驱动对象); 传入对应参数即可

案例代码
public class Demo01 {public static void main(String[] args) throws Exception {// 注册驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());}
}

说明:这里的new Driver()的类Driver就是来自mysql数据库。

通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册

public class Driver extends NonRegisteringDriver implements java.sql.Driver {static {try {// 自己自动注册java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}public Driver() throws SQLException {}
}

在这里插入图片描述

注意:使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());,存在以下方面不足

  1. 驱动被注册两次

使用Class.forName("com.mysql.jdbc.Driver");加载驱动,这样驱动只会注册一次

public class Demo01 {public static void main(String[] args) throws Exception {/*1)注册驱动使用的类是驱动管理类:DriverManager,使用该类中的静态方法:static void registerDriver(Driver driver) 向 DriverManager 注册给定驱动程序。真正注册驱动代码:  DriverManager.registerDriver(new Driver());2) static void registerDriver(Driver driver) 方法参数Driver是驱动接口,java.sql.Driver表示每个驱动程序类必须实现的接口。对于该参数我们都是创建该接口java.sql.Driver实现类对象,实现类由各大数据库厂商来提供,并且必须实现该驱动接口java.sql.Driver3) 真正注册驱动代码:  DriverManager.registerDriver(new Driver());注意:这里new Driver()创建的是mysql厂商定义的实现类//com.mysql.jdbc.Driver  属于mysql厂商的实现类//java.sql.Driver  属于sun公司定义的驱动接口public class com.mysql.jdbc.Driver implements java.sql.Driver {public Driver() throws SQLException {}static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}}4)为什么我们不使用代码: DriverManager.registerDriver(new Driver()); 注册呢,我们为什么这里使用代码:Class.forName("com.mysql.jdbc.Driver");的原因?原因:因为DriverManager.registerDriver(new Driver());注册了两次,而Class.forName("com.mysql.jdbc.Driver");只是注册了一次Class.forName("com.mysql.jdbc.Driver"); 就是将com.mysql.jdbc.Driver类加载到内存中,加载该类,就会执行该类的静态代码块:public class com.mysql.jdbc.Driver implements java.sql.Driver {//静态代码块,当前类一加载内存就执行static {try {//注册驱动的真正代码DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}}总结: Class.forName("com.mysql.jdbc.Driver");注册一次驱动原因,类com.mysql.jdbc.Driver加载内存中执行静态代码块然后注册驱动了5)为什么 我们自己书写该代码DriverManager.registerDriver(new Driver()); 注册两次?因为首先在执行代码:new com.mysql.jdbc.Driver() ,先将类com.mysql.jdbc.Driver加载到内存中执行静态代码块,注册一次驱动,然后这里又注册一次6)从jdbc4开始,我们第一步注册驱动不用我们程序员书写了,,底层在使用到com.mysql.jdbc.Driver类就注册了*/Class.forName("com.mysql.jdbc.Driver"); // 后期可以将"com.mysql.jdbc.Driver"字符串写在文件中.}
}

演示:Class.forName("包名.类名");会走这个类的静态代码块
在这里插入图片描述

通常开发我们使用Class.forName() 加载驱动。Class.forName("com.mysql.jdbc.Driver");会走Driver类的静态代码块。在静态代码块中注册一次驱动。
在这里插入图片描述

总结:注册MySQL驱动使用Class.forName("com.mysql.jdbc.Driver");

小结

  1. 导入mysql驱动Jar包

  2. 通过JDBC注册数据库驱动?

    Class.forName("com.mysql.jdbc.Driver");
    

    3.从jdk4.0开始,对于我们java开发工程师,第一步不用书写了,底层帮助我们使用com.mysql.jdbc.Driver类先注册驱动了.

    驱动必须注册,只是不用我们书写代码注册了。

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

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

相关文章

sed和awk

sed和awk 文章目录 sed和awksedawk grep就是查找文件中的内容,扩展正则表达式 sed sed是一种流编辑器,一次处理一行内容(增删改查) 如果只是展示,会放在缓冲区(模式空间),展示结束…

算法社区-从零开始构建(一)

好久没动笔了,一是要处理的东西很多,二则写出来未见得深刻,感觉沉淀得不够,太浅显的东西就没必要分享。 正好最近在研究算法层面的东西,感觉挺受用的,就想着把这些东西整理出来,有点像社区的雏形…

问题 C: Josephus问题(Ⅰ)

问题 C: Josephus问题(Ⅰ) 题目描述 n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针"一二"报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人…

高中数学:数列-解数列不等式问题的常用放缩技巧(重难点)

一、放缩技巧 技巧1 例题 证明:Sn<1 解: 变形 解: 由于第一种情况,我们证明了Sn<1,n≥1,是从第一项就开始放缩的。 发现,无法精确到 3 4 \frac{3}{4} 43​ 这时&am…

《2024年战略管理趋势报告》

本报告由Quantive发布。 《2024年战略管理趋势报告》这份报告深刻剖析了企业在策略管理上的当前状态、面临的挑战以及未来发展的趋势。报告指出,大多数组织在迅速适应市场变化方面存在困难,并且许多企业未能实现其战略目标,显示出策略制定与执行之间存在脱节。报告中不仅强调了…

【算法】单调队列 - 基础与应用-滑动窗口最大值

题目 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 思路 暴力:遍历一遍的过程中每次从窗口找到最大的数组&#…

【C语言小例程26/100】

题目&#xff1a;有一分数序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13...求出这个数列的前20项之和。 程序分析&#xff1a;请抓住分子与分母的变化规律。 程序源代码&#xff1a; #include <stdio.h>int ma…

React Suspense的原理

React Suspense组件的作用是当组件未完成加载时&#xff0c;显示 fallback 组件。那么 Suspense 是如何实现的呢&#xff1f;React 的渲染是通过 Fiber 进行的&#xff0c;Suspense 的更新机制也是要围绕 Fiber 架构进行的。Suspense 是由两部分组成&#xff0c;实际 UI 子组件…

0803功放3

1.甲乙类互补堆成功放&#xff0c; 理想12v t提供静态偏置&#xff0c;消去交越失真 2.12V Po(12)2/2RL 3.电压并联负反馈 并联减小输入电阻 电压减小输出电阻 4.-Rf/Ri 这个问题是工艺问题引起的&#xff0c;最早用PNP管用的锗管&#xff0c;后面硅工艺成熟后用的就是硅管&…

毫米波移动通信系统中的波束赋形— 基于码本的波束训练

基于码本的波束训练算法该方法在收发端都配置波束矢量的码本&#xff0c;通过波束搜索的方式发现最优的波束方向为了加快波束搜索的速度&#xff0c;往往采用逐步缩小搜索范围的方式加快搜索&#xff0c;可以将搜索算法的时间复杂度从O(N)降低到O(logN)&#xff0c;其中N表示码…

信创里程碑:TapData 人大金仓数据库产品完成兼容互认证,携手推进自主创新建设

近日&#xff0c;深圳钛铂数据有限公司&#xff08;以下简称钛铂数据&#xff09;自主研发的钛铂实时数据平台&#xff08;TapData Live Data Platform&#xff0c;TapData LDP&#xff09;与北京人大金仓信息技术股份有限公司&#xff08;以下简称“人大金仓”&#xff09; Ki…

基于单片机的智能浇花系统设计与实现

摘要: 设计了一种智能湿度感应浇花系统 。 系统以单片机 AT89S52 为控制芯片&#xff0c;利用 SLHT5-1 土壤湿度传感器来检测土壤的相对湿度&#xff0c;再通过单片机进行信息处理&#xff0c;采用模糊控制方法&#xff0c;输出控制信号&#xff0c;控制继电器的动作&…

PingCAP 再度入选“中国独角兽企业”,数据库领域的先锋力量

6月16日&#xff0c;2024中国&#xff08;重庆&#xff09;独角兽企业大会上&#xff0c;长城战略咨询发布了《中国独角兽企业研究报告2024》。 2023年&#xff0c;中国独角兽企业共375家&#xff0c;大数据赛道共5家。 估值排序企业名称2023年估值&#xff08;亿美元&#xff…

【面试题】等保(等级保护)的工作流程

等保&#xff08;等级保护&#xff09;的工作流程主要包括以下几个步骤&#xff0c;以下将详细分点介绍&#xff1a; 系统定级&#xff1a; 确定定级对象&#xff1a;根据《信息系统等级保护管理办法》和《信息系统等级保护定级指南》的要求&#xff0c;确定需要进行等级保护的…

CRMEB开源商城系统Java版:新零售时代的技术创新与实战案例

一、引言 随着新零售概念的兴起和电子商务的飞速发展&#xff0c;企业对商城系统的需求也日益多元化和个性化。CRMEB开源商城系统Java版&#xff0c;凭借其先进的技术架构、丰富的功能模块和灵活的扩展性&#xff0c;成为了众多企业构建和扩展自身电商业务的首选。本文将对CRM…

【Android】我的手机在...自己下载...那个(浅析Intent基础运用)

【Android】我的手机在…自己下载…那个&#xff08;浅析Intent基础运用&#xff09; 在Android开发中&#xff0c;Intent&#xff08;意图&#xff09;是一个非常重要的概念。它不仅仅是用于在应用程序的各个组件之间进行通信的工具&#xff0c;也是启动新的Activity、Servic…

表组装示例

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDO…

光伏能源圈

2021年&#xff0c;新型电力系统之下&#xff0c;中国已形成了两网五大六小的电力新格局&#xff1a; 两大电网&#xff1a;国家电网、南方电网 五大电力央企&#xff1a;国家能源投资集团、中国华能集团、中国华电集团、中国大唐集团、国家电力投资集团。 六小豪门&#xf…

python判断语句

目录 布尔类型和比较运算符if语句的基本格式if else 语句if elif else 语句判断语句的嵌套 布尔类型和比较运算符 1、布尔类型 bool布尔类型只有两个结果&#xff1a;真或假 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假&#x…

一切前端概念,都是纸老虎

4、listener可以通过 store.getState() 得到当前状态。如果使用的是 React&#xff0c;这时可以触发重新渲染 View。 function listerner() { let newState store.getState(); component.setState(newState); } 对比 Flux 和 Flux 比较一下&#xff1a;Flux 中 Store 是…