2025-09-09 18:11:54

【JDBC】JDBC的基本使用步骤(清晰完美版)

JDBC的操作五大步骤:注册驱动;建立连接;创建statement去执行sql,获得结果;处理结果;释放资源。就是这么简简单单的五步,阐释了Java连接数据库时的优雅。

文章目录

啥是JDBC注册驱动注册驱动法一:创建驱动对象注册驱动法二: 使用驱动管理器类连接数据库注册驱动法三: 使用加载驱动程序类来注册驱动程序

建立连接创建statement去执行sql,获得结果静态SQL:Statement动态SQL:PreparedStatement

处理结果释放资源

啥是JDBC

JDBC全称: Java Data Base Connectivity,Java 数据库连接

为什么会出现JDBC?

对于Java这门编程语言来说,它可能需要连接各种数据库(MySQL、SQL Server、Oracle等等);那么对于这些数据库厂商来说,他们都需要提供一套Java程序员能看懂的操作API;这对于程序员来说,可谓是不小的难度。因为,当你连接MySQL时用的是一套API,当你连接Oracle时,又用的是另外一套API,十分蛋疼。于是SUN公司就想能不能程序员只用一套API,就可以操作所有的数据库。(皆大欢喜。)于是,就诞生了JDBC这门规范、技术,程序员使用SUN公司提供的API,就可以操作所有的数据库,至于其他的,就是SUN公司的事了~~

JDBC的工作原理示意图

注册驱动

接下来,我将使用Java来连接MySQL数据库。学习JDBC的基础用法。

第0步:首要步骤!! 导入驱动包:

在当前项目根目录下建立一个“lib”文件夹;把“mysql-connector-java-5.1.18-bin.jar”复制到该文件夹中;选中该jar包,右键,执行“build Path”才能真正导入该jar包。才可以开始执行以下的步骤!

导入驱动成功

为什么要导入这个jar包?

有了这个包,你才可以愉快地使用JDBC操作MySQL数据库。里面提供了MySQL的实现类:com.mysql.jdbc.Driver。但是要注意,JDBC规范定义驱动接口在java.sql.Driver,也就是你要操作数据库的所有方法都要在这个包下查找。

注册驱动法一:创建驱动对象

快速理解连接操作方式:

import com.mysql.jdbc.Driver;

import java.util.Properties;

import java.sql.Connection;

import java.sql.SQLException;

public class TempMain {

// 连接数据库URL格式为:jdbc协议:数据库子协议:主机:端口/连接的数据库名

// 和HTTP协议类似

private static String url = "jdbc:mysql://localhost:3306/mydb";

private static String user = "root";// 用户名

private static String password = "root";// 密码

//第一种方法:使用驱动程序去连接

public static void main(String[] args) throws SQLException {

//1.创建驱动程序类对象:

//new不能是接口,而是实现类;实现类(要导包)在:com.mysql.jdbc.Driver里;

Driver driver = new com.mysql.jdbc.Driver(); //新版本

//Driver driver = new org.gjt.mm.mysql.Driver(); //旧版本

//设置用户名和密码

Properties props = new Properties();

props.setProperty("user", user);

props.setProperty("password", password);

//2.连接数据库,返回连接对象

Connection conn = driver.connect(url, props);

System.out.println(conn);

//输出:com.mysql.jdbc.JDBC4Connection@ba4d54,表明连接成功

}

}

分析: JDBC的URL格式: JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。

第一部分是jdbc,这是固定的;第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb)组成。

如果连接的是本地的Mysql数据库,并且连接使用的端口是3306,那么的url地址可以简写为:

jdbc: mysql://数据库, 例如:jdbc: mysql://localhost:3306/mydb

注册驱动法二: 使用驱动管理器类连接数据库

快速理解使用方式

import com.mysql.jdbc.Driver;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class TempMain {

// 连接数据库URL格式为:jdbc协议:数据库子协议:主机:端口/连接的数据库名

// 和HTTP协议类似

private static String url = "jdbc:mysql://localhost:3306/mydb";

private static String user = "root";// 用户名

private static String password = "root";// 密码

// 第二种方法:使用驱动管理器类连接数据库

public static void main(String[] args) throws SQLException {

Driver driver = new com.mysql.jdbc.Driver();

// Driver driver2 = new com.oracle.jdbc.Driver(); //Oracle数据库的连接

// 1.注册驱动程序(可以注册多个驱动程序)

DriverManager.registerDriver(driver);

// DriverManager.registerDriver(driver2);

//注意,通过查询驱动包中的Driver类的源码可知:该类的static代码块中已经执行了“DriverManager.registerDriver(driver);”,那么这就相当于注册了两次,冗余了

// 2.连接到具体的数据库

Connection conn = DriverManager.getConnection(url, user, password);

System.out.println(conn);

//输出:com.mysql.jdbc.JDBC4Connection@31b7dea0;表明连接成功

}

}

不推荐使用这种注册方式:

硬编码,后期不易于程序扩展和维护通过查询驱动包中的Driver类的源码可知:该类的static代码块中已经执行了“DriverManager.registerDriver(driver);”,那么这就相当于注册了两次,也就是在内存中会有两个Driver对象,冗余了程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。

注册驱动法三: 使用加载驱动程序类来注册驱动程序

快速理解使用方式

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class TempMain {

// 连接数据库URL格式为:jdbc协议:数据库子协议:主机:端口/连接的数据库名

// 和HTTP协议类似

private static String url = "jdbc:mysql://localhost:3306/mydb";

private static String user = "root";// 用户名

private static String password = "root";// 密码

// 第三种方法:使用驱动管理器类连接数据库

public static void main(String[] args) throws SQLException, ClassNotFoundException {

// 1.通过得到字节码对象的方式加载静态代码块,从而注册驱动程序

Class.forName("com.mysql.jdbc.Driver"); // 参数是字节码

// 2.连接到具体的数据库

Connection conn = DriverManager.getConnection(url, user, password);

System.out.println(conn);

//输出:com.mysql.jdbc.JDBC4Connection@50675690,表明连接成功

}

}

底层原理:

通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册结论:推荐使用

建立连接

方法1:创建驱动对象

Driver driver = new com.mysql.jdbc.Driver(); //若new驱动对象

Connection conn = driver.connect(url, props); //则必须使用这种建立连接

方法2:使用加载驱动程序类来注册驱动程序

Class.forName("com.mysql.jdbc.Driver"); //加载驱动对象

Connection conn = DriverManager.getConnection(url, user, password); //加载获取连接

Connection是接口,DriverManager.getConnection()返回的是com.mysql.jdbc.JDBC4Connectiond的实现类。

Connection类的API详解

createStatement():创建向数据库发送sql的statement对象。prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。prepareCall(sql):创建执行存储过程的callableStatement对象。setAutoCommit(boolean autoCommit):设置事务是否自动提交。commit() :在链接上提交事务。rollback() :在此链接上回滚事务。

DriverManager类功能详解

DriverManager在JDBC规范中是类而不是接口。它是一个服务类,用于管理JDBC驱动程序,提供getConnection()方法建立应用程序与数据库的连接。getConnection()是个静态方法。返回的是com.mysql.jdbc.JDBC4Connectiond的实现类。打印“conn”变量内容为:“com.mysql.jdbc.JDBC4Connectiond”DriverManager在java.sql包中。当我们调用sql包里不论什么一个类(包含接口)的不论什么一个方法时都会报一个编译时异常SQLException。

创建statement去执行sql,获得结果

类型: 1、运行静态SQL语句。通常通过Statement实例实现。 2、运行动态SQL语句。通常通过PreparedStatement实例实现。 3、运行数据库存储过程。通常通过CallableStatement实例实现。

测试用的mysql语句

CREATE DATABASE mydb;

USE mydb;

CREATE TABLE person(

p_id INT PRIMARY KEY,

p_name VARCHAR(10),

p_age INT

);

INSERT INTO person(p_id,p_name,p_age) VALUES

(1,"asus",20),

(2,"alibaba",40),

(3,"huawei",50)

静态SQL:Statement

特性:

java.sql.Statement接口,所有的操作方法也来自该接口;在每次使用时,都是用“com.mysql.jdbc”包中的类来返回“java.sql.Statement”接口的引用!

Statement接口提供了三种运行SQL语句的方法:executeQuery、executeUpdate 和execute。

ResultSet executeQuery(String sqlString):运行查询数据库的SQL语句。返回一个结果集(ResultSet)对象。int executeUpdate(String sqlString):用于运行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATETABLE和DROP TABLE等。返回影响作用的行数。boolean execute(sqlString):用于运行返回多个结果集、多个更新计数或二者组合的语句。ddBatch(String sql):把多条sql语句放到一个批处理中。executeBatch():向数据库发送一批sql语句执行。

学习例子: https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/03-%E9%9D%99%E6%80%81SQL(Statement)%E7%9A%84CRUD

动态SQL:PreparedStatement

特性:

是“java.sql.Statement”接口的子接口这个接口的实现类,在数据库的驱动中:“com.mysql.jdbc. JDBC4PreparedStatement”

方法详情:

int executeUpdate(); 执行PreparedStatement对象中预编译的SQL语句。返回执行成功的行数。 适用执行:insert、update、delete类的SQL语句;executeQuery方法,适用于执行有返回结果集的SQL语句,例如select。

学习例子: https://github.com/Kyle-Shawe/JavaEE-Study-Notes/tree/master/01-JDBC/04-%E5%8A%A8%E6%80%81SQL(PreparedStatement)%E7%9A%84CURD

处理结果

获取方法:

Object getObject(int index) / Object getObject(String name) 获得任意对象String getString(int index) / Object getObject(String name) 获得字符串int getInt(int index) / Object getObject(String name) 获得整形double getDouble(int index) / Object getObject(String name) 获得双精度浮点型

遍历方法:

boolean next(); 将光标移动至下一行。当光标返回最后一行之后一行,或者为空,返回false。Previous():移动到前一行absolute(int row):移动到指定行beforeFirst():移动resultSet的最前面。afterLast() :移动到resultSet的最后面。

释放资源

操作完毕以后要把全部使用的JDBC对象全都关闭,以释放JDBC资源。关闭顺序和声明顺序相反: 1、关闭记录集 2、关闭声明 3、关闭连接对象

关闭资源SOP:

if(rs!=null)

{ // 关闭记录集

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if(stmt!=null)

{ // 关闭声明

try {

stmt.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if(conn!=null)

{ // 关闭连接对象

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}