JDBC

JDBC概念先导

JDBC(Java DataBase Connectivity)即Java语言连接数据库,本质上是一套位于java.sql.*下的接口。因为每种数据库的底层实现原理都不一致,如Oracle、MySQL,为了统一能够被Java调用,SUN制定了JDBC这套接口,其他数据库厂家就需要实现接口的实现类。

JDBC实现的过程

  1. Driver注册

在JAVA工程中注册好Driver,即为MySQL服务器打开通道口

  1. 建立通道

通过JDBC【java.sql.DriverManager】在JAVA工程与MySQL服务器之间建立通道,以便于JAVA工程能向MySQL发送命令,MySQL能向JAVA工程返回结果。

  1. 实现交通工具

Connection接口实现类【PreparedStatement接口实现类】能作为JAVA工程和MySQL之间通信的工具。

  1. 执行并返回结果

Connection接口实现类到达MySQL,MySQL收到SQL命令后执行,将操作结果放回Connection接口实现类中。

  1. 释放资源

在工作完成后,需要对所有对象进行销毁,主要包括以下实现类:Connection【管理连接通道】PreparedStatement【管理交通工具】ResultSet【查询命令返回的临时表】

JDBC你需要知道的类

  • java.sql.DriverManager

这个类存放在JDK1.8下,负责将数据库厂商提供的Driver接口进行注册,以便建立通道。

  • java.sql.Connection

负责管理Java工程与数据库服务器之间的连接通道

  • java.sql.PreparedStatement

负责管理在连接通道上进行往返的交通工具

  • java.sql.ResultSet

负责管理数据库服务器返回的临时表,即返回给JAVA工程的处理结果。

JDBC开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.theo;

import java.sql.*;

public class JDBCtest {
public static void main(String[] args) throws SQLException {
//注册
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);

//建立通道
String url = "jdbc:mysql://localhost:3306/companydb";
Connection connection = DriverManager.getConnection(url, "root", "tzq1635886602");

//建立交通工具
PreparedStatement ps = connection.prepareStatement("");

//处理命令放回结果
int result = 0;

result = ps.executeUpdate("INSERT INTO admin() VALUES('theo2','123456','15879313152','theo_tzq@qq.com');");

//销毁

if (ps != null) {
ps.close();
}
if (connection != null) {
connection.close();
}

System.out.println(result);
}
}

  • 注册驱动
1
2
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);

注册好JAVA工程对MySQL的通道口,接下来创建通道。

注册驱动还可以通过类加载动作来实现。

1
Class.forName("com.mysql.jdbc.Driver");

Driver类中有一个静态代码块,类加载时就能实现注册驱动。我们使用Class.forname(类名)就能启动该类的静态代码块。由于类名是一个字符串,我们很好的可以将这些写在配置文件中。

  • 创建通道
1
2
String url = "jdbc:mysql://localhost:3306/companydb";
Connection connection = DriverManager.getConnection(url, "root", "tzq1635886602");

jdbc:mysql://localhost:3306接通到MySQL服务器下,通过localhost:3306连接到你本地数据库,companydb就是你想操作的数据表了,这里算便也用了学习MySQL时创建的表。DriverManager.getConnection(url,username,password)则是需要登入你的MySQL账号才能建立成功通道。

  • 创建交通工具
1
PreparedStatement ps = connection.prepareStatement("");

connection.prepareStatement("")创建交通工具,这里sql先不写。

  • 输送命令
1
int result = ps.executeUpdate("INSERT INTO admin() VALUES('theo','123456','15879313152','theo_tzq@qq.com');");

ps.executeUpdate(sql)利用交通工具的命令输送SQL语句。返回值时SQL语句成功影响的行数。

  • 销毁
1
2
if (ps != null) 		{ps.close();}
if (connection != null) {connection.close(); }

每个使用到的实现类都要经过close()销毁

以上就实现了一个简单的JAVA工程链接MySQL的任务,执行JAVA后打开admin会发现新增了theo数据。

如果需要连接到Oracle数据库,就只需要改变通道url和注册方式(导入Oracle的专有jar包)。实现起来十分方便。

使用properties文件获取连接数据

使用配置文件.properties来注册驱动和建立通道。

1
2
3
4
5
#JDBC.properties
url=jdbc:mysql://localhost:3306/companydb
driver=com.sql.jdbc.Driver
username=root
password=tzq1635886602

再使用资源版定器绑定属性配置文件,

1
2
3
4
5
6
7
8
9
ResourceBundle bundle = ResourceBundle("JDBC");	//不用加后缀名,会自动去Java工程的目录找该配置文件、
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String username = bundle.getString("username");
String password = bundle.getString("password");
//注册驱动
Class.forName(driver);
//创建通道
Connection connection = DriverManager.getConnection(url,username,password);

也可以通过I/O流与配置文件,这样可以省去多次使用bundle.getString()来获取特定数据。这个坑有待补充。

ps.executeUpdate与ps.execteQuery

语法 说明
int ps.executeUpdate(SQL语句) 负责推送的语句有如INSERT,UPDATE,DElETE等会返回影响了多少行数的命令
ResultSet ps.executeQuery(SQL语句) 负责推送查询语句SELECT.放回的是临时表,在销毁阶段也要注意将ResultSet销毁了.

这里查看如何提取ResultSet返回的对象信息

ps.Batch()与预编译

之前我们造车没有填入参数,PreparedStatement ps = connection.prepareStatement("");,通过添加SQL语句可以为该车指定模板。

1
2
3
4
5
6
7
8
9
10
String SQL = "INSERT INTO admin() VALUES(?,?,?,?)";
PreparedStatement ps = connection.prepareStatement(SQL); //定制好该车承载SQL语句的模板,批处理添加SQL语句时只需要填好?空位即可。
while(int i=0;i<100;i++){
ps.setString(1,"TZQ"+i+"号"); //ps.setString(n,m) n是指第几个问号,m是填充的内容
ps.setString(2,"1234");
ps.setString(3,"12345678910");
ps.setString(4,"qq@com");
ps.addBatch(); //每循环一次一条完整的SQL语句就会压到ps中,循环结束ps身上就会带上一百组SQL命令.
}
ps.executeBatch(); //代替executeUpdate或execteQuery,将装好命令的车送到SQL服务器中.

事务控制

我们之前说过,JDBC获得的结果都是临时表,真实的数据没有被改变。当如果我们想要改变数据库,我们需要用到connection.commit等函数。

1
2
3
4
connection.setAutoCommit(false);
ps.executeUpdate(SQL); //推送SQL命令
connection.commit(); //确认将该影响应用到真实数据库中
connection.rollback(); //确认不将命令的影响应用到真实数据库,还原备份数据库

connection.setAutoCommit()未被设置时,默认为true。这样的话每执行一次execute,数据库的数据就会更新并保存。倘若代码中有两次execute,第二次execute出现了错误,我想要将数据库还原到两次execute前的数据。由于第一次execute正常执行,数据库最新的备份时第一次execute后的,那么我想回溯到最初的数据库就晚了。

因此,设置connection.setAutoCommit(false),可以保证整个代码正常运行后再人为地覆盖掉最初数据。代码中出错了就能通过connection.rollback回溯到最开始版本。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!