1. 加载数据库驱动:

    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包路径保存即可;
  2. JDBC如何管理加载后的数据库驱动——用DriverManager建立连接:

    1. forName加载完类后如果发现这是一个数据库类的驱动那就会做一定的特殊处理了;

    2. JDBC专门(注意!“专门”)用DriverManager类来管理数据库驱动!也就是说DriverManager类是专门用来管理JDBC驱动的!不要因为类命中没有出现JDBC之类的字眼就认为该类还可以管理其它驱动!不!DriverManager只用来管理JDBC驱动!

    3. 加载后的驱动会被抽象成Java类型的对象保存在DriverManager的静态变量driver中;

    4. JDBC规定,一个Java进程只能同时持有(最多持有)一个JDBC驱动,也就是说上述的driver在加载后就有且仅有它一个了,也就是说你一次只能持有一个数据库对象,这就不允许你一个Java进程同时连多个数据库了;

    5. 还有一点要强调的是,数据库访问跟HTTP协议的原理一样,都是基于连接的,即查询数据库前必须现建立连接,连接上了以后可以进行多次查询,最后查询完毕后关闭连接才算一次完整的数据库操作,而这里的要素是什么?

      i. 那就是一个进程同时(最多)只能建立一个连接;

      ii. 这是很显然的,一个进程就代表一个用户,这和HTTP一样,一个用户不能同时向一个服务器建立两个连接,即同一个人要建立第二个连接除非是第一个连接已经断开(上一次服务已经结束);

      iii. 因此加载后的驱动器driver是受到同不监视的,即driver是一个同步监视器!

    6. 可以看一下DriverManager的getConnection方法,它利用driver来建立和数据库的连接(就跟HTTP中客户端和服务器端建立连接一样一样滴),它是一个同步方法!

      public static synchronized Connection DriverManager.getConnection(String url, String user, String passwd);

      driver是DriverManager的静态对象,该方法是同步方法,因此driver在该方法中就是同步监视器了;

      可以看到这样的结构就是单例模式,JDBC让一个进程最多只能得到一个数据库驱动器!

    7. 看一下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对象和数据库进行交流(操作数据库);

    8. 建立连接的示例:Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test", "root", "1234");

  3. 一个完整的加载驱动建立连接的代码:

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:加载数据库驱动、连接数据库(详细讲解)的更多相关文章

  1. jdbc 加载数据库驱动如何破坏双亲委托模式

    导读      通过jdbc链接数据库,是每个学习Java web 方向的人必然一开始会写的代码,虽然现在各路框架都帮大家封装好了jdbc,但是研究一下jdbc链接的套路还是很意义     术语以及相 ...

  2. JDBC 学习笔记(四)—— JDBC 加载数据库驱动,获取数据库连接

    1. 加载数据库驱动 通常来说,JDBC 使用 Class 类的 forName() 静态方法来加载驱动,需要输入数据库驱动代表的字符串. 例如: 加载 MySQL 驱动: Class.forName ...

  3. JDBC加载数据库驱动的方式

    JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...

  4. java 加载数据库驱动

    JDBC编程步骤见 JDBC编程步骤 JDBC编程的第一步是加载数据库驱动,使用Class类的forName()方法,Class.forName("com.mysql.jdbc.Driver ...

  5. ThinkCMF项目部署出现无法加载数据库驱动解决方案

    最近有个TP项目刚从从本地部署到阿里云服务器上,出现了无法加载数据库驱动的错误,提示 :( 无法加载数据库驱动: Think\Db\Driver 这里分享一下出现该错误的解决步骤: 首先记得项目部署到 ...

  6. springboot启动不能加载数据库驱动Failed to determine a suitable driver class

    SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/G:/sharp/repo ...

  7. Java-加载数据库驱动,取得数据库连接

    在Java中想要进行数据库操作,最重要的两个步骤就是加载数据驱动,然后取得数据库连接. 1.加载 数据库驱动( Class.forName(String className) ): 因为Java是一种 ...

  8. Java之JDBC 通过加载properties配置文件连接数据库

    通常情况下,我们通过JDBC连接数据库的时候,不会将数据库相关配置写死,因为到时候数据库一有改动,就要重新打包部署到服务器或者替换相关的.class文件,这样非常不灵活.因此,咱们一般会通过读取配置文 ...

  9. atitit.动态加载数据库配置in orm hibernate mybatis

    atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象, ...

随机推荐

  1. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  2. css浮动的"巨坑"与完美解决办法

    浮动 1 浮动概念 如果想实现网页中排版布局,比如一行内显示对应的标签元素,可以使用浮动属性.浮动可以实现元素并排. 块转行内日块也可以实现一行显示,不过存在空白折叠现象 float 浮动 属性值 描 ...

  3. C++ - free()函数释放内存后的指针行为

    一个指针释放后不置空的后果: free(p)之后原本那块内存的数据已经被释放了,内存重新收回.但此时的指针变量依然指向那块内存,在以后的代码中若不小心继续调用指针变量,会出现不可预料的错误. 不置空的 ...

  4. C语言之基本组成(知识点6)

    一.C程序基本组成 C程序是由语句组成的,通常包括一个或多个函数,其中有且只有一个函数称为 主函数,其函数名为main. 二.C程序的组成特点: 1.每个C程序由一个或多个函数组成.每个C程序有且仅有 ...

  5. react开发教程(三)组件的构建

    什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...

  6. CCF201512-2消除类游戏

    问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...

  7. CCF201409-2 画图

    问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩形的例子.第一个矩形是 ...

  8. sql语句中 left join,right join,inner join 的区别

    看到了sql,发现好久没写sql甚是想念哈哈哈哈,好多当时学的东西都忘了,当时总结的好多的文档也怎么都找不到了..... 言归正传,找到了一张图感觉描述的还挺清晰,先贴图,再说说自己的理解. 1.LE ...

  9. 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

    MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...

  10. css3种不知道宽高的情况下水平垂直居中的方法

    第一种:display:table-cell 组合使用display:table-cell和vertical-align.text-align,使父元素内的所有行内元素水平垂直居中(内部div设置di ...