我们找的不是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可以操作数据库
}
}

day17-jdbc 4.DriverManager详解的更多相关文章

  1. JDBC常用接口详解

    JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...

  2. mysql:JDBC url 参数详解

    MySql链接url参数详解 jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... ...

  3. day17—Flex弹性布局详解(一)

    转行学开发,代码100天——2018-04-02 今天看到一篇大神的文章,关于flex布局的详解,对flex用法介绍的相当详细,非常有助于我等初学者更深入了解这种布局方式. 文章链接 [基础知识]Fl ...

  4. Java jdbc 操作数据库详解

    原文地址https://www.cnblogs.com/huguodong/p/5910859.html JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  5. jdbc 操作步骤详解

    package com.itheima.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql ...

  6. jmeter jdbc request使用详解

    1.在使用 jdbc request之前需要加载一个jar包 在test plan中将jar包引入到classpath中 2.创建一个JDBC Connection Configuration Var ...

  7. Jmeter JDBC Request 使用详解

    本篇博文讲解以MySQL为例,搞懂JDBC Request中MySQL的使用方法,换成其它数据库, 如Oracle.PSQL也会很容易上手. 一.基本配置 1.首先我们先了解一下,不同数据库的驱动类和 ...

  8. java基础之JDBC一:概述及步骤详解

    1. JDBC的简介 概述: 就是Java用来操作不同数据库(DBMS)的类库(技术), 本质就是一些类和接口. /* 类: DriverManager 接口: Driver, Connection, ...

  9. Java学习:JDBC各类详解

    JDBC各个类详解 代码实现: //1.导入驱动jar包 //2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //3.获取数据库连对象 ...

随机推荐

  1. spring boot 基础篇 -- 阿里多数据源

    这块是比较基础的配置,阿里数据库配置还是比较好用的,并且可以用来监控数据源的情况.废话不多说,下面看代码. 基于maven项目,在pom.xml中添加引用: <dependency> &l ...

  2. win32下开发hadoop

    转载自:http://my.oschina.net/muou/blog/408543[木偶:Windows下使用Hadoop2.6.0-ecli­p­s­e­-­p­­lugin插件] 对于一些细节地 ...

  3. Red hat linux 下配置Java环境(jdk)

      1.把jdk-6u25-linux-i586-rpm.bin 复制到redhat linux中,放到/usr/java 目录下,该目录是mkdir 的,并chmod 755 jdk-6u25-li ...

  4. 使用NSUserDefaults保存自定义对象(转)

    转自http://zani.iteye.com/blog/1431239 .h文件 #import <Foundation/Foundation.h> @interface MyObjec ...

  5. OpenCV教程【002 VideoCapture加载并播放视频】

    #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...

  6. WC2019 滚粗记

    离开的时候一定是笑着离开的 不然就再也回不来了 广州二中,七月再见

  7. CodeForces - 827A:String Reconstruction (基础并查集)

    Ivan had string s consisting of small English letters. However, his friend Julia decided to make fun ...

  8. 455. Assign Cookies Add to List

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  9. Scala 面向接口编程

    1.如果要实现一个接口,前边没有extends关键字就可以使用extends,如果有要使用with关键字 2.Scala 中的接口支持多种继承,类或者抽象类不支持多种继承 3.抽象属性:未被实例化的属 ...

  10. [Luogu3852][TJOI2007]小朋友

    luogu 题意 求弦图的最大独立集. sol 按照完美消除序列一个个贪心选即可. code #include<cstdio> #include<algorithm> #inc ...