JDBC
JDBC概念先导
JDBC(Java DataBase Connectivity)即Java语言连接数据库,本质上是一套位于java.sql.*
下的接口。因为每种数据库的底层实现原理都不一致,如Oracle、MySQL,为了统一能够被Java调用,SUN制定了JDBC
这套接口,其他数据库厂家就需要实现接口的实现类。
JDBC实现的过程
- Driver注册
在JAVA工程中注册好Driver,即为MySQL服务器打开通道口
- 建立通道
通过JDBC【java.sql.DriverManager】在JAVA工程与MySQL服务器之间建立通道,以便于JAVA工程能向MySQL发送命令,MySQL能向JAVA工程返回结果。
- 实现交通工具
Connection接口实现类【PreparedStatement接口实现类】能作为JAVA工程和MySQL之间通信的工具。
- 执行并返回结果
Connection接口实现类到达MySQL,MySQL收到SQL命令后执行,将操作结果放回Connection接口实现类中。
- 释放资源
在工作完成后,需要对所有对象进行销毁,主要包括以下实现类:Connection【管理连接通道】
,PreparedStatement【管理交通工具】
,ResultSet【查询命令返回的临时表】
JDBC你需要知道的类
- java.sql.DriverManager
这个类存放在JDK1.8下,负责将数据库厂商提供的Driver接口进行注册,以便建立通道。
- java.sql.Connection
负责管理Java工程与数据库服务器之间的连接通道
- java.sql.PreparedStatement
负责管理在连接通道上进行往返的交通工具
- java.sql.ResultSet
负责管理数据库服务器返回的临时表,即返回给JAVA工程的处理结果。
JDBC开发
1 | package com.theo; |
- 注册驱动
1 | Driver driver = new com.mysql.jdbc.Driver(); |
注册好JAVA工程对MySQL的通道口,接下来创建通道。
注册驱动还可以通过类加载动作来实现。
1 Class.forName("com.mysql.jdbc.Driver");
Driver
类中有一个静态代码块,类加载时就能实现注册驱动。我们使用Class.forname(类名)
就能启动该类的静态代码块。由于类名是一个字符串,我们很好的可以将这些写在配置文件中。
- 创建通道
1 | String url = "jdbc:mysql://localhost:3306/companydb"; |
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 | if (ps != null) {ps.close();} |
每个使用到的实现类都要经过close()
销毁
以上就实现了一个简单的JAVA工程链接MySQL的任务,执行JAVA后打开admin会发现新增了theo数据。
如果需要连接到Oracle数据库,就只需要改变通道url和注册方式(导入Oracle的专有jar包)。实现起来十分方便。
使用properties文件获取连接数据
使用配置文件.properties
来注册驱动和建立通道。
1 | #JDBC.properties |
再使用资源版定器绑定属性配置文件,
1 | ResourceBundle bundle = ResourceBundle("JDBC"); //不用加后缀名,会自动去Java工程的目录找该配置文件、 |
也可以通过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 | String SQL = "INSERT INTO admin() VALUES(?,?,?,?)"; |
事务控制
我们之前说过,JDBC获得的结果都是临时表,真实的数据没有被改变。当如果我们想要改变数据库,我们需要用到connection.commit
等函数。
1 | connection.setAutoCommit(false); |
当connection.setAutoCommit()
未被设置时,默认为true。这样的话每执行一次execute,数据库的数据就会更新并保存。倘若代码中有两次execute,第二次execute出现了错误,我想要将数据库还原到两次execute前的数据。由于第一次execute正常执行,数据库最新的备份时第一次execute后的,那么我想回溯到最初的数据库就晚了。
因此,设置connection.setAutoCommit(false)
,可以保证整个代码正常运行后再人为地覆盖掉最初数据。代码中出错了就能通过connection.rollback
回溯到最开始版本。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!