300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 3. mysql的注解驱动的三种方式_注册 Jdbc 驱动程序的三种方式及Class.forName 的作用...

3. mysql的注解驱动的三种方式_注册 Jdbc 驱动程序的三种方式及Class.forName 的作用...

时间:2019-09-20 07:12:31

相关推荐

3. mysql的注解驱动的三种方式_注册 Jdbc 驱动程序的三种方式及Class.forName 的作用...

(1)jdbc中注册驱动,首先导入对应的包,例如mysql-connector-java-5.0.8-bin.jar。驱动包是java和具体数据库之间的连接桥梁,由数据库厂商开发。每一种数据库对应一款驱动jar,甚至每一个版本的数据库都有自己对应版本的驱动jar。

(2)java.sqlDriverManger类是Java的驱动管理类。管理一组JDBC驱动程序。

javax.sql.DataSource接口是JDBC2.0API中的新增内容,它提供了连接到数据源的另一种方法。使用DataSource对象是连接到数据源的首选方法。

DiverManager.class里有个属性drivers,它实际上是一个vector(向量)。可在列表中加入很多驱动,当DriverManager去取连接的时候,若果drivers里有很多驱动,它会把drivers里面的各个驱动的url和创建连接时传进来的url逐一比较,遇到对应的url,则建立连接。

注册驱动的三种方式:

(一)DriverManager.registerDriver(newcom.mysql.jdbc.Driver());

会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

具体来说就是:

1,加载的时候注册一次驱动(原因请看第三中注册方式),实例化的时候又注册一次。所以两次。

2,由于实例化了com.mysql.jdbc.Driver.class,导致必须导入该类(就是要把这个类import进去),从而具体驱动产生了依赖。不方便扩展代码。

代码如下:

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();

}

(二)System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");

通过系统的属性设置注册驱动

如果要注册多个驱动,则System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:com.oracle.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();

}

(三)

Class.forName("com.mysql.jdbc.Driver");(关于这句代码的进一步理解请参看另一篇文章《从Class.forName()

到类的装载机制》)

推荐这种方式,不会对具体的驱动类产生依赖(就是不用importpackage了)。其实这个只是把com.mysql.jdbc.Driver.class这个类装载进去,但是关键就在于,在

这个类中,有个静态块,如下:

static{

try{

java.sql.DriverManager.registerDriver(newDriver());

}catch(SQLExceptione){

thrownewRuntimeException("can'tregisterdriver!");

}

}

就是因为这个代码块,让类在加载的时候就把驱动注册进去了!

代码如下:

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();

}

附:Class.forName 的作用? 为什么要用?

按参数中指定的字符串形式的类名去搜索并加载相应的类, 如果该类字节码已经被加载过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛ClassNotFoundException。加载完这个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例对象了。 有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用 Class.forName 去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring 的 ioc 中每次依赖注入的具体类就是这样配置的,jdbc 的驱动类名通常也是通过配置文件来配置的, 以便在产品交付使用后不用修改源程序就可以更换驱动类名。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。