jdbc总结 最完整

public class MysqlDemo {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        String sql;
        // MySQL的JDBC URL编写方式:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值
        // 避免中文乱码要指定useUnicode和characterEncoding
        // 执行数据库操作之前要在数据库管理系统上创建一个数据库,名字自己定,
        // 下面语句之前就要先创建javademo数据库
        String url = "jdbc:mysql://192.168.1.111:3306/appcenter_new?useUnicode=true&characterEncoding=utf8";
 
        try {
            // 之所以要使用下面这条语句,是因为要使用MySQL的驱动,所以我们要把它驱动起来,
            // 可以通过Class.forName把它加载进去,也可以通过初始化来驱动起来,下面三种形式都可以
            Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动
            // or:
//             com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
            // or:
//             new com.mysql.jdbc.Driver();
 
            System.out.println("成功加载MySQL驱动程序");
            // 一个Connection代表一个数据库连接
            conn = DriverManager.getConnection(url,"jbjava","jb98");
            // Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等
            Statement stmt = conn.createStatement();
            sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
            int result = stmt.executeUpdate(sql);// executeUpdate语句会返回一个受影响的行数,如果返回-1就没有成功
  1. 一切从
    Class.forName("类的完整名字")讲起。作用测试这个方法http://www.360doc.com/content/14/0422/08/16583880_371027796.shtml。forName("类名User") 执行的时候,调用了User中的静态语句块,newInstance()执行的时候调用了构造函数。 Class.forName("类名")返回的是类(Class)class com.java.jvm.User.调用 forName("X") 将导致命名为 X 的类被初始化,这句话是官网API上的一句话,很迷茫,有点不理解,所以在User类中,添加了static语句块和User构造函数。
  2. 我们用Class.forName("类名");并没有接收他的返回值,所以作用是调用了User中的静态语句块。 所以我们要看所加载的类中包含什么静态语句块。因为我们加载的是 具体数据库供应商根据api自己提供的驱动程序jar包中的 Driver类。所以我们可以解压mysql-connector-java-5.1.22jar包,在src中可以查到有com/myaql/jdbc/下面有很多java文件,找到Driver.java打开就知道
    package com.mysql.jdbc;
    
    import java.sql.SQLException;
    
    /**
     * The Java SQL framework allows for multiple database drivers. Each driver
     * should supply a class that implements the Driver interface
     * 
     * <p>
     * The DriverManager will try to load as many drivers as it can find and then
     * for any given connection request, it will ask each driver in turn to try to
     * connect to the target URL.
     * 
     * <p>
     * It is strongly recommended that each Driver class should be small and
     * standalone so that the Driver class can be loaded and queried without
     * bringing in vast quantities of supporting code.
     * 
     * <p>
     * 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")
     * 
     * @see org.gjt.mm.mysql.Connection
     * @see java.sql.Driver
     * @author Mark Matthews
     * @version $Id$
     */
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        // ~ Static fields/initializers
        // ---------------------------------------------
    
        //
        // Register ourselves with the DriverManager
        //
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
        // ~ Constructors
        // -----------------------------------------------------------
    
        /**
         * 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()
        }
    }
    首先可以知道,这个Driver类是com.mysql.jdbc包下的,所以类名全称应该是“com.mysql.jdbc.Driver”.这个因驱动包而固定。
  3. 然后这个Driver中果然有static静态语句块。
    When a Driver class is loaded, it should create an instance of itself and
     * register it with the DriverManager.
  4. 所以执行完Class.forName("com.mysql.jdbc.Driver");后DriverManager类就可以识别供应商提供的驱动了。我在想,应该是DriverManager类需要这些驱动来用getConnection方法。以及其他的api端口也需要实现类。所以我们能够直接通过java提供的端口以及DriverManager类类操作数据库。无需考虑具体数据库的底层实现。
  5. 注意:Class.forName()将对应的驱动类加载到内存中,然后执行内存中的static静态代码段,代码段中,会创建一个驱动Driver的实例,放入DriverManager中,供DriverManager使用。
  6. 使用DriverManager创建 Connection 连接对象

    创建 Connection 连接对象,可以使用驱动Driver的 connect(url,props),也可以使用 DriverManager 提供的getConnection()方法,此方法通过url自动匹配对应的驱动Driver实例,然后调用对应的connect方法返回Connection对象实例。

  7. 与我想到一样,获取Driver 然后通过他的方法来连接数据库http://www.2cto.com/database/201406/308225.html老调重弹:JDBC系列之<驱动加载原理全面解析)此文写得很好

posted on 2016-06-20 15:20  雪的心  阅读(185)  评论(0编辑  收藏  举报

导航