JDBC:加载数据库驱动、连接数据库(详细讲解)
加载数据库驱动:
1)由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构;
2)JDBC将整个数据库驱动器在底层抽象成一个对象(即驱动器对象),所有对数据库的操作都可以通过该对象进行;
3)只不过数据库驱动对象和普通的Java对象有所不同:
i. 首先大多数普通的Java对象都是运行该Java程序前不存在的,而是运行的时候临时创建的,程序退出后这些对象也随之释放; ii. 但数据库不一样,数据库往往是不依赖程序运行的,数据库通常都是24小时持续运行,只不过应用程序可以访问它而已,因此数据库对象不能像普通对象那样从无到有地“创建”; iii. 也就是说一个在应用程序运行之前就已经存在并且正常运行的数据库实例如何在Java程序中访问呢?
4)加载数据库驱动的方法:
i. 加载数据库驱动其实就是将操作系统中正在运行的数据库进程(实例)转化成Java对象供Java程序使用(操作数据库); ii. 这里首先要了解以下类驱动器的概念: a. 其实在Java中任何类(Object、String等)想要正常运行,底层都要有相应的驱动器驱动它; b. 但是我们平时看不出来这些类对象需要什么驱动器驱动啊!那是因为这些基础类的驱动器就是JVM虚拟机本身,其驱动的加载是在底层伴随着JVM的启动进行的,都对用户隐藏起来了,所以你看不到; c. 而那些不依赖虚拟机驱动的程序(比如非常典型的就是数据库程序、大多数图形程序,基本都是用C/C++编写,肯定不能靠JVM驱动)想在Java中访问就必须自己手动编写加载驱动器的代码了!! iii. 手动加载类的驱动器——使用Class类的forName静态方法:static Class<?> Class.forName(String className); a. className就是那个不依赖JVM驱动的外部进程的Java类名,这个类名必须符合Java命名规则,例如“com.xxx.Xxx"之类的; b. 你在Java中访问外部进程(将外部进程抽象成Java类或者对象)还一定要有Java类名?那这个类名是不是要事先就准备好咯? c. 是的!并不是任何外部进程都可以被Java访问,想要被Java访问就必须让那个程序自己准备好被Java调用的接口,并事先命名好Java类名才行,而程序准备好的Java接口就是该程序的Java驱动器(让JVM控制程序行为的东西就是Java驱动器); d. 因此数据库厂商必须自行别写好数据库的Java驱动器(称作数据库Connector,即连接器,用于和Java程序连接),并准备好类名,好让Class.forName加载它; iv. forName的加载原理: a. 首先任意一个提供Java接口的程序都会拥有一个Java类名(加载到JVM中就是用该类名来访问该程序实例的); b. 这样的程序运行后,这个Java类名就会被记录到改程序的进程信息中(而改程序的Java接口(驱动器)的句柄也会被记录到进程信息中); c. forName传入该类名以后就会到操作系统的进程表中查找具有该Java类名的线程; d. 找到对应的进程后就会找到该进程对应的Java驱动,然后将该驱动加载进JVM; e. 之后就可以在Java程序中通过这个类名(或者对象)来调用该进程的功能,或者访问进程中的数据了;
5)数据库厂商对驱动类名的命名:
i. 厂商之间各不相同,而且也没有规律可循,因此必须要查阅相应厂商的JDBC手册才能知道; ii. MySQL的命名:com.sql.jdbc.Driver iii. Oracle的命名:oracle.jdbc.driver.OracleDriver iv. 从命名的包路径来看,各个厂商驱动的实现差异较大; 因此MySQL数据库的加载就是:Class.forName("com.sql.jdbc.Driver");
6)准备好数据库连接器:
i. 必须事先将数据库的JDBC-Connector加入到CLASSPATH路径当中,Connector由数据库厂商提供,而MySQL的JDBC-Connector文件是mysql-connector-java-版本号-bin.jar; ii. 原因很简单,数据库的JDBC驱动必须要运行起来才能起到作用,在Java中就是要运行该类,而运行一个类首先会想到命令"java 要运行的类的类名“了,既然要直接执行该命令,那就必须得将目标类的路径添加到CLASSPATH中去才行,因此必须先将上面讲的jar包添加到CLASSPATH路径中去才行; iii. 在Eclipse中这样设置:window -> preferences -> java -> install jres -> 选中当前采用的JRE点击edit -> add external jars -> 选择jar包路径保存即可;
JDBC如何管理加载后的数据库驱动——用DriverManager建立连接:
forName加载完类后如果发现这是一个数据库类的驱动那就会做一定的特殊处理了;
JDBC专门(注意!“专门”)用DriverManager类来管理数据库驱动!也就是说DriverManager类是专门用来管理JDBC驱动的!不要因为类命中没有出现JDBC之类的字眼就认为该类还可以管理其它驱动!不!DriverManager只用来管理JDBC驱动!
加载后的驱动会被抽象成Java类型的对象保存在DriverManager的静态变量driver中;
JDBC规定,一个Java进程只能同时持有(最多持有)一个JDBC驱动,也就是说上述的driver在加载后就有且仅有它一个了,也就是说你一次只能持有一个数据库对象,这就不允许你一个Java进程同时连多个数据库了;
还有一点要强调的是,数据库访问跟HTTP协议的原理一样,都是基于连接的,即查询数据库前必须现建立连接,连接上了以后可以进行多次查询,最后查询完毕后关闭连接才算一次完整的数据库操作,而这里的要素是什么?
i. 那就是一个进程同时(最多)只能建立一个连接;
ii. 这是很显然的,一个进程就代表一个用户,这和HTTP一样,一个用户不能同时向一个服务器建立两个连接,即同一个人要建立第二个连接除非是第一个连接已经断开(上一次服务已经结束);
iii. 因此加载后的驱动器driver是受到同不监视的,即driver是一个同步监视器!
可以看一下DriverManager的getConnection方法,它利用driver来建立和数据库的连接(就跟HTTP中客户端和服务器端建立连接一样一样滴),它是一个同步方法!
public static synchronized Connection DriverManager.getConnection(String url, String user, String passwd);
driver是DriverManager的静态对象,该方法是同步方法,因此driver在该方法中就是同步监视器了;
可以看到这样的结构就是单例模式,JDBC让一个进程最多只能得到一个数据库驱动器!看一下getConnection的参数和返回值:
i. url:要访问的数据库往往都是在远程(处在某个网络节点中),因此需要对数据库进行定位;
a. 这个url的写法有讲究,不同数据库的写法不一样,需要参考数据库的JDBC手册; b. 但是JDBC标准还是规定了该URL的框架,其格式是:jdbc:数据库品牌:具体定位信息(该部分各数据库有差异) c. MySQL的写法:jdbc:mysql://hostname:port/具体数据库名,例如"jdbc.mysql://192.23.21.9:8889/student_data
ii. user和passwd代表用户名和登陆密码,这都是数据库管理员分配的;
iii. 返回值是一个Connection对象,该对象表示Java程序和数据库所建立的一个屋里连接会话,之后可以通过Connection对象和数据库进行交流(操作数据库);
建立连接的示例:Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test", "root", "1234");
一个完整的加载驱动建立连接的代码:
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test");
// 利用conn和数据库交流
原文地址:
https://blog.csdn.net/Lirx_Tech/article/details/51121980
JDBC:加载数据库驱动、连接数据库(详细讲解)的更多相关文章
- jdbc 加载数据库驱动如何破坏双亲委托模式
导读 通过jdbc链接数据库,是每个学习Java web 方向的人必然一开始会写的代码,虽然现在各路框架都帮大家封装好了jdbc,但是研究一下jdbc链接的套路还是很意义 术语以及相 ...
- JDBC 学习笔记(四)—— JDBC 加载数据库驱动,获取数据库连接
1. 加载数据库驱动 通常来说,JDBC 使用 Class 类的 forName() 静态方法来加载驱动,需要输入数据库驱动代表的字符串. 例如: 加载 MySQL 驱动: Class.forName ...
- JDBC加载数据库驱动的方式
JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...
- java 加载数据库驱动
JDBC编程步骤见 JDBC编程步骤 JDBC编程的第一步是加载数据库驱动,使用Class类的forName()方法,Class.forName("com.mysql.jdbc.Driver ...
- ThinkCMF项目部署出现无法加载数据库驱动解决方案
最近有个TP项目刚从从本地部署到阿里云服务器上,出现了无法加载数据库驱动的错误,提示 :( 无法加载数据库驱动: Think\Db\Driver 这里分享一下出现该错误的解决步骤: 首先记得项目部署到 ...
- springboot启动不能加载数据库驱动Failed to determine a suitable driver class
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/G:/sharp/repo ...
- Java-加载数据库驱动,取得数据库连接
在Java中想要进行数据库操作,最重要的两个步骤就是加载数据驱动,然后取得数据库连接. 1.加载 数据库驱动( Class.forName(String className) ): 因为Java是一种 ...
- Java之JDBC 通过加载properties配置文件连接数据库
通常情况下,我们通过JDBC连接数据库的时候,不会将数据库相关配置写死,因为到时候数据库一有改动,就要重新打包部署到服务器或者替换相关的.class文件,这样非常不灵活.因此,咱们一般会通过读取配置文 ...
- atitit.动态加载数据库配置in orm hibernate mybatis
atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象, ...
随机推荐
- java-关于getResourceAsStream
1111class.getClassLoader().getResourceAsStream InputStream ips = testResource.class.getClassLoader() ...
- 学习Keepalived(一)
一.Keepalived 详解 1.Keepalived 定义 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Ke ...
- java弹框
Java弹窗操作 1.任务简介 本博客介绍两种Java弹窗操作的方法,第一个种是通过弹出对话框显示用户输入的信息,第二种是通过用户输入数字的不同打开不同的程序. 2.弹出对话框的操作 1)任务内容编程 ...
- Spring官宣网传大漏洞,并提供解决方案
Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹.所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文.以及 ...
- 用一个文件,实现迷你 Web 框架
当下网络就如同空气一样在我们的周围,它以无数种方式改变着我们的生活,但要说网络的核心技术变化甚微. 随着开源文化的蓬勃发展,诞生了诸多优秀的开源 Web 框架,让我们的开发变得轻松.但同时也让我们不敢 ...
- ARM指令集详解--汇编
1. 汇编 1.1. 通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...
- Day 19: EmberJS 入门指南
编者注:我们发现了有趣的系列文章<30天学习30种新技术>,正在翻译,一天一篇更新,年终礼包.下面是第19天的内容. 到目前为止,我们这一系列文章涉及了Bower.AngularJS.Gr ...
- IDEA 生成返回值对象快捷键Ctrl+Alt+V失效
在IDEA上运用快捷键返回对象(Ctrl+Alt+V)的时候一直无效,找了很久的问题,发现是有快捷键冲突,发现QQ音乐快捷键与IDEA冲突了,把那处改掉或者关闭即可. 所以边敲代码边听音乐也要注意一下
- idea 配置mapper.xml代码提示
从代码跳转mapper文件的插件: 在mapper文件中添加dtd约束: 1.下载dtd约束文件 http://mybatis.org/dtd/mybatis-3-config.dtd http: ...
- PAT B1002写出这个数
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1. 输出格式: 在一行内输出 n 的 ...