JDBC的操作五大步骤:注册驱动;建立连接;创建statement去执行sql,获得结果;处理结果;释放资源。就是这么简简单单的五步,阐释了Java连接数据库时的优雅。
文章目录
啥是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公司的事了~~
注册驱动
接下来,我将使用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();
}
}