前言

之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文。

一、使用JDBC连接MySQL

首先,来看一下正常使用Java操纵MySql的简单代码逻辑。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38public static boolean connectionMySqlDemo() {

Connection conn = null;

try {

// 1、动态加载mysql驱动

Class.forName("com.mysql.jdbc.Driver");

// 2、连接数据库

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?"

+ "user=root&password=1234&useUnicode=true&characterEncoding=UTF8");

// 3、声明一个Statement 用来执行sql语句

Statement stmt = conn.createStatement();

// 4、执行sql语句

stmt.executeUpdate("create table student(no_id char(20),name varchar(20),primary key(no_id))");

int result = stmt.executeUpdate("insert into student(no_id,name) values('1','fxleyu')");

if (result > 0) {

ResultSet rs = stmt.executeQuery("select * from student");

while (rs.next()) {

System.out.println(rs.getString(1));

}

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 5、关闭数据库

if (conn != null) {

try {

conn.close();

return true;

} catch (SQLException e) {

e.printStackTrace();

}

}

}

return false;

}

在上述代码中,动态加载数据库驱动那条语句感觉独立于其余代码逻辑。感觉缺少其并无关系(当然缺少了会在链接数据库时报java.sql.SQLException: No suitable driver found for)。

二、疑惑

上述代码很容易理解,除了如下Class.forName("com.mysql.jdbc.Driver");。

正常理解,该语句只是加载把com.mysql.jdbc.Driver加载到JVM中,没不会产生特殊作用。

阅读com.mysql.jdbc.Driver代码,可以发现其中的隐含逻辑。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23public class Driver extends NonRegisteringDriver implements java.sql.Driver {

//

// Register ourselves with the DriverManager

//

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

}

}

/**

* Construct a new driver and register it with DriverManager

*

* @throws SQLException

* if a database error occurs.

*/

public Driver() throws SQLException {

// Required for Class.forName().newInstance()

}

}

原来该类中有静态代码库,其加载到JVM时,会执行该静态代码库。

而该代码块会把该类的对象实例自注册到DriverManager中。

如此第一部分中的第二步就很容易理解了。

1

2

3// 2、连接数据库

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?"

+ "user=root&password=1234&useUnicode=true&characterEncoding=UTF8");

其就是可以根据String来获得上述加载的驱动,从而可以正常访问数据库。

三、余以为

代码的逻辑很重要,而Class.forName("com.mysql.jdbc.Driver");单独来看只是一条孤立的语句。

没有和上下文代码产生显示的关联,这就导致了余在前言中的疑惑。

故,使用Class.forName("com.mysql.jdbc.Driver");来动态注册驱动,会对当前代码逻辑产生不利影响。

正常的逻辑,Class.forName方法就是加载一个指定类,并对该类做一些初始化工作(使用静态代码库),

其不应该做一些其它逻辑,例如动态注册驱动。

如果需要注册驱动时,应该让用户自己使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());来显示注册。

这样代码逻辑会很清晰。

但在这里使用显示注册并不合适。因为当new com.mysql.jdbc.Driver()的动作中,就有类的加载过程。在该过程中,已经把该驱动加载到了DriverManager的列表中。而有显示的注册了一次,故DriverManager的列表会有两个com.mysql.jdbc.Driver实例。也就是说,MySql的jdbc并不适合用来进行显示加载。

当然,也许使用Class.forName("com.mysql.jdbc.Driver");有MySql团队自己的考虑,而我当前视野并没有看到其好处。

四、结束

Talk is cheap, show me the code. 当对某些代码逻辑有疑问时,不妨查看一下相关源码,就会豁然开朗。自勉。P.S. 第三部分的余以为灵感借鉴于“余晟以为”微信公众号,很喜欢他那句“我是这么以为的,当然你也可以那么以为”。

参考

1、使用源码下载路径 http://101.96.8.142/dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.40.tar.gz

java加载mysql驱动_Java 加载数据库驱动(JDBC)相关推荐

  1. java 手动加载数据库驱动_JAVA加载数据库驱动(JDBC)

    JAVA加载数据库驱动(JDBC) 前言 之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文. ...

  2. 加载mysql驱动的语句_sql数据库驱动加载语句

    2011年11月27日学习内容总结 1.使用JDBC连接数据库五个步骤,每个步骤的原因.加载驱动:连接不同的数据库要加载不同的驱动:建立连接:访问一个数据库,要知道IP+端口号+数据库名,此外还有用户 ...

  3. 怎么将pom文件mysql驱动修改版本_mysql 数据库驱动 pom

    用Maven插件生成Mybatis代码/数据库 现在代码管理基本上是采用Maven管理,Maven的好处此处不多说,大家用百度搜索会有很多介绍,本文介绍一下用Maven工具如何生成Mybatis的代码 ...

  4. dbevar mysql 驱动_DBeaver 使用之数据库驱动下载

    简介: DBeaver是一款免费开源的数据库连接工具,可以支持几乎所有的数据库产品. 配置仓库(可选) 驱动管理器 博主安装的版本 DBeaver 7.15 ,该工具并不自带数据库驱动,而是提供了一个 ...

  5. jdbc和mysql做游戏排行榜_MySQL数据库与JDBC编程

    欢迎关注公众号:xfxuezhang MySQL数据库与JDBC编程 JDBC (Java Database Connectivity) DDL(Data Definition Language,数据 ...

  6. 连接oracle的驱动包,连接oracle数据库驱动包

    JDBC与JAVA数据库编程 一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2.  ...

  7. java表单 mysql 乱码_java web当中表单提交到后台出现乱码的解决方法

    1.如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么 ...

  8. java 不能执行mysql存储过程_java无法执行mysql中的函数及存储过程的.sql备份文件...

    需求:用java程序执行[包含数据&结构&函数&存储过程]的.sql备份文件 问题记录: 1.在执行完insert类型的语句后,中文内容会显示乱码. 解决:将mysql参数中c ...

  9. java如何向mysql插入_java中怎么向数据库插入数据 ?

    展开全部 Java程序向数据库中插入数据,代码如下://首先创建数据库,(access,oracle,mysql,sqlsever)其中之一,32313133353236313431303231363 ...

  10. java如何映射mysql枚举_java中自定义枚举enum映射到mysql数据库字段处理器handler

    mybatis中默认的处理枚举类型的handler有 如果要处理一些特殊的情况下字段内容字段的转换,需要自定义处理器,比如如下例子要处理数据库中默认字段值为""空字符串的问题 im ...

最新文章

  1. 使用MyBatis的Generator自动创建实体类和dao的接口与xml
  2. mysql Slave is not configured or failed to initialize properly. You must at least set --server-id
  3. 小米CC开机动画公布:扑面而来的青春活力
  4. 开源界也要注意,Apache 基金会与 GitHub 都受美国法律约束
  5. 定积分在计算机中的应用,计算机模拟定积分的定义
  6. 用IT技术玩金融系列文章
  7. 如何在苹果Mac上截屏或录制屏幕?
  8. WPS vba宏插件安装包
  9. 面试计算机人员试题及答案,【仁宝电脑员工笔试试题及答案】 - 面试网
  10. kali下域名解析失败
  11. 杨辉三角(C语言简单版)
  12. 高等数学--高阶导数与隐函数,参数方程(三)
  13. Shiro 实战教程(全)
  14. Flutter中Drat虚拟机服务介绍 --- VmService
  15. 5G商用大幕拉开 下一个风口:行业新应用、新业务或新商业模式?
  16. 【毕业设计 | 开源】我把商业级仓库管理系统 ModernWMS 开源了
  17. mongodb查询语法
  18. 如何在visual studio 2017 中安装python工具
  19. Linux下解决conio.h的问题
  20. Java Https请求工具类

热门文章

  1. 在电脑上如何用桌面便签进行日程管理?
  2. Qt之QPA(linuxfb 一)
  3. java安卓屏幕护眼效果好_当前安卓机自带的护眼模式,比护眼大师的好嘛?
  4. Maven的setting配置详解
  5. vue后台管理做适配的最佳方案,你知道吗
  6. Poker2 的爱与愁-入手两周,小小体会
  7. Poker Ⅱ 机械键盘使用说明书
  8. java FTPSClient 上传下载带证书的ftps服务器
  9. 苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法
  10. yolov7调用大华工业相机进行识别