一、今天收获的事情
JDBC是什么?
JDBC是一个Java API,用中文可以通俗的解释为,使用Java语言访问访问数据库的一套接口集合。这是调用者(程序员)和实行者(数据库厂商)之间的协议,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC(java database connection)
既然JDBC也是由Java类和接口组成,那么首先要学习的是,它属于哪个包下面。
在JDBC中包含了两个包:java.sql和javax.sql
- java.sql:基本功能,这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些儿高级的处理,比如批处理更新、事务隔离和可滚动结果集等。
- javax.sql:扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。
JDBC编程
- 注册驱动(有三种方式)
①class.forName("oracle.jdbc.driver.OracleDriver");
Java规范中明确规定,所有的驱动程序必须在静态初始代码块中将驱动注册到驱动程序的管理器中,
static{ try{ Class.forName(driver);
} catch(Exception ex){
ex.printStackTrace();
}
}
这样做的好处是,再类被加载到工程时就被执行了,而且之执行一次,数据库驱动只要加载一次就可以了。
【知识点】 Class类
在这里面我们看到了,这个里面有一个Class类,它调用了一个forName()方法,那么这个Class类是个什么东西呢?
Class类是在java.lang包下的,所以不用手动的导入。
看一下Class的构造方法[1]
private Class(ClassLoader loader){
classLoader = loader;
}
不用去管什么ClassLoader,看了一眼private关键字,应该就知道了,当private修饰构造方法的时候,说明该类是不能在类的外面进行实例化的。所以Class类不能像普通的类一样,以new Xxx()
的形式进行创建对象,它的对象只能由JVM创建。[2]
Class类到底是什么呢?不妨我们通俗的说一下,Java程序在运行的时候,我们会让它创建一些对象,系统通过RTTI对所有的对象进行运行时类型表示。
【知识点】RTTI
RTTI(runtime type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
我们把它叫成运行时类型信息,或许更加的好理解。这个是Java语言中很强大的机制。
首先要知道的运行时都会存在哪些类型信息呢?如果一个类继承自另一个类,在创建子类的对象时,需要RTTI存储这些关系,他会有typeid操作符,返回指针和引用所指的实际类型,typeid函数等等,我们简要的理解为Java的RTTI里面就是记录着各种类型的信息。
以下是一些常用的方式。
- A = (A)b;向下转型
我们可以针对于基类来编程,从而降低程序的耦合度,以Java来说常常通过继承的方式,来达到这种效果。
public class Demo {
public static void main(String[] args) { Animal [] animals = new Animal[2];
animals[0] = new Tiger();
animals[1] = new fish(); for (Animal animal : animals) {
animal.breath();
}
}
}abstract class Animal { abstract void breath();
}class Tiger extends Animal{ @Override
void breath() { // TODO Auto-generated method stub
}
}class fish extends Animal{ @Override
void breath() { // TODO Auto-generated method stub
}
}
像这种继承关系,之所以能够编译通过,是因为Tiger和FIsh都会向上转为基类,他们自身的类型信息会丢失,但是程序运行的时候,当我们调用animal.breath();
它们却能准确的找到所属类型的方法进行调用,这是为什么呢?这就是运行时绑定(动态绑定)机制。
进一步分析,RTTI里面就是存储着程序运行时类型的方法列表,继承结构等等信息。
- load class(类的装载过程)
类从被加载到卸载,他的生命周期包括:加载 验证 准备 解析 初始化 使用 和卸载七个阶段
而类的加载阶段有:加载 验证 准备 解析 初始化。
重点说一下加载阶段:类只有在要运行的时候才会被加载进JVM,编译后的class文件现在还没有加载到jvm,当我们命令行输入java xxx.class
,这个时候类才开始加载到虚拟机,一般来说一个class只会被加载一次,下一次就会从Jvm的class缓存中获取,不会再去文件系统中获取了。具体的过程是:java这个命令是java.exe进行的,java.exe找到jre,再找到JRE中的jvm.dll,这个就是Java 虚拟机,这个时候虚拟机启动,它首先就加载了第一个类加载器--Bootstrap Loader,这个BootstrapLoader又加载了第二个类加载器ExtClassLoader,设定parent为null(本质上是bootstraploader,但是它是由C++编写的,无法找到这个实例)这个BootstrapLoader又加载了最后一个类加载器APPClassLoader,设定它的parent为ExtClassLoader。 - 类的类class of classes
参考资料
[1] 浅谈Java中的Class类
[2] Java中Class类及用法
[3] RTTI
[4] 深入Java类型信息:RTTI
[5] 类加载的全过程
[6] java类加载过程
[7] 深入理解java类加载起ClassLoader
评论