一、引言

平时连接数据库的时候首先要加载jdbc驱动,这一步骤其实有三种方式,他们的区别?优劣?

二、快速了解三种加载方式

  1. Class.forName(“com.mysql.jdbc.Driver”);

  2. DriverManager.registerDriver(new com.mysql.jdbc.Driver())

  3. System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);

三、代码实例

1、Class.forName(“com.mysql.jdbc.Driver”)最常用

 try{
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
Connection conn=DriverManager.getConnection(url,"username","password");
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from tablename");
while(rs.next()){//不断指向下一条记录
System.out.println("DeptNo:"+rs.getInt(1));
System.out.println("\tDeptName:"+rs.getString(2));
System.out.println("\tLOC:"+rs.getString(3));
}
rs.close();
stmt.close();
conn.close();
}catch(ClassNotFoundException e){
System.out.println("找不到指定的驱动程序类!");
}catch(SQLException e){
e.printStackTrace();
}

提问:Class.forName(...)不是只是加载类吗,并没有看见注册的操作,为什么这样就注册了?

经由博友@梁桦的提醒,去看了下源码才发现,原来Driver类的静态代码块完成了注册操作(forName加载类的时候,会执行一次静态代码块)

源码如下:

  static
{
try
{
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

2、DriverManager,看起来比较直观的一种方式,注册相应的db的jdbc驱动,在编译时需要导入对应的lib

DriverManager.register(new com.mysql.jdbc.Driver());

但是注意了,正如方法1里所说,Driver类的静态代码块会注册一次,那么此时new Driver的时候就会注册一次,然后外层又会注册一次,所以注册了两次驱动,实在没必要,不过直接 new com.mysql.jdbc.Driver() 却是能达到效果:

try{
new com.mysql.jdbc.Driver();//创建driver对象,加载数据库驱动
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
Connection conn=DriverManager.getConnection(url,"username","password");
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from tablename");
while(rs.next()){//不断指向下一条记录
System.out.println("DeptNo:"+rs.getInt(1));
System.out.println("\tDeptName:"+rs.getString(2));
System.out.println("\tLOC:"+rs.getString(3));
}
rs.close();
stmt.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}

3、通过系统的属性设置System.setProperty(“jdbc.driver”,”com.mysql.jdbc.Driver”);

 try{
System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系统属性指定数据库驱动
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议
Connection conn=DriverManager.getConnection(url,"username","password");
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from tablename");
while(rs.next()){//不断指向下一条记录
System.out.println("DeptNo:"+rs.getInt(1));
System.out.println("\tDeptName:"+rs.getString(2));
System.out.println("\tLOC:"+rs.getString(3));
}
rs.close();
stmt.close();
conn.close();
}catch(SQLException e){
e.printStackTrace();
}

四、总结

  第二种与第三种注册的方法看起来更加的直接与好理解。

  但是,第一种与第三种方法可以脱离jdbc的驱动进行编译,第二种方法是不可以的,它一定要有jdbc的驱动类才可以通过编译,这样做十分依赖Jar包,一旦jar包找不到,编译时期就会报错,并且为程序换数据库会带来麻烦,并且如上所说加载了两次驱动,虽然这并不影响我们程序,但是这样做实在是没有必要,还会影响程序的运行。

  第三种虽然也可以脱离,但是方法参数设置相对来说较为复杂,特点是它可以设置多个驱动,所以在加载单个驱动时,一般采用第一种方法(Class.forName(...))。

  第一种方法是通过Class把驱动类Driver先装载到java的虚拟机中,加载过程中利用静态代码块注册驱动,好处在于能够在编译时不依赖于特定的JDBC Driver库,也就是减少了项目代码的依赖性,而且也很容易改造成从配置文件读取JDBC配置,从而可以在运行时动态更换数据库连接驱动。

java加载jdbc驱动三种方式的比较的更多相关文章

  1. java加载配置文件的三种方式

    比如我们要加载db.properties文件 如图: 比如我们要加载source目录下的db.properties文件.就有以下几种方式 第一种是文件io流: public static void l ...

  2. JavaScript判断图片是否加载完成的三种方式

    JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...

  3. Entity Framework加载数据的三种方式。

    MSDN文章Loading Related Entities 有 Eagerly Loading Lazy Loading Explicitly Loading 三种方式. 而看到查询中包含Inclu ...

  4. easyui datagrid加载数据的三种方式

    1.加载本地数据 var obj = {"total":2,"rows":[{id:"1",name:"一"},{id: ...

  5. JavaScript判断图片是否加载完成的三种方式 (转)

    一.load事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE HTML> <html> <head>      ...

  6. JQuery的几种页面加载完执行三种方式

      jquery加载页面的方法(页面加载完成就执行) 1. $(function(){ $("#a").click(function(){ //adding your code h ...

  7. java 加载图片的几种方式

    项目目录--src--testTable--image--active.gif | |_Task.class 方法1:通过项目目录访问. String a = System.getProperty(& ...

  8. 异步加载js的三种方法

    js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...

  9. [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

    接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...

随机推荐

  1. 『浅入深出』MySQL 中事务的实现

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝 ...

  2. delphi ,安装插件

    一.安装 DevExpress52(VCL+Demo+Help+汉化ini)cxGrid技巧:DBGRIDEH 安装:点击devcl52.exe,安装,安装路径到D:\Program Files\Co ...

  3. What is Grammar?

    What is Grammar? And why grammar is your friend… Grammar(noun): the structure and system of a langua ...

  4. color depth 色彩深度 像素深度

    Screen.colorDepth - Web APIs | MDN https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDept ...

  5. shader常用

    1 模型空间转裁剪空间 UnityObjectToClipPos(v.vertex) 2 模型空间转世界空间 mul( unity_ObjectToWorld, v.vertex ) 3 雾三件套 U ...

  6. appium入门基础知识

    1.概念区分: 1)IOS-UIAutomation:随着iOS4.0的发布,苹果公司同时发布了一个名为UIAutomation的测试框架,它可以用来在真实设备和iPhone模拟器上执行自动化测试 学 ...

  7. WSGI基础知识(转)

    add by zhj: WSGI全称Web Server Gateway Interface,即Web网关接口.其实它并不是OSI七层协议中的协议,它就是一个接口(即函数)而已,而WSGI规定了该接口 ...

  8. Flask(1)- 主流web框架、初识flask

    一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...

  9. 【CODEFORCES】 B. Random Teams

    B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. python 多进程使用Queue通信的例子

    import time from multiprocessing import Process,Queue MSG_QUEUE = Queue(5) def startA(msgQueue): whi ...