20145226夏艺华 《Java程序设计》第9周学习总结

教材学习内容总结

学习目标

  1. 了解JDBC架构

  2. 掌握JDBC架构

  3. 掌握反射与ClassLoader

  4. 了解自定义泛型和自定义枚举

  5. 会使用标准注解

第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种类型:

  1. JDBC-ODBC Bridge Driver
    ODBC是由Microsoft主导的数据库连接标准;JDBC-ODBC Bridge Driver驱动程序会将JDBC调用转换为对ODBC驱动程序的调用,由ODBC驱动程序操作数据库。

  2. Native API Driver
    这个类型的驱动程序会以原生方式,调用数据库提供的原生链接库,所以驱动程序本身与平台相依,没有达到JDBC驱动程序的目标:跨平台;由于直接调用数据库原生API,因此在速度上,有机会成为4种类型中最快的驱动程序。

  3. JDBC-Net Driver
    JDBC驱动程序会将JDBC方法调用转换为特定的网络协议调用;可以使用纯粹的Java技术来实现,从而实现跨平台;由于通过中介服务器转换,速度较慢,获得架构弹性是使用这种类型驱动程序的目的。

  4. Native Protocal Driver
    驱动程序可以使用纯粹Java技术实现,因此这种类型驱动程序可以跨平台;是最常见的驱动程序类型。

(二)连接数据库

为了要连接数据库系统,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序JAR文档。基本数据库操作相关的JDBC接口或类是位于java.sql包中,要取得数据库联机,必须有几个动作:

  1. 注册Driver操作对象

  2. 取得Connection操作对象

  3. 关闭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 自定义泛型

泛型,即“参数化类型”。泛型就是将类型由原来的具体的类型参数化,此时类型也定义成参数形式,然后在调用时传入具体的类型。

泛型也可以仅定义在方法上,可在方法返回类型前使用定义泛型,之后就可以使用T来定义返回类型、参数类型,或在方法内声明变量、转换类型等,在定义泛型时,使用extends限制指定T实际类型时,必须是某类的子类。

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
posted @ 2017-02-12 22:10  夏艺华20145226  阅读(234)  评论(5编辑  收藏  举报