1,JDBC是什么?
JAVA DateBase Connectivity(JAVA语言连接数据库)
JDBC本质是:
SUN公司制定的一套接口(interface)
java.sql.*;(这个软件包下有很多接口。)
接口都有调用者和实现者。(面向接口编程,解耦合,提高程序的扩展力)
2,为什么SUN制定一套JDBC接口?
因为每一个数据库的底层实现原理不一样。
如果没有这个接口,我们需要写很多实现。
把接口的实现交给数据库的厂商来实现(实现者),Java程序员只需要去调用(调用者)。 面向接口去编程。
需要做的就是找到这些xxx.class文件。
Java程序员:自己编写的
JDBC接口: java.sql.*;(这个软件包下有很多接口。)
各大厂商的xxx.class文件需要去网上下载。(可以去各大厂商官网下载 )
都是在一个jar包中,它们有一个特殊的名字“驱动”,驱动就是一个jar包
MySQL 驱动,Oracle驱动,sqlserver驱动
编写模拟JDBC本质的简单过程:
SUN公司制定的接口:
/**
* 模拟SUN公司制定这套接口
*/
public interface JDBC {
/**
* 连接数据库的方法
*/
void getConnection();
}
各大厂商实现接口的类:
/**
* MySQL的数据库厂家负责编写JDBC接口的实现类
*/
public class MySQL implements JDBC {
@Override
public void getConnection() {
//具体这里的代码怎么写,对于我们Java程序员没关系
//这段代码涉及到MySQL底层数据库实现原理
System.out.println("连接MySQL数据库成功!");
}
}
/**
* Oracle的数据库厂家负责编写JDBC接口的实现类
*/
public class Oracle implements JDBC {
@Override
public void getConnection() {
//具体这里的代码怎么写,对于我们Java程序员没关系
//这段代码涉及到MySQL底层数据库实现原理
System.out.println("连接Oracle数据库成功!");
}
}
程序员的调用:
注意使用:ResourceBundle类的时候,要注意路径问题,
本例子使用了idea工具是一个maven项目,本例子不需要建立多余的包,全部在工程自带的Java包下。要确保运行后下面的classes下面有资源。
import java.util.ResourceBundle;
/**
* java程序员调用JDBC接口
* 不需要关心具体是哪个品牌的数据库,只需要面向JDBC接口写代码。
* 面向接口编程,面向抽象编程,不要面向具体编程
*/
public class JavaProgrammer {
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
//JDBC jdbc=new MySQL();
// JDBC jdbc=new Oracle();
//创建对象通过反射机制
Class<?> c= Class.forName("MySQL");//只需要改文件路径就可以切换目标
//需要自己强转
JDBC o = (JDBC)c.newInstance();
//通过配置文件获取
ResourceBundle bundle = ResourceBundle.getBundle("JDBC");
String className=bundle.getString("className");
Class<?> c1 = Class.forName(className);
//需要自己强转
JDBC o1 = (JDBC)c1.newInstance();
//以下代码都是面向接口调用方法,不需要改变
o.getConnection();
o1.getConnection();
}
}
JDBC开发前的准备工作,
先从官网下载对应的jar包 ,然后将其配置到环境变量classpath中(可以去博客查找相关的步骤)(针对文本编辑器的开发方式,使用idea不需要以上配置)
之后的例子使用的是maven项目,可以直接导入依赖,管理jar包,没有配置环境变量。
没有使用maven项目,使用idea工具使用JDBC的准备工作。
然后去找下载jar包得路径导入就可以了。(每建一个项目都得重新导入)
使用maven可以直接导入 MySQL的依赖:
注意版本号的不同
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
JDBC编程六步:
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库的进程之间的通道打开了)
这属于进程之间的通信,使用完之后得关闭资源。
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句
第五步:处理查询结果集(只有第四步执行得是select语句得 时候,才有第五步)
第六步:释放资源
java.sql.*;
包下一个类:DriverManager,驱动管理器 :
注册驱动的一个方法:
static void | registerDriver(Driver driver) 向 DriverManager 注册给定驱动程序。 |
Driver
是一个接口,由厂商实现。
MySQL实现该接口得类得路径是:com.mysql.jdbc.Driver(MySQL之前的版本)
8.0之后的版本建议使用:com.mysql.cj.jdbc.Driver
获取连接的方法:
static Connection | getConnection(String url) 试图建立到给定数据库 URL 的连接。 |
static Connection | getConnection(String url, Properties info) 试图建立到给定数据库 URL 的连接。 |
static Connection | getConnection(String url, String user, String password) 试图建立到给定数据库 URL 的连接。 |
返回的Connection是一个接口
URL简单介绍:
url:统一资源定位符(网络中某个资源的绝对路径)
URL包括哪几部分:
协议
IP
PORT
资源名
http://182.61.200.7:80/index.html
http://通信协议(通信协议是通信之前就提前定好的数据传输格式。数据包具体怎么传输数据,格式提前定好的)
182.61.200.7 服务器IP地址
80 服务器上的软件的端口
index.html 服务器上某个资源名
老版本:
jdbc:mysql://localhost:3306/db2
(local host是本机地址,3306是端口号,db2是数据库的名称,根据使用定)
新版本:(后面一串好像是 保密的协议之类的。)
jdbc:mysql://localhost:3306/db2?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
获取数据库操作对象的方法
是Connection接口的方法。实现交给厂商,我们只需要调用
Statement | createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。 |
Statement | createStatement(int resultSetType, int resultSetConcurrency) 创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 |
Statement | createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) 创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。 |
执行SQL语句的方法:
是Statement接口的方法。实现交给厂商,我们只需要调用
ResultSet |
执行的是select 语句。 |
int | executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT 、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。 |
代码示例:
package com.bjpowernode;
import java.sql.*;
public class JDBCTest01 {
public static void main(String[] args) {
Statement stmt=null;
Connection conn = null;
try {
//第一步:注册驱动
//DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
//拆成两步
//如果导包(import java.sql.Driver;)可以写成下面的,不需要带包名
Driver driver1 = new com.mysql.cj.jdbc.Driver();
//Driver是一个接口,多态,父类指向子类对象
java.sql.Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
//第二步:获取连接
String url = "jdbc:mysql://localhost:3306/自己的数据库名?
useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
String user = "root";
String password = "自己的密码";
conn = DriverManager.getConnection(url, user, password);
//com.mysql.cj.jdbc.ConnectionImpl@50f8360d
System.out.println("数据库连接对象:" + conn);
//第三步:获取数据库操作对象(专门执行SQL的)
stmt = conn.createStatement();
//第四步:执行SQL
String sql = "insert into sc values(10,02,99)";
//专门执行DML语句(insert,delete,update) 语句
//返回值是”影响数据库中的记录条数“
int i = stmt.executeUpdate(sql);
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
//6.释放资源
//为了保证资源一定释放,在finally语句块中关闭资源
//并且遵循从小到大的顺序,如果有多个需要分开来处理异常
if (stmt!=null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
//6.释放资源
//为了保证资源一定释放,在finally语句块中关闭资源
//并且遵循从小到大的顺序,如果有多个需要分开来处理异常
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}