第一章 JDBC
1、JDBC的概念
目标
- 能够掌握JDBC的概念
- 能够理解JDBC的作用
讲解
客户端操作MySQL数据库的方式
-
使用第三方客户端来访问MySQL:SQLyog、Navicat
-
使用MySQL自带的命令行方式
-
通过Java来访问MySQL数据库,今天要学习的内容
如何通过Java代码去操作数据库呢?
Java中给我们提供专门的一套技术,可以通过其中的某些类和接口操作任何的数据库,这个技术就是今天要学习的JDBC。
什么是JDBC:Sun公司为了简化、统一对数据库的操作,定义了一套java操作数据库的接口的规范,称之为JDBC。JDBC的全称为:java database connection (java和 数据库的连接 ) 就是使用java代码来操作数据库。
JDBC的作用:Java通过JDBC就可以操作数据库
JDBC的由来
-
java程序依赖于jdk,jdk和数据库是2个不同的应用程序,那他们是怎么进行访问的呢?
要想搞清楚这个问题,我们必须了解下电脑是如何和其他硬件设备交互的。假设我们电脑安装完系统之后是一个无驱动的操作系统。那么当我们电脑想播放声音,即安装音响,必须得安装声卡驱动。同时电脑想和u盘硬件进行交互,也必须在电脑上安装对应的驱动。如果驱动安装失败,很显然他们是不能正常的交互的。这个安装驱动的其实就是为了定义他们两个相互交互的规则。只有统一了规则,才能交互。
具体的解释如下图所示:
同理:java程序想和数据库进行交互,也必须得安装数据库驱动,这样才能交互。但是,我们数据库有多种,这样就会导致不同的数据库具备不同的数据库驱动。
从而会导致在开发中作为程序员由于安装不同的数据库驱动而浪费很多时间,同时和数据库交互的java代码也得重新书写,这样都会导致效率很低。所以说,sun公司就会制定一套规则,这套规则就是用来java程序连接数据库的,然后各大数据库厂商只需要实现这个规则即可。这个规则就是jdbc技术,即接口。
换句话就是说,就是数据库厂商使用sun公司提供的接口,然后作为java程序员实现接口中的方法即可。接口中的方法体由具体的数据库厂商来实现。
JDBC的好处
- 我们只需要会调用JDBC接口中的方法即可,使用简单
- JDBC有关的类和接口:都在java.sql 和 javax.sql(扩展包) 包下
- 方法体由具体的数据库厂商来完成的
- 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库
小结
- 说出JDBC的概念?Java数据库连接(Java操作数据库的标准规范)
- 说出JDBC的作用?Java通过JDBC就可以操作数据库
2、JDBC核心API的介绍
目标
能够理解JDBC四个核心对象
讲解
JDBC会用到的包
- java.sql:JDBC访问数据库的基础包,在JavaSE中的包。如:java.sql.Connection
- javax.sql: JDBC访问数据库的扩展包
- 数据库的驱动,各大数据库厂商来实现。如:MySQL的驱动:com.mysql.jdbc.Driver
JDBC四个核心对象
这几个类都是在java.sql包中
- DriverManager(类): 数据库驱动管理类。这个类的作用:1)注册驱动; 2)创建java代码和数据库之间的连接,即获取Connection接口;
- Connection(接口): 是一个接口, 建立数据库连接的一个接口。作用:建立数据库和java代码之间的连接。表示与数据库创建的连接
- Statement(接口)、PreparedStatement(接口) (解决安全隐患问题,比如sql注入的问题): 数据库操作,向数据库发送sql语句。执行SQL语句的对象
- ResultSet: 结果集或一张虚拟表。 Statement 发送sql语句,得到的结果 封装在 ResultSet 中。
JDBC访问数据库的步骤
- 由DriverManager注册驱动程序
- 创建和数据库的连接对象Connection
- 由客户端发送SQL语句给服务器执行,SQL语句封装成Statement对象
- 查询到的结果集封装成ResultSet对象
- 在客户端可以从ResultSet中取出数据,处理结果集
- 释放资源,关闭连接对象
小结
JDBC四个核心对象?
- DriverManager(类): 用于注册驱动和获取连接
- Connection(接口): 表示与数据库创建的连接
- Statement(接口): 执行SQL语句的对象
- 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());
,存在以下方面不足
- 驱动被注册两次
使用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");
小结
-
导入mysql驱动Jar包
-
通过JDBC注册数据库驱动?
Class.forName("com.mysql.jdbc.Driver");
3.从jdk4.0开始,对于我们java开发工程师,第一步不用书写了,底层帮助我们使用com.mysql.jdbc.Driver类先注册驱动了.
驱动必须注册,只是不用我们书写代码注册了。