我们找的不是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. java时间戳转换

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Da ...

  2. 一张图入门QT设计器

    哈哈哈,这个名字听起来就是骗阅读量的.

  3. syq小姐姐的分享的历年考试经验

    一>读题 10~20min浏览题目,把握题目方向和做题大致顺序 不要轻敌,最好先看完题目,大概掌握整套题的难度顺序再动手 仔细读题步骤: (1)文件名(也是检查的重点,绝对重要,注意区分l和1和 ...

  4. windows下mysql提示Can't connect to MySQL server on 'localhost'

    1.开cmd输入mysqld --defaults-file="c:\Program Files (x86)\MySQL\MySQL Server 5.6\my-default.ini&qu ...

  5. CodeForces - 688C:NP-Hard Problem (二分图&带权并查集)

    Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex c ...

  6. wpf和winform的那点区别

    一提起winform和wpf有啥不同,可能大部分人都会想到wpf拥有漂亮的界面.wpf中也可以使用winform,大部分情况下,都没有任何问题,极少的情况下,可能会出现问题. 我们就来看一下: voi ...

  7. Makefile 自动产生依赖 ***

    代码如下: 其实这里主要是为每个C文件建立一个同名的后缀为.d.该文件的作用是使用gcc的-M属性来自动生成.o文件的头文件依赖关系. 第1,2,4都好理解. 第2行解释: 使用gcc -M 的属性将 ...

  8. openTSDB+HBase+ZK遇到的坑汇总

    1.zookeeper返回的hbase地址是hostname,外网如何访问? 如果需要直接访问zk获取hbase地址进而访问,目前需要本机配置host ip  hostname 如果是要长期解决方法, ...

  9. Common 通用类库

    /// <summary> /// 传入虚拟路径 返回全路径的html字符串 /// </summary> /// <param name="context&q ...

  10. Xcode的Refactor使用

    最近在看<重构>的书,想到Xcode有一个Refactor的功能,不知道您用的多不多,用这个功能在我们开发过程中,可以提高开发效率. Refactor 右键显示 Refactor 一.Re ...