核心概述:在实际开发中,我们需要通过Java程序来操作数据库,此时Java给我们提供了Java访问数据库的标准规范就是JDBC,我们可以通过调用JDBC接口中的方法实现操作数据库。
第一章:JDBC快速入门
1.1-客户端操作MySQL的方式
01-使用第三方客户端来访问 MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL 。
02-使用 MySQL 自带的命令行方式 。
03-通过 Java 来访问 MySQL 数据库,本篇要讲解的内容
1.2-JDBC概述
什么是JDBC
JDBC (Java Database Connectivity,简称JDBC )是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。
JDBC的好处
01-程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
02-使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库 。
使用 JDBC 开发使用到的包
会使用到的包 | 说明 |
---|---|
java.sql |
所有与 JDBC 访问数据库相关的接口和类 |
javax.sql |
数据库扩展包,提供数据库额外的功能。如:连接池 |
数据库的驱动 |
由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类 |
1.3-JDBC核心API
接口或类 | 作用 |
---|---|
DriverManager 类 |
1) 管理和注册数据库驱动 2) 得到数据库连接对象 |
Connection 接口 |
一个连接对象,可用于创建 Statement 和 PreparedStatement 对象 |
Statement 接口 |
一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。 |
PreparedStatement 接口 |
一个 SQL 语句对象,是 Statement 的子接口 |
ResultSet 接口 |
用于封装数据库查询的结果集,返回给客户端 Java 程序 |
1.4-导入驱动jar包
下载
链接:https://pan.baidu.com/s/1igjB1mTP7GBLBAZGP_bsGA
提取码:v72g
导入步骤
1.5-加载和注册驱动
加载方法
加载和注册驱动的方法 | 描述 |
---|---|
Class.forName(数据库驱动实现类) |
加载和注册数据库驱动,数据库驱动由 mysql 厂商"com.mysql.jdbc.Driver" |
具体实现
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException {
//抛出类找不到的异常,注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
}
}
疑问:为什么这样可以注册驱动?
public class 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!");
}
}
}
com.mysql.jdbc.Driver 源代码:
Driver 接口,所有数据库厂商必须实现的接口,表示这是一个驱动类。
注意事项
从 JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName 这句话可以省略。
为了向下兼容,建议不要省略。
第二章:DriverManager类
2.1-DriverManager作用
- 管理和注册驱动
- 创建数据库的连接
2.2-类中的方法
DriverManager 类中的静态方法 | 描述 |
---|---|
Connection getConnection (String url, String user, String password) |
通过连接字符串,用户名,密码来得到数据库的连接对象 |
Connection getConnection (String url, Properties info) |
通过连接字符串,属性对象来得到连接对象 |
2.3-连接数据库的四个参数
参数 | 说明 |
---|---|
用户名 | 登录的用户名 |
密码 | 登录的密码 |
连接字符串 URL | 不同的数据库 URL 是不同的 mysql 的写法 jdbc:mysql://localhost:3306/数据库[?参数名=参数值] |
驱动类的字符串名 | com.mysql.jdbc.Driver |
2.4-连接数据库URL
格式
协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值
MySQL格式
MySQL简写格式
前提:必须是本地服务器,端口号是 3306 。
简写格式:jdbc:mysql:///数据库名
乱码的处理
如果数据库出现乱码,可以指定参数: ?characterEncoding=utf8
,表示让数据库以 UTF-8 编码来处理数据。
jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8
2.5-代码演示
方式1:使用用户名、密码、URL 得到连接对象
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 得到连接对象
*/
public class Demo2 {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/db3";
//1) 使用用户名、密码、URL 得到连接对象
Connection connection = DriverManager.getConnection(url, "root", "root");
//com.mysql.jdbc.JDBC4Connection@68de145
System.out.println(connection);
}
}
方式2:使用属性文件和 url 得到连接对象
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class Demo3 {
public static void main(String[] args) throws SQLException {
//url 连接字符串
String url = "jdbc:mysql://localhost:3306/db3";
//属性对象
Properties info = new Properties();
//把用户名和密码放在 info 对象中
info.setProperty("user","root");
info.setProperty("password","root");
Connection connection = DriverManager.getConnection(url, info);
//com.mysql.jdbc.JDBC4Connection@68de145
System.out.println(connection);
}
}
第三章:Connection接口
作用
Connection 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。
方法
方法 | 描述 |
---|---|
Statement createStatement() |
创建一条 SQL 语句对象 |
第四章:Statement 接口
4.1-JDBC访问数据库的步骤
- 注册和加载驱动(可以省略)
- 获取连接
- Connection Statement 对象
- 使用 Statement 对象执行 SQL 语句
- 返回结果集
- 释放资源
4.2-Statement 作用
代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
4.3-Statement 中的方法
Statement 接口中的方法 | 描述 |
---|---|
int executeUpdate(String sql) |
用于发送 DML 语句,增删改的操作(insert、update、delete) 参数:SQL 语句 返回值:返回对数据库影响的行数 |
ResultSet executeQuery(String sql) |
用于发送 DQL 语句,执行查询的操作。 select 参数:SQL 语句 返回值:查询的结果集 |
4.4-释放资源
- 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
- 释放原则:先开的后关,后开的先关。ResultSet →Statement →Connection
- 放在哪个代码块中:finally 块
4.5-执行DDL
需求:使用 JDBC 在 MySQL 的数据库中创建一张学生表
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 创建一张学生表
*/
public class Demo4DDL {
public static void main(String[] args) {
//1. 创建连接
Connection conn = null;
Statement statement = null;
try {
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
//2. 通过连接对象得到语句对象
statement = conn.createStatement();
//3. 通过语句对象发送 SQL 语句给服务器
//4. 执行 SQL
statement.executeUpdate("create table student (id int PRIMARY key auto_increment, " +
"name varchar(20) not null, gender boolean, birthday date)");
//5. 返回影响行数(DDL 没有返回值)
System.out.println("创建表成功");
} catch (SQLException e) {
e.printStackTrace();
}
//6. 释放资源
finally {
//关闭之前要先判断
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
4.6-执行DML
需求
向学生表中添加 4 条记录,主键是自动增长
步骤
- 创建连接对象
- 创建 Statement 语句对象
- 执行 SQL 语句:executeUpdate(sql)
- 返回影响的行数
- 释放资源
代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 向学生表中添加 4 条记录,主键是自动增长
*/
public class Demo5DML {
public static void main(String[] args) throws SQLException {
// 1) 创建连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///day24", "root",
"root");
// 2) 创建 Statement 语句对象
Statement statement = connection.createStatement();
// 3) 执行 SQL 语句:executeUpdate(sql)
int count = 0;
// 4) 返回影响的行数
count += statement.executeUpdate("insert into student values(null, '孙悟空', 1, '1993-03-
24')");
count += statement.executeUpdate("insert into student values(null, '白骨精', 0, '1995-03-
24')");
count += statement.executeUpdate("insert into student values(null, '猪八戒', 1, '1903-03-
24')");
count += statement.executeUpdate("insert into student values(null, '嫦娥', 0, '1993-03-
11')");
System.out.println("插入了" + count + "条记录");
// 5) 释放资源
statement.close();
connection.close();
}
}
4.7-执行DQL
ResultSet 接口
作用:封装数据库查询的结果集,对结果集