【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

JDBC为什么使用反射加载驱动

原创 2016年08月30日 17:04:30

一直不太明白在使用JDBC的时候用Class.forName("com.mysql.jdbc.Driver")去加载驱动,就谷歌了一下,得到如下答案:


前言

JDBC源码地址
还有
在解释具体原因之前先简单看下Class.forName做了什么。假设一个类以前从来没有被装进内存过,Class.forName(String className)这个方法会做以下几件事情:
1、装载。将字节码读入内存,并产生一个与之对应的java.lang.Class类对
2、连接。这一步会验证字节码,为static变量分配内存,并赋默认值(0或null),并可选的解析符号引用(这里不理解没关系)
3、初始化。为类的static变量赋初始值,假如有static int a = 1;这个将a赋值为1的操作就是这个时候做的。除此之外,还要调用类的static块。(这一步是要点)
Class.forName(String className)方法会将这三步都做掉,

基本原因

首先,上面一段代码的主要作用,是在运行期以反射的方式来检查JDBC驱动的主类com.mysql.jdbc.Driver是否存在,若不存则表示运行环境中没有这个驱动,进入catch段。如果你确定一定以及肯定它会存在,可以直接写成

import com.mysql.jdbc.Driver;

效果基本是一样的(只是在编译期及运行期要都保证此类存在classpath中)
所以,以反射形式加载的一个好处是当驱动jar包不存在时,我们可以做更多的操作。(要知道,在很久很久以前,jdbc驱动一般都是放在运行环境的classpath中的,如tomcat/lib)

另一个原因

如果你是一个有追求的程序员,那么另外一个很重要的原因是解耦。
首先要明白JDBC是Java的一种规范,通俗一点说就是JDK在java.sql.*下提供了一系列的接口(interface),但没有提供任何实现(也就是类)。 所以任何人都可以在接口规范之下写自己的JDBC实现(如MySQL)。而若调用者也只调用接口上的方法(如我们),那么当未来有任何变更需要时(例如要从MySQL迁移至Oracle),则理论上不需要对代码做任何修改就能直接切换(可惜SQL语法没能统一规范)
这意味着什么?意味着你的代码中不应该引用任何与实现相关的东西,你的代码只知道java.sql.*,而不应该知道com.mysql.*或是com.oracle.*,以避免或减少未来切换数据源时对代码的变更。
注意,我们使用的所有其他API包括Connection/Statement/ResultSet等都是java.sql.*的东西,甚至com.mysql.jdbc.Driver类也是:

package com.mysql.jdbc;
public class Driver ... implements java.sql.Driver { ...}

因此,直接import com.mysql.jdbc.Driver;
违反了开闭原则(OCP,对扩展开放,对修改关闭)。(有人说我用反射也必须要修改代码呀,事实上你可以将类名字符串存储至.properties文件,和数据库用户名密码放在一起,就像Hibernate做的那样)

原文地址:https://segmentfault.com/q/1010000000315618/a-1020000000317423
http://www.ticmy.com/?p=249

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

老调重弹:JDBC系列 之 <驱动加载原理全面解析>

JDBC 驱动加载原理详解,Driver功能,DriverManager,jdbc.drivers,JDBC URL

jdbc加载驱动 Class.forName()的作用

在学习jdbc时,我们首先学到的是最简单的helloWorld入门,但是为什么要这样呢 ? //注册驱动 Class.forName("com.mysql.jd...

JDBC加载驱动语句和建立数据库连接语句汇总

JDBC加载驱动语句和建立数据库连接语句汇总 jdbc开发过程中,通用的步骤:首先加载驱动程序;然后获得数据库的连接。然而各种数据库的加载驱动和获得数据库语法都各不相同,而且极易难度强。因此,有必...

利用Class.forName()将驱动类加载到JVM

Class.forName()作用: 1、作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。最熟悉的就是JDBC连接数据库的时候加载驱动类。注册一个数据库驱动,将驱动加载到当...
  • B_H_L
  • B_H_L
  • 2012-05-10 20:04
  • 1993

J2EE学习篇之--JDBC详解

今天我们来说一下关于JDBC的相关知识,关于JDBC我想大家都不陌生了,而且我记得早就开始使用它了,记得那是大二的时候做课程设计,但是那时候是为了完成任务,所以遇到问题就google,那时候也没有时间去整理,所以这次就来详细说一下关于JDBC的知识 摘要: JDBC(Java Data Base Connectivity,java数据库连接)

mysql jdbc驱动源码分析(获取链接 connection)

在前一篇中我们分析了驱动的加载,这篇我们看看数据库链接的获取即Connection的获取,废话少说进入正题。 一、获取链接的方式有三种: 1、getConnection(String url,ja...

j2ee07:jdbc01:Properties对象、四大参数、批量删除、基本的增删改查

第一:jdbc的四大参数: jdbc的本质是一套API(应用程序的接口。有driverManager类,connection接口,statement接口,resultset接口)一:驱动管理1.qq:是一个应用程序,在项目执行起来之后会产生大量的数据2.应用程序:1.完成某些特定的功能。2完成对数据的管理3.数据库:保存应用程序需要的数据和产生的数据。应用程序与数据库互动4.数据要选放到应用程序中,然

参考Mysql JDBC 驱动源码实现自定义驱动

一、分析Mysql JDBC 平常我们直接以JDBC连接数据库代码基本都如下: Connection con = null; //创建用于连接数据库的Connection对象 try { Class.forName("com.mysql.jdbc.Driver");// 加载M

深入理解Java类加载器(1):Java类加载原理解析

1 基本信息   每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制...
  • clypm
  • clypm
  • 2016-05-19 09:38
  • 363

jdbc的那点小事

jdbc的那点小事 2011年01月20日   1.Class.forName(),是根据类的名字将类装载到虚拟机里面了。把类装载到虚拟机里面和创建一个类的实例是不一样的,创建一个实例就会有一个   实例产生,但是把类装载到虚拟机里面就不一定会有实例产生。   2.通过DriverManager.registerDriver()和System.setProperty()方式,会直接将驱动放入驱动列表里面。   3.通过Class.forName()方式,是将类加载到虚拟机里面,存在在虚拟机中的类的静态代码块会立即被虚拟机执行,所有的数据库开发商开发的驱动   类Dri
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)