教材学习内容总结
学习目标
-
了解JDBC架构
-
掌握JDBC架构
-
掌握反射与ClassLoader
-
了解自定义泛型和自定义枚举
-
会使用标准注解
第16章 整合数据库
16.1 JDBC入门
(一)JDBC简介
JDBC全名Java DataBase Connectivity,是联机数据库的标准规范。具体而言,它定义一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口会由数据库厂商操作,通常称为JDBC驱动程序(Driver)。应用程序调用JDBC标准API如下:
JDBC标准分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口。如果应用程序需要联机数据库,就是调用JDBC应用程序开发者接口,相关API主要在java.sql与javax.sql两个包中。JDBC驱动程序开发者接口是数据库厂商操作驱动程序时的规范,一般开发者并不用了解。JDBC应用程序开发者接口如下所示:
厂商在操作JDBC驱动程序时,依操作方式可将驱动程序分为4种类型:
-
JDBC-ODBC Bridge Driver
ODBC是由Microsoft主导的数据库连接标准;JDBC-ODBC Bridge Driver驱动程序会将JDBC调用转换为对ODBC驱动程序的调用,由ODBC驱动程序操作数据库。 -
Native API Driver
这个类型的驱动程序会以原生方式,调用数据库提供的原生链接库,所以驱动程序本身与平台相依,没有达到JDBC驱动程序的目标:跨平台;由于直接调用数据库原生API,因此在速度上,有机会成为4种类型中最快的驱动程序。 -
JDBC-Net Driver
JDBC驱动程序会将JDBC方法调用转换为特定的网络协议调用;可以使用纯粹的Java技术来实现,从而实现跨平台;由于通过中介服务器转换,速度较慢,获得架构弹性是使用这种类型驱动程序的目的。 -
Native Protocal Driver
驱动程序可以使用纯粹Java技术实现,因此这种类型驱动程序可以跨平台;是最常见的驱动程序类型。
(二)连接数据库
为了要连接数据库系统,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序JAR文档。基本数据库操作相关的JDBC接口或类是位于java.sql包中,要取得数据库联机,必须有几个动作:
-
注册Driver操作对象
-
取得Connection操作对象
-
关闭Connection操作对象
16.2 JDBC进阶
交易的四个基本要求是原子性、一致性、隔离行为与持续性。
- 原子性:一个交易是一个单元工作,可能包含多个步骤,这些步骤必须全部执行成功,若一个失败,则整个交易失败。
- 一致性:交易作用的数据集合在交易前后必须一致。
- 隔离行为:交易与交易之间,必须互不干扰。
- 持续性:交易一旦成功,所有变更必须保存下来。
当多个交易并行时,可能引发的数据不一致问题:
更新遗失:基本上就是指某个交易对字段进行更新的信息,因另一个交易的介入而遗失更新效力。
脏读:两个交易同时进行时,其中一个交易更新数据但未确认,另一个交易就读取数据,就有可能发生脏读问题。
无法重复的读取:某个交易两次读取同一字段的数据并不一致。
幻读:同一交易期间,读取到的数据笔数不一致。
JDBC定义了java.sql.RowSet接口,用以代表数据的列集合,这里的数据并不一定是数据库中的数据,可以是电子表格数据、XML数据或任何具有列集合概念的数据源。RowSet定义了列集合基本行为,其下有JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet、WebRowSet五个标准列集合子接口,定义在javax.sql.rowset包中。
第17章 反射与类加载器
17.1 运用反射
Java真正需要某个类时才会载入对应的.class文档,而非在程序启动时就加载所有类。java.lang.Class的实例代表Java应用程序运行时载入的.class文档,类、接口、Enum等编译后,都会生成.class文档。Class类没有公开(public)构造函数,实例是由JVM自动产生,可以通过Object的getClass()方法,或者是透过.class常量取得每个对象对应的Class对象。
可以使用Class.forName()方法实现动态加载类,可用字符串指定类名称来获得类相关信息。Class.forName()方法在找不到指定类时会抛出ClassNotFoundException异常。
Class对象加载的.class文档,取得Class对象后,就可以取得.class文档中记载的信息,例如包、构造函数、方法成员等类型。每个类型都会有对应的类型,如果事先不知道类名称,可以利用Class.forName()动态加载.class文档,取得Class对象之后,利用其newInstance()方法建立类实例。
17.2 了解类加载器
类加载器都继承自抽象类java.lang.ClassLoader,每个.class文档加载后,都会有个Class实例来代表。可以由Class的getClassLoader()取得加载对应.class文档的ClassLoader实例,而ClassLoader的getParent()方法可以取得父ClassLoader实例。
由同一类加载器载入的.class文档,只会有一个Class实例。如果同一.class文档由两个不同的类加载器载入,则会有两份不同的Class实例。
第18章 自定义泛型、枚举与注释
18.1 自定义泛型
泛型,即“参数化类型”。泛型就是将类型由原来的具体的类型参数化,此时类型也定义成参数形式,然后在调用时传入具体的类型。
泛型也可以仅定义在方法上,可在方法返回类型前使用
18.2 自定义枚举
Enum是个抽象类,无法直接实例化,它操作了Comparable接口,在compareTo()方法中,主要是针对ordinal成员比较。定义enum时可以自定义构造函数,条件是不得为公开(public)构造函数,也不可以在构造函数中调用super(),定义enum时有个特定值类本体语法,可用于操作接口或重新定义父类方法。
18.3 注释
@Override在原始码中提供编译程序的信息是,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为重新定义方法。
教材学习中的问题和解决过程
1.在教材548页中捕捉ClassNotFoundExceotion异常出现错误,如下图:
原因是程序中没有语句出现ClassNotFoundExceotion异常,所以catch错误,只能throws异常。
代码调试中的问题和解决过程
1.在连接数据库时出现ClassNotFoundException问题:
出现这个问题的原因是没有导入对应的library,所以导入对应的mysql-connector-java-5.1.40-bin.jar文件。之后还会出现新的错误,原因是没有安装对应的数据库软件,安装软件后就没有错误了。
本周代码托管截图
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第二周 | 200/400 | 1/3 | 12/52 | |
预备作业 | 0/400 | 1/4 | 15/67 | |
第三周 | 500/900 | 1/5 | 10/77 | |
第四周 | 500/1500 | 1/6 | 15/92 | |
第五周 | 500/2000 | 1/7 | 20/112 | |
第六周 | 500/2500 | 2/9 | 20/132 | |
第七周 | 500/3000 | 2/11 | 30/162 | |
第八周 | 500/3500 | 2/13 | 20/182 | |
第九周 | 700/4200 | 2/15 | 30/212 |