精华内容
下载资源
问答
  • JAVA加载数据库驱动(JDBC)前言之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文。一、使用JDBC连接MySQL首先,来看一下正常使用Java操纵MySql的简单代码逻辑。...

    JAVA加载数据库驱动(JDBC)

    前言

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

    一、使用JDBC连接MySQL

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

    public 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代码,可以发现其中的隐含逻辑。

    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!");

    }

    }

    /**

    * 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中。如此第一部分中的第二步就很容易理解了。

    // 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. 第三部分的余以为灵感借鉴于“余晟以为”微信公众号,很喜欢他那句“我是这么以为的,当然你也可以那么以为”。

    参考

    展开全文
  • JDBC编程步骤见JDBC编程的第一步是加载数据库驱动,使用Class类的forName()方法,Class.forName("com.mysql.jdbc.Driver")。//加载MySQL驱动Class.forName("com.mysql.jdbc.Driver");//获取数据库连接Connection ...

    JDBC编程步骤见

    JDBC编程的第一步是加载数据库驱动,使用Class类的forName()方法,Class.forName("com.mysql.jdbc.Driver")。

    //加载MySQL驱动

    Class.forName("com.mysql.jdbc.Driver");//获取数据库连接

    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/crashcourse", "root", "123456");

    比较令人疑惑的是,它是如何加载驱动的,后续的DriverManager又是如何利用该驱动的。

    打开Driver源码,可以看到如下的内容

    /***

    *

    * When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager.

    * This means that a user can load and register a

    * driver by doing Class.forName("foo.bah.Driver")*/

    源码中的静态代码块:

    static{try{

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

    }catch(SQLException E) {throw new RuntimeException("Can‘t register driver!");

    }

    }

    由此可知,Class.forName("com.mysql.jdbc.Driver"),加载Driver类且静态初始化该类时,会创建Driver对象,并由DriverManager进行register。

    mark

    原文:https://www.cnblogs.com/deltadeblog/p/9405236.html

    展开全文
  • 一、加载数据库驱动加载数据库驱动的三种方式:1、Class.forName("com.mysql.jdbc.Driver");2、Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);3、System.setProperty("jdbc....

    一、加载数据库驱动

    加载数据库驱动的三种方式:

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

    2、Driver driver = new com.mysql.jdbc.Driver();

    DriverManager.registerDriver(driver);

    3、System.setProperty("jdbc.driver","com.mysql.jdbc.Driver")

    1、为什么要加载数据库驱动?java加载驱动的原理是什么?

    由数据库厂家提供的供外部程序操作数据的接口程序;java本身不提供操作任何操作数据库的功能,即jre中不存在操作数据的对象,通过类加载器加载外部数据库驱动程序到jvm中,程序员就可以使用外部程序来操作相应的数据库;数据库厂商实现Java Driver接口

    2、三种方式的比较,各自的优缺点

    1、性能比较

    System.setProperty(); > Class.forName() > DriverManager.registerDriver();

    2、原理

    System.setProperty(“jdbc.drivers,“”):  -- 设置系统属性,DriverManager的静态代码块中会尝试获取此属性

    9b01ed0df012

    9b01ed0df012

    9b01ed0df012

    2、DriverManager.registerDriver(driver);

    registerDriver()是一个同步方法

    9b01ed0df012

    将DriverInfo对象添加到registeredDrivers (CopyAndWriteArrayList)集合对象中,当调用getConnection()时,会去尝试遍历获取有权限的Driver对象,通过加载的Driver对象去连接数据库

    9b01ed0df012

    3、Class.forName(""); -- 将指定的对象通过ClassLoader进行加载

    9b01ed0df012

    3、使用场景

    Class.forName()--> 1、写法简单 2、可抛出ClassNotFoundException  3、只能使用一个连接对象

    System.setProperty() --> 1、加载速度快 2、占用内存资源

    DriverManager.registerDriver(); --> 1、支持多种形式 2、直观 3、 加载多个外部程序 4、加载速度慢

    展开全文
  • [导读]JDBC作为数据库访问的规范接口,其中只是定义一些接口。具体的实现是由各个数据库厂商来完成。...Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。Driv...

    [导读]JDBC作为数据库访问的规范接口,其中只是定义一些接口。具体的实现是由各个数据库厂商来完成。

    JDBC作为数据库访问的规范接口,其中只是定义一些接口。具体的实现是由各个数据库厂商来完成。

    一、重要的接口:

    1.public interface Driver 每个驱动程序类必须实现的接口。Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序   Class.forName("foo.bah.Driver")。例如:MYSQL驱动com.mysql.jdbc.Driver

    2.public interface Connection 与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。

    3.public interface Statement 用于执行静态 SQL 语句并返回它所生成结果的对象。

    4.public interface PreparedStatement 表示预编译的 SQL 语句的对象。SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

    二、驱动的加载方式

    1.最常用的是使用 Class.forName("com.mysql.jdbc.Driver");方式。这行代码只是使用当前的类加载去加载具体的数据库驱动,不要小看这简单的这一行代码。在Driver类中的static域中把当前驱动注册到DriverManager中。static {

    try {

    java.sql.DriverManager.registerDriver(new Driver());//注册驱动

    } catch (SQLException E) {

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

    }

    }

    2.通过查看DriverManager源码,我们也可以使用System.setProperty("jdbc.drivers","....")方式。String drivers;

    try {

    drivers = AccessController.doPrivileged(new PrivilegedAction() {

    public String run() {

    return System.getProperty("jdbc.drivers");

    }

    });

    } catch (Exception ex) {

    drivers = null;

    }String[] driversList = drivers.split(":");

    println("number of Drivers:" + driversList.length);

    for (String aDriver : driversList) {

    try {

    println("DriverManager.Initialize: loading " + aDriver);

    Class.forName(aDriver, true,

    ClassLoader.getSystemClassLoader());

    } catch (Exception ex) {

    println("DriverManager.Initialize: load failed: " + ex);

    }

    }

    3.最直接(不推荐)方式new com.mysql.jdbc.Driver();

    4.为了更好的使用数据库驱动,JDBC为我们提供了DriverManager类。如果我们都没有使用以上方式,DriverManager初始化中会通过ServiceLoader类,在我们classpath中jar(数据库驱动包)中查找,如存在META-INF/services/java.sql.Driver文件,则加载该文件中的驱动类。AccessController.doPrivileged(new PrivilegedAction() {

    public Void run() {

    ServiceLoader loadedDrivers = ServiceLoader.load(Driver.class);

    Iterator driversIterator = loadedDrivers.iterator();

    /* Load these drivers, so that they can be instantiated.

    * It may be the case that the driver class may not be there

    * i.e. there may be a packaged driver with the service class

    * as implementation of java.sql.Driver but the actual class

    * may be missing. In that case a java.util.ServiceConfigurationError

    * will be thrown at runtime by the VM trying to locate

    * and load the service.

    *

    * Adding a try catch block to catch those runtime errors

    * if driver not available in classpath but it's

    * packaged as service and that service is there in classpath.

    */

    try{

    while(driversIterator.hasNext()) {

    driversIterator.next();

    }

    } catch(Throwable t) {

    // Do nothing

    }

    return null;

    }

    });

    展开全文
  • Java 加载数据库驱动的说明java.sql.DriverManger类Class.forName("xxx")方式 java.sql.DriverManger类 DriverManger类是java的驱动管理类, 管理JDBC驱动程序. 加载驱动时会调用DriverManager.registerDriver(new ...
  • 这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文。一、使用JDBC连接MySQL首先,来看一下正常使用Java操纵MySql的简单代码逻辑。1234567891011121314151617181920212223242526272829303132333435363738public static...
  • import java.sql.*; //导入java.sql包 public class Login {//创建Login类,保证文件名与类名相同 Connection con;//声明Connection对象 Statement sql; ResultSet res; public Connection ...
  • 1.平时加载jdbc的驱动,去连mysql,增删改查,代码如下 String url="jdbc:mysql://localhost/shopping?user=root&password="; // Object df = Class.forName("com.mysql.jdbc.Driver"); Connection conn=...
  • 1.加载 数据库驱动( Class.forName(String className) ):因为Java是一种纯面向对象的编程语言,所以一切事物都可以看作是类或者类对象,数据库也是,Java正是通过JDBC将数据库抽象成为对象,然后对该对象进行操作。...
  • 1. 加载数据库驱动:1) 由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构;2) JDBC将整个数据库驱动器在底层抽象成一个对象(即驱动...
  • 本篇文章主要介绍了详解Java动态加载数据库驱动,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • public class LoadDBdriver {/***复制.jar文件到java安装包的"jre>lib>ext"文件夹下。* @param args* @author 劳黑炭*/// private static final String DB_DRIVER ="org.apache.derby.jdbc.EmbeddedDriver...
  • DriverManager 类包含一列Driver 类,它们已通过调用方法DriverManager.registerDriver 对自己进行了注册。所有Driver 类都必须包含有一个静态部分。它创建该类的实例,然后...而是在加载驱动程序时由驱动程序自动调...
  • Java-加载数据库驱动,取得数据库连接 在Java中想要进行数据库操作,最重要的两个步骤就是加载数据驱动,然后取得数据库连接。 1.加载 数据库驱动( Class.forName(String className) ): 因为Java是一种纯...
  • 1.加载 数据库驱动( Class.forName(String className) ):因为Java是一种纯面向对象的编程语言,所以一切事物都可以看作是类或者类对象,数据库也是,Java正是通过JDBC将数据库抽象成为对象,然后对该对象进行操作。...
  • 1. 加载数据库驱动通常来说,JDBC 使用 Class 类的 forName() 静态方法来加载驱动,需要输入数据库驱动代表的字符串。例如:加载 MySQL 驱动:Class.forName("com.mysql.jdbc.Driver");加载 Oracle 驱动:Class.for...
  • public class DBHelper {private static final String URL="jdbc:mysql://localhost:3306/test";private static final String USERNAME="root";private static final String PASSWORD="123456";...
  • MyEclipsejsp加载数据库驱动时报错舞墨落凡尘 2020-06-05 14:23:00本人刚学完java se,现在在学java ee中的jsp。先在项目——属性——java构建路径(库) 中添加jdbc驱动,然后用java se中学的Class.forName()方法加载...
  • java 编程中连接数据库如何加载各类驱动
  • importjava.sql.*;publicclasstest{//指定驱动程序privatestaticStringdriver=...//创建指定数据库的URLprivatestaticStringurl="Jdbc:...import java.sql.*;public class test{//指定驱...
  • 利用Java如何实现动态加载数据库驱动发布时间:2020-11-19 16:44:28来源:亿速云阅读:101作者:Leah利用Java如何实现动态加载数据库驱动?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决...
  • package JavaDatabaseProgramming; import java.sql.Connection;...//加载驱动程序public class JiaZaiQuDong { //定义MySQL的数据库驱动程序 public static final String DBDRIVER="org.gjt.mm.m...
  • java规范怎么加载数据库驱动

    千次阅读 2019-09-17 09:46:58
    class.forName与类加载机制有关,会触发执行com.mysql.jdbc.Driver类中的静态方法,从而使主类加载数据库驱动。 但是在最新的DriverManager源码中,可以不需要使用class.forName显示加载JDBC驱动程序,加了也没有...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class T2{public static void main(String[] args){try{Class.forName(...
  • JDBC提供的DriverManager类用于跟踪所有可用的JDBC驱动,并在用户需要时选择合适的驱动提供给用户 但是其跟踪不是自动的,必须由可用的JDBC驱动的Driver类自己在DriverManager上进行注册 但是这个注册过程一般是...
  • 1. 加载数据库驱动:  1) 由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构;  2) JDBC将整个数据库驱动器在底层抽象成一个对象...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class T2{public static void main(String[] args){try{Class.forName(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,376
精华内容 2,150
关键字:

java加载数据库驱动

java 订阅