关系数据库使得海量信息的管理成为现实,但各家数据库提供的编程接口不尽相同,就连SQL语法也有所差异,像Oracle、MySQL、SQL Server都拥有自己的开发规则,倘若Java针对每个数据库单独做一套方法,这些数据库操作方法将变得又庞大又冗余。为了解决不同数据库各自为政的问题,Java设计了统一的JDBC规范,只要程序员按照JDBC的方法操作,那么不管什么数据库都能在JDBC框架下正常处理。

JDBC全称“Java DataBase Connectivity”,意思是Java语言的数据库连接管理。JDBC由JDK内部的数据库管理工具类组成,它提供了标准的数据库操作方法,帮助程序员使用统一的方式开展数据库编程,从而提高了数据库编程的开发效率。然而因为JDBC屏蔽了相关的内部细节,所以在操作具体数据库之前,需要额外引入对应的数据库连接器,也就是导入该数据库的jar包。

以MySQL为例,它的Java版本连接器可前往官网下载,下载页面是https://dev.mysql.com/downloads/connector/j/,在该页面的下方选择操作系统“Platform Independent”之后,会显示两种压缩包(tar.gz格式与zip格式),在其中一种的右边单击Download按钮开始下载。下载完毕将文件解压,找到里面的Java连接器如mysql-connector-java-8.0.16.jar,把jar文件添加到Java工程的依赖库,之后即可在Java代码中操作MySQL数据库了。

对于每个数据库来说,JDBC都要求提供下列四个要素:

1、数据库的驱动:要连接哪种数据库,Oracle还是MySQL,这得通过驱动名称来区分。MySQL的驱动类型是com.mysql.cj.jdbc.Driver。

2、数据库的连接地址:如同http地址那样,数据库也有入口的访问地址,该地址包含协议、IP、端口、数据库实例等信息。就MySQL而言,它的连接地址格式形如“jdbc:mysql://IP地址:端口号/数据库实例名称”,注意新版的MySQL还需在地址后面补充时区信息,否则运行会报错。下面是一个完整的MySQL连接地址例子:

jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8

3、数据库的用户名:登录数据库时候的用户名称,不同用户拥有不同的权限。

4、数据库的密码:与用户名对应的密码,登录之时会校验用户名与密码是否正确。

只有正确提供上述四个要素,方能通过JDBC连接指定的数据库。完整的连接过程分成两个步骤:加载数据库驱动、根据用户名和密码连接数据库,分别介绍如下:

1、加载数据库驱动

由于数据库的驱动以字符串展现,因此必须借助于反射技术加载驱动,加载数据库驱动的代码示例如下:

String driver_class = "com.mysql.cj.jdbc.Driver"; // 数据库的驱动类

try {

Class.forName(driver_class); // 加载数据库的驱动(包含初始化动作)

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

正常情况下,程序只要在运行时加载一次驱动,加载动作本身包含了初始化操作,后续就不必重复加载驱动了。

2、根据用户名和密码连接数据库

连接数据库的本质是获取该数据库的可用连接,调用DriverManager管理类的getConnection方法,输入连接地址、用户名、密码三个参数,校验通过即可获得当前的数据库连接,也就是Connection对象。获取数据库连接的代码例子如下所示:

// 数据库的连接地址。MySQL需要在地址后面添加时区,否则会报错

String dbUrl = "jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8";

String dbUserName = "root"; // 数据库的用户名

String dbPassword = "222@@@wwwWWW"; // 数据库的密码

try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {

// 此处省略了详细的数据库操作代码

} catch (SQLException e) {

e.printStackTrace();

}

上面代码之所以将Connection对象的赋值动作放到try的圆括号内部,是因为Connection类实现了AutoCloseable接口,意味着只要把它放入try语句,那么无论是否发生异常,系统都会自动调用close方法关闭数据库连接。除了close方法,Connection还提供了下面几个方法:

isClosed:获取数据库的连接状态,返回true表示连接已关闭,返回false表示连接未关闭。

getCatalog:获取该连接的数据库实例名称。

getAutoCommit: 获取数据库的自动提交标志。如果该标志设置为true,则每次执行一条SQL语句,系统都会自动提交该语句的修改内容。

setAutoCommit:设置自动提交的标志,默认为true表示自动提交。

commit:提交数据库的修改。

rollback:回滚数据库的修改。注意要先关闭自动提交,才能通过rollback方法回滚事务。否则报错“Can't call rollback when autocommit=true”。

createStatement:创建数据库操作的执行报告。

prepareStatement:创建数据库操作的预备报告。

接下来把以上两个连接步骤串起来,形成以下的数据库连接代码:

String driver_class = "com.mysql.cj.jdbc.Driver"; // 数据库的驱动类

// 数据库的连接地址。MySQL需要在地址后面添加时区,否则会报错

String dbUrl = "jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8";

String dbUserName = "root"; // 数据库的用户名

String dbPassword = "222@@@wwwWWW"; // 数据库的密码

try {

Class.forName(driver_class); // 加载数据库的驱动(包含初始化动作)

// 根据连接地址、用户名、密码来获取数据库的连接

try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {

String desc = String.format("数据库%s的连接状态为“%s”,已%s自动提交。",

conn.getCatalog(), // 获取该连接的数据库实例名称

conn.isClosed() ? "关闭" : "连上", // 获取数据库的连接状态

conn.getAutoCommit() ? "开启" : "关闭" // 获取数据库的自动提交标志

);

System.out.println(desc);

} catch (SQLException e) {

e.printStackTrace();

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

运行上面的连接代码,观察到下面的输出日志,由日志可见成功连上了MySQL数据库。

数据库study的连接状态为“连上”,已开启自动提交。

java jdbc close原理_Java开发笔记(一百四十六)JDBC的应用原理相关推荐

  1. java 文件缓冲区_Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  2. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

  3. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  4. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  5. Android开发笔记(二十六)Java的容器类

    容器的分类 集合(Set/HashSet) 集合中的元素是没有顺序的,而且不可以重复.这意味着,集合只能遍历而无法通过索引访问指定元素,并且如果重复添加相同值将不会增大集合.因为Set只是接口,所以实 ...

  6. Android开发笔记(五十六)摄像头拍照

    相机Camera Camera是直接操作摄像头硬件的工具类.常用的方法如下: getNumberOfCameras : 获取本机的摄像头数目 open : 打开摄像头,默认打开后置摄像头.如果有多个摄 ...

  7. Android开发笔记(四十六)手机相关事件

    手机定位 有一类事件必须依赖于手机信号方能触发,如果把设备中的sim卡拔出,或者该设备本身不支持sim卡(如ipad),那么这类事件将永远不会被触发.在Android中,这类事件包括定位事件和手机信号 ...

  8. Android开发笔记(三十六)展示类控件

    View/ViewGroup View是单个视图,所有的控件类都是从它派生出来:而ViewGroup是个视图组织,所有的布局视图类都是从它派生出来.由于View和ViewGroup是基类,因此很少会直 ...

  9. java 流式_Java开发笔记(七十二)Java8新增的流式处理

    通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...

  10. java有常函数_Java开发笔记(十一)常见的数学函数

    前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≈.求绝对值的"| |".开平方的"√ ̄", ...

最新文章

  1. 神策数据入选“2019 全球企服科技创新 Top50”
  2. linux双机(多机)自动互备份方案
  3. RabbitMq集群使用Nginx做负载均衡
  4. 除了游戏和医疗,腾讯区块链还准备做什么?
  5. java h2 derby_嵌入式H2数据库的Spring配置以进行测试
  6. android146 360 病毒查杀
  7. Flutter AnimatedList 使用解析
  8. ROS笔记(12) Rviz
  9. 下列哪个可做 Android 数据存储,Android应用开发试题
  10. 何使用ultraiso软碟通制作u盘启动盘(转载)
  11. 浏览器兼容的JS写法总结
  12. 基于已有集群动态发现方式部署 Etcd 集群
  13. centos6安装PHP5.4
  14. X5内核视频之问答汇总
  15. 带时间窗的车辆路径规划问题(VRPTW)
  16. 拼多多sdk php,学习猿地-【扩展分享】拼多多 API SDK【拼多多开放平台】
  17. 重装系统时的硬盘格式化
  18. 最大似然函数,琴生不等式
  19. 浏览器无法访问hdfs界面问题
  20. 把日期横杠转化为斜杠

热门文章

  1. 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】
  2. C# dataTable实用例
  3. 如何解决苹果Mac安装Ps错误代码182?
  4. inDesign教程,如何创建杂志风标注?
  5. InDesign教程,如何更改字体和字体大小?
  6. 矢量绘图设计工具:Sketch 79 for mac
  7. Snagit 2021 for mac截图工具 v2021.4.2(98044)汉化版
  8. OpenLayers学习笔记(十一)— 飞机速度矢量线预测
  9. 常见异常与错误 翻译
  10. 全新定义!免费开源ERP平台如何玩转工业互联网