关系数据库使得海量信息的管理成为现实,但各家数据库提供的编程接口不尽相同,就连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技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(一百四十六)JDBC的应用原理的更多相关文章

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

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

  2. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  3. Java开发笔记(三十六)字符串的常用方法

    不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...

  4. Java开发笔记(四十六)类的构造方法

    前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...

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

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

  6. Java开发笔记(七十六)如何预防异常的产生

    每个程序员都希望自己的程序稳定运行,不要隔三岔五出什么差错,可是程序运行时冒出来的各种异常着实烦人,令人不胜其扰.虽然可以在代码中补上try/catch语句捕捉异常,但毕竟属于事后的补救措施.与其后知 ...

  7. Java开发笔记(四十)日期与字符串的互相转换

    前面介绍了如何通过Date工具获取各个时间数值,但是用户更喜欢形如“2018-11-24 23:04:18”这种结构清晰.简洁明了的字符串,而非啰里八唆依次汇报每个时间单位及其数值的描述.既然日期时间 ...

  8. Java开发笔记(三十二)字符型与整型相互转化

    前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...

  9. Java开发笔记(三十八)利用正则表达式校验字符串

    前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...

  10. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

随机推荐

  1. LeetCode 1197. Minimum Knight Moves

    原题链接在这里:https://leetcode.com/problems/minimum-knight-moves/ 题目: In an infinite chess board with coor ...

  2. 使用docker部署微服务

    https://my.oschina.net/silenceyawen/blog/1819472 http://jvm123.com/2019/08/docker-shi-yong.html 从201 ...

  3. [RN] React Native 再按一次退出

    实现 React Native 再按一次退出 单页面: ... componentWillMount() { BackHandler.addEventListener('hardwareBackPre ...

  4. 解决mysql无法显示中文/MySQL中文乱码问号等问题

    一般都是编码格式问题 显示编码格式: show variables like'character_set_%'; 将其中Value不是utf8的改为utf8: set character_set_cl ...

  5. DevExpress.XtraEditors.Repository.RepositoryItem.CreateDesigner()

    未将对象引用设置到对象的实例.              此错误的实例(1)   1.   隐藏调用堆栈  在 DevExpress.XtraEditors.Repository.Repository ...

  6. 安装和启动ElasticSearch服务遇到的几个问题

    首先安装和启动服务的教程是参考文章:ES入门之一 安装ElasticSearch 然后在最后的启动es服务时遇到了几个小问题,因此在这里记录一下. 因为我对linux并不是很熟悉,因此文中如果有说错的 ...

  7. c++字符串输入格式总结

    最近的几次笔试中,常常遇到一些输入的问题.下面说明一下几种情况. 1. 第一种就是常见的,输入数字序列,用空格分隔开,直到回车结束.这个之前一开始遇到的时候都是利用getline直接作为字符读入一行处 ...

  8. Mysql之Incorrect string value: '\xF0\x9F\x98\x89 \xE6... 保存emoji表情

    错误信息如下: Incorrect string value: '\xF0\x9F\x98\x89 \xE6...' 问题产生的原因是字符串不兼容4字节的unicode导致的,一般我们常见的表情编码等 ...

  9. Xmanager PowerSuite 6企业版详细安装破解教程,解决评估过期问题(附注册机,全网独家可用),非学校/家庭免费版

    title: "Xmanager PowerSuite 6企业版详细安装破解教程,解决评估过期问题(附注册机,全网独家可用),非学校/家庭免费版" categories: soft ...

  10. 我的Mac上有哪些软件

    工具 Pycharm CE GoLand Chrome 微信 网易云音乐 有道云笔记 iTerm Postman Sublime Text bashrc配置(支持显示git branch以及详细路径信 ...