zoukankan      html  css  js  c++  java
  • day17-jdbc 4.DriverManager详解

    我们找的不是J2EE的API,因为JDBC不在web程序用也可以,纯java也能玩。所以jdbc的api在java se那里,或者说是在jdk那里。

    DriverManger它底层有一个集合是一个Vector。ArrayList是异步的,Vector是同步的。那个Vector里面装了所有的驱动。



    注意JDK1.6和JDK1.7的源码是不一样的。下面是JDK1.7的DriverManager.class的源码,很明显和JDK1.6的DriverManager.class的源码是不同的。

    JDK的源码是可以直接看的,不用关联源码包也可以直接查看。如果玩的是jdbc驱动(com.mysql.jdbc),是mysql的驱动,mysql驱动跟jdk无关。mysql驱动的源码是需要关联mysql驱动的源码包才可以查看。


     一个静态代码块特点是只执行一次。优先于对象创建就执行。或者说类一加载就执行,对象出没出现没所谓肯定先执行。



    大家脑海里一定要有一个印象:DriverManager可以理解为一个容器(其实是它底层有一个集合)。



    老师你别去new Driver()但是我还得让它执行啊。那是静态代码块不是静态方法,静态代码块你咋调啊。静态代码块你调不了,你要是静态方法调就可以了嘛。能不能让mysql驱动自己去执行。然后我就不用注册了,它就帮我注册了。其实就是一个事:让那个mysql的驱动Driver自动加载。反射OK吧。Class.forName()把它一加载,Class.forName()一加载,Driver.class里面的静态代码块执行吧。那样registerDriver()就不用执行了。


     



    现在有一个疑问:那个驱动现在已经注册上去了,可以理解为在内存里了,但是我们好像没用啊。驱动注册上去之后下面代码和驱动没什么关系了,注册驱动的那段代码删除掉编译也不报错。它加载这个驱动了,注册进去了,但是你好像没用。代码上没有体现出来。到底在哪里使用了呢?还有,那驱动不仅仅能加载一个,能加载N个。怎么加载N个驱动呢?

    注意:oralce不是以数据库去管理表的,它是以用户管理表的。所以这里传入一个sid。每个数据库驱动的url不一样,不一样在连接的时候就可以通过url确定找哪个驱动。所以驱动是有用的,注册完之后在哪里用呢?当你获得连接时url确定找哪个驱动。


    package cn.itcast.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    //import com.mysql.jdbc.Driver;
    
    public class JdbcDemo1 {
       public static void main(String[] args) throws SQLException {
          //1.注册驱动
          DriverManager.registerDriver(new Driver());//一注册驱动,驱动就加载到内存里面了  也就是说我们就可以用它了  这种方案与我的mysql驱动紧密耦合
          //2.获取连接对象
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "");
        System.out.println(con);
        //connection是接口,是驱动,驱动肯定把这个接口实现了 编程用最顶层去接收操作起来会比较方便  前面是父,后面是子  用最顶层接收
         //3.通过连接对象获取操作sql语句的Statement
        Statement st = con.createStatement();
        //4.操作sql语句
        String sql = "select * from user";
        ResultSet rs =  st.executeQuery(sql);//ResultSet就是查询的结果,可以想象成是集合,但是它不是集合
        
        //5.遍历结果集
     /*   boolean flag = rs.next();//向下移动,返回值为true,代表有下一条记录。
        
        System.out.println(flag);
        int id = rs.getInt(1);
        int id1 = rs.getInt("id");
        System.out.println(id);
        System.out.println(id1);
        String username = rs.getString(2);
        String username1 = rs.getString("username");
        System.out.println(username);
        System.out.println(username1);*/
        while(rs.next()){
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id+"   "+username+"   "+password+"   "+email);
        }
     //只要Java程序跟任何设备进行了连接,用完之后必须释放资源。最简单基础班讲I/O流,Java跟文件进行了连接,用完之后关闭文件流。数据库也是一个设备。Java跟数据库连接上了用完之后也要关闭。必须把资源释放。
     //6.释放资源
        rs.close();//结果集得关
        st.close();
        con.close();
        //直接把con关闭了,数据库和程序断开了。但是statement和resultset没有及时释放,它还在内存存着。close()是释放和回收资源。
        //close()的顺序和进门出门是一样的,是进门的时候先进大门,出门的时候是最后才出大门
        //=============
       //Java可以操作数据库
       }
    }
    package cn.itcast.jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    //import com.mysql.jdbc.Driver;
    //解决关于加载驱动问题
    public class JdbcDemo2 {
       public static void main(String[] args) throws SQLException, ClassNotFoundException {
    	  
    	   //1.注册驱动
    	  //DriverManager.registerDriver(new Driver());//一注册驱动,驱动就加载到内存里面了  也就是说我们就可以用它了 加载了两个驱动
    	  Class.forName("com.mysql.jdbc.Driver");//优点是加载一次  替换registerDriver()这个方法  这个不耦合,根本就没用mysql驱动的东西 不是意味着那就不用驱动了,只是不依赖jar包
          //在代码上、表现上根本就看不到驱动那包  用的都是公共的那种接口(Connection、DriverManager、ResultSet、SQLException、Statement),就是JDK里面提供的公共的接口
    	  //编程的都知道不依赖任何东西是最好的,因为没有耦合,但是那是不可能的。所以要尽量让耦合度降低
    	  //加载mysql驱动
    	  Class.forName("oracle.jdbc.driver.Oracle");//加载oracle驱动
    	  //它怎么知道这是oracle驱动还是mysql驱动呢?它是如何区分的?
    	  
    	  //2.获取连接对象
    	Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "");
        System.out.println(con);
        //connection是接口,是驱动,驱动肯定把这个接口实现了 编程用最顶层去接收操作起来会比较方便  前面是父,后面是子  用最顶层接收
         //3.通过连接对象获取操作sql语句的Statement
        Statement st = con.createStatement();
        //4.操作sql语句
        String sql = "select * from user";
        ResultSet rs =  st.executeQuery(sql);//ResultSet就是查询的结果,可以想象成是集合,但是它不是集合
        
        //5.遍历结果集
     /*   boolean flag = rs.next();//向下移动,返回值为true,代表有下一条记录。
        
        System.out.println(flag);
        int id = rs.getInt(1);
        int id1 = rs.getInt("id");
        System.out.println(id);
        System.out.println(id1);
        String username = rs.getString(2);
        String username1 = rs.getString("username");
        System.out.println(username);
        System.out.println(username1);*/
        while(rs.next()){
        	int id = rs.getInt("id");
        	String username = rs.getString("username");
        	String password = rs.getString("password");
        	String email = rs.getString("email");
        	System.out.println(id+"   "+username+"   "+password+"   "+email);
        }
     //只要Java程序跟任何设备进行了连接,用完之后必须释放资源。最简单基础班讲I/O流,Java跟文件进行了连接,用完之后关闭文件流。数据库也是一个设备。Java跟数据库连接上了用完之后也要关闭。必须把资源释放。
     //6.释放资源
        rs.close();//结果集得关
        st.close();
        con.close();
        //直接把con关闭了,数据库和程序断开了。但是statement和resultset没有及时释放,它还在内存存着。close()是释放和回收资源。
        //close()的顺序和进门出门是一样的,是进门的时候先进大门,出门的时候是最后才出大门
        //=============
       //Java可以操作数据库
       }
    }
    
  • 相关阅读:
    早该知道的7个JavaScript技巧
    ASP.NET 实现伪静态网页方法
    Nginx http大文件断点续传分块上传
    java http大文件断点续传分块上传
    B/S http大文件断点续传上传
    前端 http大文件断点续传上传
    百度WebUploader http大文件断点续传上传
    webuploader http大文件断点续传上传
    ceph 之recovery machhine
    docker private registry使用
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6626223.html
Copyright © 2011-2022 走看看