Class.forName("com.mysql.jdbc.Driver") ;
2016-04-07 14:58
435 查看
try { Class.forName("com.mysql.jdbc.Driver") ; } catch(ClassNotFoundException e) { System.out.println("找不到驱动程序类 ,加载驱动失败!"); // TODO }
在上面的代码中,class.forName("com.mysql.jdbc.Driver");的主要作用是在运行期以反射的方式来检查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类也是:因此,直接
import com.mysql.jdbc.Driver;违反了开闭原则(OCP,对扩展开放,对修改关闭)。(有人说我用反射也必须要修改代码呀,事实上你可以将类名字符串存储至.properties文件,和数据库用户名密码放在一起,就像Hibernate做的那样)。
如果我可以保证JDBC驱动一定在classpath下,是不是可以不写这段反射代码,也不引用任何的Driver类?答案是否定的,请看下面这段代码源自
com.mysql.jdbc.Driver:
package com.mysql.jdbc; public 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!"); } } ... }
static代码块会在类加载时就被执行,也就是当我们执行
Class.forName("com.mysql.jdbc.Driver")时(或
import com.mysql.jdbc.Driver)
反射的使用,让Java更具有动态特性。一条sql语句查询,得到一条查询结果,例如select * from user where id = 1;得到id, userName, email, pwd等字段以及对应的值,但是你的目的不仅仅是得到这些字段,你要将这些字段封装成User对象,便于后续的使用。
如果你只有一个User类你可以写一个util类将这些字段一一赋值给User对象的每个属性,但是你在项目开发中还有很多实体类,这怎么办呢?每个都写个util类?对象属性发生变化又得重写?这时候反射机制就可以实现这个通用的方法,传入查询出的ResultSet以及你要的对象Class,通过反射获取Class中的field list,从ResultSet中获取对应的值,再使用反射调用Class中对应filed的set方法,完成对对象的封装。
相关文章推荐
- mysql-游标及存储过程游标的使用--源自技术
- mysql设置root密码
- mysql错误编号及其意义
- mysql中UDF引入的安全问题
- mysql开启和使用事件、与服务器重启mysql错误
- MySQL 索引选择源码分析
- JDBC简单示例
- 怎么将emoji表情存入mysql
- mysql 导出和导入
- mysql5.6新特性总结
- MySQL(8)--Cluster
- 将mysql安装至windows系统服务
- Ubuntu14.04 LTS MySQL安装及远程连接
- mysql服务无法启动
- mysql,命令导入\导出表结构或数据
- mysql对表的操作
- mysql命令行导出数据库
- mysql查询方式
- MySQL(7)-多源复制
- MySQL6.0安装失败的解决方案