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. 怎么理解 Redis 事务?

    1)事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 2)事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执 ...

  2. Mybatis 开发 dao 的方法

    1.分析SqlSession使用范围 1.1.SqlSessionFactoryBuilder 通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory ...

  3. 学习heartbeat-01简介

    1.Heartbeat介绍 Heartbeat 是一个基于Linux开源的,被广泛使用的高可用集群系统,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内 ...

  4. (stm32f103学习总结)—stm32定时器中断

    一.定时器介绍 STM32F1的定时器非常多,由2个基本定时器(TIM6.TIM7).4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1.TIM8)组成.基本定 时器的功能最为简单,类似 ...

  5. Vue中获取元素宽高

    <div ref="init"></div> 写在 页面 方法 部分 这里的 offsetHeight 是返回元素的宽度(包括元素宽度.内边距和边框,不包括 ...

  6. Mac 安装WordPress

    Mac 安装WordPress 一.环境要求 PHP 5.2.4或更新版本 MySQL 5.0或更新版本 WebServer(可以选择Apache.nginx等支持PHP的,这里我选择Apache) ...

  7. 《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动.在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂没 ...

  8. 原生js实现架子鼓特效

    这是代码完成的效果,按下abcd会出现对应的架子鼓音乐的效果. 简单的介绍下代码思路,html和css部分就不多说了. 重要的是js部分. 大致是这样的, 首先获取到所有的按钮为一个数组,然后遍历整个 ...

  9. sticker-footer 布局

    sticker-footer 1.嵌套层级不深,可直接继承自 body width:100%: height:100%; // html <body> <div id="s ...

  10. c++实现中介者模式--虚拟聊天室

    内容: 在"虚拟聊天室"实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下: 1. 新的具体聊天室中发送的图片大小不得超过20M. 2. 新的具体聊天室中发送的文字长度不 ...