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

news2024/11/16 20:28:59

第一章 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.Driver
            3) 真正注册驱动代码:  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.coloradmin.cn/o/1859280.html

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

相关文章

考研数学|《李林880》正确率多少算合格?

李林880题是针对考研数学三的练习题集,覆盖了考研数学三的主要知识点和题型。如果能够熟练掌握这些题目,意味着对考研数学三的知识点有了较为深入的理解和应用能力。 首先,考研数学三的总分是150分,题型包括单选题、填空题和解答…

Day5 —— 电商日志数据分析项目

项目二 _____(电商日志数据分析项目) 引言需求分析详细思路统计页面浏览量Map阶段Reduce阶段 日志的ETL操作Map阶段Reduce阶段 统计各个省份的浏览量Map阶段Reduce阶段 具体步骤统计页面浏览量日志的ETL操作统计各个省份的浏览量工具类(utils…

鸿蒙HarmonyOS服务卡片实战

引言 在现代开发中,服务卡片是不可或缺的一部分,比如音乐,天气类等应用,官网的介绍中写道:卡片让您便捷地预览服务信息,例如查看天气或日历日程等内容。您可将卡片添加到屏幕上,让这类信息触手…

拼多多面试总结

文章目录 一面自我介绍提问算法反问结果 二面提问算法反问结果 主管面主管面试准备算法题其他个人提问准备 提问数据库普通索引和覆盖索引的区别索引是什么?索引怎么加快数据库查询的?索引具体怎么实现的?以B树为例,节点放了什么&…

SOIDWORKS Electrical中统计槽满率的经验技巧

近期有一些客户咨询,为什么在SOLIDWORKS Electrical 3D 中做完3D布线工作,但是在统计线槽槽满率的时候不能正常计算。因此我们总结了以下几点经验。 一、对于SOLIDWORKS Electrical中的计算线槽率的功能,除了所使用的线槽需要满足两个条件&am…

【Unity服务器01】之【AssetBundle上传加载u3d模型】

首先打开一个项目导入一个简单的场景 导入怪物资源, AssetBundle知识点: 1.指定资源的AssetBundle属性标签 (1)找到AssetBundle属性标签 (2)A标签 代表:资源目录(决定打包之后在哪…

LDO电源模块如何快速设计布局

在现代电子设备遍布的时代,电源模块的设计与应用成为了电子工程领域中的核心议题。而LDO(低压差线性稳压器)电源模块,因其出色的线性特性和稳定性,在众多应用中备受青睐。为了满足不断增长的电子设备性能需求&#xff…

控价服务商的选择标准

品牌控价旨在对渠道进行有效管控,维护品牌自身价值以及经销商的合法权益,同时也为消费者提供稳定的购物价格。在这一过程中,不但要对线上价格进行把控,线下价格同样需要品牌投入精力去管理。就线上而言,由于链接数量众…

面向对象的进阶---static

1.static 静态变量 package com.itheima.a01staticdemo01;public class Student {private String name;private int age;public static String teacherName;public Student() {}public Student(String name, int age) {this.name name;this.age age;}/*** 获取* return n…

基于单片机的智能台灯控制系统

摘要: 文章设计一款单片机智能台灯控制系统,实现对台灯的手动和自动控制功能,以 STC89C52 单片机作为多功能智能台灯的主控制器,光电检测模块检测坐姿,红外传感器检测人体,光敏电阻检测光强,同…

找不到x3daudio1_7.dll无法运行的原因分析及6种解决方法

当您遇到软件或游戏中提示“x3daudio1_7.dll丢失”的问题时,通常意味着您的系统中缺少这个特定的动态链接库文件。x3daudio1_7.dll 是微软DirectX的一部分,找不到x3daudio1_7.dll会导致软件游戏无法启动运行,下面小编就分享几种靠谱的解决方法…

msvcp120.dll丢失的解决方法,总结几种有效的解决方法

最近,我在使用计算机时遇到了一个问题,系统提示我丢失了msvcp120.dll文件。这让我感到非常困扰,因为这个问题导致我无法正常运行一些程序。经过一番搜索和尝试,我找到了几种修复这个问题的方法,并成功解决了这个问题。…

[数据集][目标检测]斑马线人行横道检测数据集VOC+YOLO格式793张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):793 标注数量(xml文件个数):793 标注数量(txt文件个数):793 标注类别…

vue2和vue3分别如何全局引入并使用js

如下js:util/tool.js var tool {nullKeyValueConvertLine(data){if(data && data.length > 0){data.map((item,index)>{for(var key in item){if(!item[key]&&item[key]!0){item[key] -}}})}}, } export default tool 在vue2项目中全局引…

2024上海MWC 参展预告 | 未来先行,解锁数字化新纪元!

一、展会介绍——2024世界移动通信大会 2024年世界移动通信大会上海(MWC上海)将于6月26日至28日在上海新国际博览中心举行。 本届大会以“未来先行(Future First)”为主题聚焦“超越5G”、“数智制“人工智能经济’造”三大热点话题。届时将在包括超级品牌馆(Super Hall)在内…

C++(part2、3-Linux系统编程+数据库项目):Linux网络云盘

文章目录 一、项目需求分析1.一期:命令行解析(1)cd(用栈管理)、ls、pwd(2)puts、gets(3)mkdir、touch、rmdir、rm 2.二期:密码验证、日志、断点续传、大文件传输(1)密码验证(2)日志(3)断点续传(4)大文件传输 3.三期:用户注册、用户登录、虚拟…

nginx+keepalived+tomcat集群实验

如遇星河 | nginx+keepalived高可用集群实验 木子87 | Keepalived+Nginx+Tomcat 实现高可用Web集群 环境 192.168.40.204 tomcat-1 192.168.40.138 tomcat-2 安装tomcat [root@bogon local]# vim /etc/profile 添加环境变量 JAVA_HOME=/usr/local/java PATH=$J…

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型 GPT-4o),…

复制完若依后,idea没有maven窗口

右击项目 添加框架 添加maven框架就可以了

【Vue】vue-router路由使用

前言 Vue Router是Vue框架中非常重要的一个功能。 目标 1 单页面应用与多页面应用的区别; 2 vue-router的具体实现方法; 3 路由模式有哪几种,有什么区别; 4 如何进行路由守卫与路由缓存; 一 路由的概念 概念 Vue Router是Vue提供的路由管理器。将组件与路由一一对应起来,…