我在使用DriverManager时发现的问题
小白今天在连接数据库的时候,心里面突然想起之前有大佬说没有必要添加一条"com.mysql.jdbc.Driver",当时也实验了确实可行,但是这个可是驱动地址,难道是不用添加是根据驱动jar包自动识别出来吗?
开始了磕磕绊绊的探索,
public void connection4() throws Exception { //1.驱动地址,url,user,passwrod
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/mysql_test";
String user = "root";
String password = "root"; //2.建立驱动
Class<?> aClass = Class.forName(driverClassName);
Driver driver = (Driver)aClass.newInstance();
//3.注册驱动
DriverManager.registerDriver(driver); //4.创建连接
Connection connection = DriverManager.getConnection(url,user,password); //在这里,我有个疑问,我想试着看一下通过DriverManager.registerDriver注册的驱动到底有几个? //01.先得到驱动
Enumeration<Driver> drivers = DriverManager.getDrivers(); int nums = 0;
//使用while循环来遍历驱动的个数
while(drivers.hasMoreElements()) {
nums ++;
//打印出驱动
System.out.println(drivers.nextElement());
}
//打印出驱动个数
System.out.println("驱动个数:" + nums);
}
打印输出,发现居然有3个驱动,我自己只注册了1个。
带着个疑问,我试着注释了建立注册驱动。
public void connection4() throws Exception { //1.驱动地址,url,user,passwrod
// String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3307/mysql_test";
String user = "root";
String password = "root"; //2.建立驱动
// Class<?> aClass = Class.forName(driverClassName);
// Driver driver = (Driver)aClass.newInstance();
// //3.注册驱动 DriverManger.registerDriver
// DriverManager.registerDriver(driver); //4.创建连接
Connection connection = DriverManager.getConnection(url,user,password); //在这里,我有个疑问,我想试着看一下通过DriverManager.registerDriver注册的驱动到底有几个? //01.先得到驱动
Enumeration<Driver> drivers = DriverManager.getDrivers(); int nums = 0;
//使用while循环来遍历驱动的个数
while(drivers.hasMoreElements()) {
nums ++;
//打印出驱动
System.out.println(drivers.nextElement());
} //打印出驱动个数
System.out.println("驱动个数:" + nums); }
问题来了,看来我只是注册了1个驱动,多余的两个是从哪里来的呢?
为此我去翻看了一下api文档里面关于DriverManager有这样一段话,
The DriverManager
methods getConnection
and getDrivers
have been enhanced to support the Java Standard Edition Service Provider mechanism. JDBC 4.0 Drivers must include the file META-INF/services/java.sql.Driver
. This file contains the name of the JDBC drivers implementation of java.sql.Driver
. For example, to load the my.sql.Driver
class, the META-INF/services/java.sql.Driver
file would contain the entry:(大概是在META-INF包里面包含了my.sql.Driver的类)
my.sql.Driver
Applications no longer need to explictly load JDBC drivers using Class.forName()
. Existing programs which currently load JDBC drivers using Class.forName()
will continue to work without modification.
When the method getConnection
is called, the DriverManager
will attempt to locate a suitable driver from amongst those loaded at initialization and those loaded explicitly using the same classloader as the current applet or application.
确实有两个驱动类,所以自动生成的两个驱动是从这里来的。。
后面大概是在讲,在JDBC 4.0以后 可以不用再很明确的去建立驱动,这样可以简化一些代码。
DriverManager使用过程中发现的问题得到解决。
我在使用DriverManager时发现的问题的更多相关文章
- 解决CSharpGL使用CGCompiler时发现的几个问题
解决CSharpGL使用CGCompiler时发现的几个问题 为了获取CSharpShadingLanguage的token流,我设计了这样一个文法: <Expression> ::= & ...
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...
- 使用Unity NGUI-InputField组件输入时发现显示为白色就是看不到字体
今天在接入android支付宝 SDK时,打包运行时,发现使用Unity NGUI-InputField组件输入时发现显示为白色就是看不到字体,查找一下发现是与android交互存在的问题, 只需在A ...
- 使用Sublime编写HTML页面时发现,虽然已经设置好了UTF-8的编码格式,但却发现HTML页面的汉字仍然是乱码。
相信有些同学在使用Sublime编写HTML页面时发现,虽然已经设置好了UTF-8的编码格式,但却发现HTML页面的汉字仍然是乱码吧.我今天就遇到了这样的问题. 第一步:重新设置一下你的meta,设置 ...
- [Python] - 使用chardet检查网页编码格式时发现的问题
最近在使用chardet检查网页编码格式时发现如下问题: 用urllib打开网页再检查编码格式和用urllib2打开网页检查编码格式结果不一样,所以urllib2打开可能导致问题,需要关注. 查看了相 ...
- 安装myeclipse10后破解时发现没有common文件夹
今天重新安装了myeclipse10软件,然后在破解的时候发现安装目录下没有common,这是因为以前安装过myeclipse,卸载时没有完全清除,再次安装时,myeclipse会自动找到以前安装的c ...
- 【原创】lua编译时发现缺少readline库
编译lualua项目,其中用到了lua-5.1版本的源码,编译时提示缺少readline库,找不到readline/readline.h头文件等 发现系统中其实有安装readline库不过没有做链接和 ...
- oracle用exp导出dmp文件时发现空表没有导出来
问题: 今天,从同事电脑考oracle11g中dmp文件,在自己电脑导入,发现少了很多表,而且少的这些表都是空表. 原因: oracle11g 默认的deferred_segment_creation ...
- 使用SqlServer中的float类型时发现的问题
在做项目中,使用了float类型来定义一些列,如:Price,但是发现了很多问题1.当值的位数大于6位是float型再转varchar型的时候会变为科学技术法显示 此时只好将float型转换成n ...
随机推荐
- springboot项目基础面试题
1.springboot与spring的区别. 引用自官方说法: java在集成spring等框架需要作出大量的配置,开发效率低,繁琐.所以官方提出 spring boot的核心思想:习惯优于配置.可 ...
- JS做深度学习2——导入训练模型
JS做深度学习2--导入训练模型 改进项目 前段时间,我做了个RNN预测金融数据的毕业设计(华尔街),当时TensorFlow.js还没有发布,我不得已使用了keras对数据进行了训练,并且拟合好了不 ...
- JavaScript对象的几种创建方式与优缺点
JavaScript中常见的几种创建对象的方式有:Object构造函数模式.对象字面量模式.工厂模式.自定义构造函数模式.构造函数加原型组合模式:他们各自有各自的优缺点和使用场景. 1. Object ...
- shell知多少?
Shell字面理解就是个"壳",是操作系统(内核)与用户之间的桥梁,充当命令解释器的作用,将用户输入的命令翻译给系统执行.Linux中的shell与Windows下的DOS一样,提 ...
- lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问
lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问,如果关闭防火墙虚拟IP就可以访问网站了,这个问题肯定是防火墙在作怪. 经过这两的不懈奋斗和大家的帮助 ...
- android 中webview的屏幕适配问题
两行代码解决WebView的屏幕适配问题 一个简单的方法,让网页快速适应手机屏幕,代码如下 1 2 WebSettings webSettings= webView.getSettings(); we ...
- github里的readme.md
在github里如何写readme.md https://www.cnblogs.com/guchunli/p/6371040.html----------------------> READM ...
- Louis的「每周语文」
说明:此专栏为Louis收录的经典语录及书影音标记,每周一更新. 成长的本质是变得复杂.当你的主观世界遇到客观世界,之间的那条沟,你掉进去,叫挫折,爬出来,叫成长. -- 语出罗振宇在奇葩说第四季的结 ...
- 全差分运算放大器ADA4930的分析(1)
AD转换芯片的模拟信号输入端方式为:全差分.伪差分.单端输入,其中全差分输入的效果最佳,现阶段ADC转换器为了提高其性能,建议用户使用全差分的输入方式.(AD7982.ADS8317等都能实现信号的全 ...
- Java基础--数组的定义
1.数组的定义 数组:一组能够储存相同数据类型值的变量的集合. 2.数组的赋值方式 (1)使用默认的初始值来初始化数组中的每一个元素 语法:数组元素类型[]数组名 = new数组元素类型[数组中元素的 ...