java加载mysql驱动_Java 加载数据库驱动(JDBC)
前言
之前,对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)相关推荐
- java 手动加载数据库驱动_JAVA加载数据库驱动(JDBC)
JAVA加载数据库驱动(JDBC) 前言 之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文. ...
- 加载mysql驱动的语句_sql数据库驱动加载语句
2011年11月27日学习内容总结 1.使用JDBC连接数据库五个步骤,每个步骤的原因.加载驱动:连接不同的数据库要加载不同的驱动:建立连接:访问一个数据库,要知道IP+端口号+数据库名,此外还有用户 ...
- 怎么将pom文件mysql驱动修改版本_mysql 数据库驱动 pom
用Maven插件生成Mybatis代码/数据库 现在代码管理基本上是采用Maven管理,Maven的好处此处不多说,大家用百度搜索会有很多介绍,本文介绍一下用Maven工具如何生成Mybatis的代码 ...
- dbevar mysql 驱动_DBeaver 使用之数据库驱动下载
简介: DBeaver是一款免费开源的数据库连接工具,可以支持几乎所有的数据库产品. 配置仓库(可选) 驱动管理器 博主安装的版本 DBeaver 7.15 ,该工具并不自带数据库驱动,而是提供了一个 ...
- jdbc和mysql做游戏排行榜_MySQL数据库与JDBC编程
欢迎关注公众号:xfxuezhang MySQL数据库与JDBC编程 JDBC (Java Database Connectivity) DDL(Data Definition Language,数据 ...
- 连接oracle的驱动包,连接oracle数据库驱动包
JDBC与JAVA数据库编程 一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. ...
- java表单 mysql 乱码_java web当中表单提交到后台出现乱码的解决方法
1.如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么 ...
- java 不能执行mysql存储过程_java无法执行mysql中的函数及存储过程的.sql备份文件...
需求:用java程序执行[包含数据&结构&函数&存储过程]的.sql备份文件 问题记录: 1.在执行完insert类型的语句后,中文内容会显示乱码. 解决:将mysql参数中c ...
- java如何向mysql插入_java中怎么向数据库插入数据 ?
展开全部 Java程序向数据库中插入数据,代码如下://首先创建数据库,(access,oracle,mysql,sqlsever)其中之一,32313133353236313431303231363 ...
- java如何映射mysql枚举_java中自定义枚举enum映射到mysql数据库字段处理器handler
mybatis中默认的处理枚举类型的handler有 如果要处理一些特殊的情况下字段内容字段的转换,需要自定义处理器,比如如下例子要处理数据库中默认字段值为""空字符串的问题 im ...
最新文章
- 使用MyBatis的Generator自动创建实体类和dao的接口与xml
- mysql Slave is not configured or failed to initialize properly. You must at least set --server-id
- 小米CC开机动画公布:扑面而来的青春活力
- 开源界也要注意,Apache 基金会与 GitHub 都受美国法律约束
- 定积分在计算机中的应用,计算机模拟定积分的定义
- 用IT技术玩金融系列文章
- 如何在苹果Mac上截屏或录制屏幕?
- WPS vba宏插件安装包
- 面试计算机人员试题及答案,【仁宝电脑员工笔试试题及答案】 - 面试网
- kali下域名解析失败
- 杨辉三角(C语言简单版)
- 高等数学--高阶导数与隐函数,参数方程(三)
- Shiro 实战教程(全)
- Flutter中Drat虚拟机服务介绍 --- VmService
- 5G商用大幕拉开 下一个风口:行业新应用、新业务或新商业模式?
- 【毕业设计 | 开源】我把商业级仓库管理系统 ModernWMS 开源了
- mongodb查询语法
- 如何在visual studio 2017 中安装python工具
- Linux下解决conio.h的问题
- Java Https请求工具类