20145230《java学习笔记》第九周学习总结
20145230 《Java程序设计》第9周学习总结
教材学习内容
JDBC
JDBC简介
JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性,数据库本身是个独立运行的应用程序,你撰写的应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找。通常你的应用程序会利用一组专门与数据库进行通信协议的链接库,以简化与数据库沟通时的程序撰写。有时候,更换数据库的需求并不是没有,应用程序跨平台也是经常的需求,JDBC基本上就是用来解决这些问题的。JDBC是Java联机数据库的标准规范。具体而言,它定义了一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口由数据库厂商操作,通常称为JDBC驱动程序。JDBC标准主要分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口。如果你的应用程序需要联机数据库,就是调用JDBC应用程序开发者接口,相关API主要在java.sql与javax.sql两个包中,JDBC驱动程序开发者接口是数据库厂商操作驱动程序时的规范。厂商在操作JDBC驱动程序时,依操作方式可将驱动程序分为4种类型:
- JDBD-ODBC Bridge Driver
- Native API Driver
- JDBC-Net Driver
- Native Protocol Driver
连接数据库
为了要连接数据库系统,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序JAR文档。如果使用IDE,程序项目会由管理CLASSPATH的方式,通常是“新增JAR”之类的指令。大概可以分为:注册Driver对象、取得Connection对象、关闭Connection操作对象。
使用Statement、ResultSet
Connection是数据库连接的代表对象,接下来要执行SQL的话,必须取得java.sql.Statement操作对象,它是SQL描述的代表对象。Statement的execute()可以用来执行SQL,并可以测试SQL是执行查询或更新,返回true表示SQL执行将返回ResultSet作为查询结果。视需求而定,Statement或者ResultSet在不使用时,可以使用close()将之关闭,以释放相关资源。Statement关闭时,所关联的ResultSet也会自动关闭。
使用PreparedStatement、CallableStatement
如果有些操作只是SQL语句当中某些参数会有所不同,其余的SQL子句皆相同,则可以使用java.sql.PreparedStatement。可以使用Connection的PreparedStatement()方法建立好预先编译的SQL语句。要让SQL执行生效,要执行executeUpdate()或executeQuery()方法。在这次的SQL执行完毕后,可以调用clearParameters()清除设置的参数,之后就能再次使用这个PreparedStatement实例,所以使用PreparedStatement,可以让你先准备好一段SQL,并重复使用这段SQL语句。
JDBC进阶
使用DataSource取得联机
要取得数据库联机,必须打开网络联机(中间经过实体网络),连接至数据库服务器后,进行协议交换(当然也就是数次的网络数据往来)以进行验证名称、密码等确认动作。也就是取得数据库联机事件耗时间及资源的动作。尽量利用已打开的联机,也就是重复利用取得的Connection实例,是改善数据库联机效能的一个方式。采用联机池是基本做法。
使用ResultSet卷动、更新数据
在ResultSet时,默认可以使用next()移动数据光标至下一笔数据,而后使用getXXX()方法来取得数据。实际上,从JDBC 2.0开始,ResultSet不仅可以使用previous()、first()、last()等方法前后移动数据光标,还可以调用updateXXX()、updateRow()等方法进行数据修改。结果集类型可以指定三种设定:
ResultSet.TYPE_FORWARD_ONLY(默认)
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
指定为TYPE_FORWARD_ONLY,ResultSet就只能前进数据光标。指定TYPE_SCROLL_INSENSITIVE或TYPE_SCROLL_SENSITIVE,则ResultSet可以前后移动数据光标,两者差别在于TYPE_SCROLL_INSENSITIVE设定下,取得的ResultSet不会反映数据库中的数据修改,而TYPE_SCROLL_SENSITIVE会反映数据库中的数据修改。
交易简介
交易的四个基本要求是原子性、一致性、隔离行为与持续性。当多个交易并行时,可能引发的数据不一致问题有哪些呢?(1)更新遗失:基本上就是指某个交易对字段进行更新的信息,因另一个交易的介入而遗失更新效力。(2)脏读:两个交易同时进行时,其中一个交易更新数据但未确认,另一个交易就读取数据,就有可能发生脏读问题。(3)无法重复的读取:某个交易两次读取同一字段的数据并不一致。(4)幻读:同一交易期间,读取到的数据笔数不一致。
RowSet简介
JDBC定义了java.sql.RowSet接口,用以代表数据的列集合,这里的数据并不一定是数据库中的数据,可以是电子表格数据、XML数据或任何具有列集合概念的数据源。RowSet定义了列集合基本行为,其下有JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet、WebRowSet五个标准列集合子接口。JdbcRowSet是联机式的RowSet,也就是操作JdbcRowSet期间,会保持与数据库的联机,可视为取得、操作ResultSet的行为封装,可简化JDBC程序的撰写,或作为JavaBean使用。CachedRowSet为脱机式的RowSet,在查询并填充完数据后,就会断开与数据源的联机,而不用占据相关联机资源,必要时也可以再与数据源联机进行数据同步。
运用反射
关于Class
与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用ApplicationClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。
了解类加载器
类装入组件是 JAVA 虚拟机的基础,其是一个重要的、但又常常被我们忽略的 JAVA 运行时系统组件。它是负责在运行时查找和装入类文件的类,因此创建自己的 ClassLoader 可以非常方便的定制 JVM。
JAVA编译的程序是一种特殊的、独立于平台的格式,并非依赖于它们所运行的平台。JAVA编译的类文件在运行时并非立即全部都装入内存,而是根据程序需要装入内存,有点类似我们操作系统的虚拟存储管理,根据。ClassLoader 是 JVM 中将类装入内存的那部分。JAVA的类加载器本身就是用 JAVA编写的,这意味着创建您自己的 ClassLoader 非常容易,不必了解 JVM的低层细节。那么为什么要创建自己的类加载器呢,主要是由于JAVA默认的类加载器只能加载本地的类文件,这与JAVA的网络特性非常的不合,因此,有必要根据需要修改JAVA的类加载器方便的从网络加载类文件。
自定义泛型
在JDK1.5版本之前,如果在集合中添加了不同类型的数据,需要在程序的运行期间对类型之间的转换进行检查。
例如:
List arrayList=new arrayList();
在arrayList中添加String类型的对象和Integer对象,但是我们定义如下一个数组 String[] values=new String[arrayList.size()]; 如果想要把arrayList转换成数组的话就会出现错误: arrayList.toArray(values);//运行期间错误。
这是因为List中包含了整型封装类型的对象。但是该错误只能在运行期间才能发现,程序能够正常的通过编译,并不会报错。对于程序中出现的错误,应该尽早的通知程序员。泛型能够很好地解决这个问题。
泛型在集合中的应用: 在JDK1.5版本之后Java提供了对泛型的支持。例如对于一个ArrayList列表来说,如果只想在列表中放入String类型元素,可以用下面的方法来实现: ArrayList list=new ArrayList();
泛型使得编译器能够在编译期间对集合中加入的对象进行检查,如果加入了不同类型的对象,就会报错,而不必等到运行期间再进行相关的类型转换。和原来没有使用泛型相比,它将原来需要在运行时期才能发现的异常提前到了编译期间,使得程序的安全性也大大提高,泛型一般用于集合类中。
注释
在原始码中使用注释,对编译程序提供额外编译提示,或提供应用程序执行时期可读取的组态信息。注释可以仅用于原始码,编译后留在.class文档仅供编译程序读取或开放执行时期读取。@Override //就是标准注释,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为重新定义方法。 @Deprecated //如果某个方法原先存在与API中,后来不建议再使用,可以在该方法上注释。若有用户后续想调用或重新定义这个方法,编译程序会提出警告。对于支持泛型的API,建议明确指定泛型真正类型,如果没有指定,编译程序会提出警告。 @SuppressWarnings //指定抑制unchecked的警告产生: @SuppressWarnings(value={"unchecked"}) @SafeVarargs //表明开发人员确定避免了heap pollution问题。heap pollution问题就是编译程序无法检查执行时期的类型错误,无法具体确认自变量类型。 @FunctionalInterface //让编译程序可协助检查interface是否可做为lambda的目标类型 自定义注释类型 ·标示注释:就是注释名称本身就是信息,对编译程序或应用程序来说,主要是检查是否有注释出现,并作出对应的动作。默认会将注释信息存储于.class文档,可被编译程序或位码分析工具读取,但执行时期无法读取注释信息,在执行时期读取注释信息,可以使用java.lang.annotation.Retention搭配java.lang.annotation.RetentionPolicy枚举指定。 RetentionPolicy为RUNTIME的时机,在于让注释在执行时期提供应用程序信息,可使用java.lang.reflect.AnnotatedElement接口操作对象取得注释信息。 JDK 8中新增了getDeclaredAnnotation()、getDeclaredAnnotationsByType()、getAnnotationsByType()三个方法。 getDeclaredAnnotation()可以让你取回指定的标注,在指定@Repeatable的标注时,会寻找收集重复标注的容器。 getDeclaredAnnotationsByType()、getAnnotationsByType()就不会处理@Repeatable的标记。
教材学习中的问题和解决过程
学习的问题主要就是学的内容太多,自己化了很少的时间去看了这部分的内容,虽然大致理解了最后这三章在介绍什么东西,但要说自己是否深刻理解了其中的内涵,那肯定没有。感觉越多越杂的知识就更需要自己用更多的时间去学习,去理解,去实践。慢慢地去敲每一行代码,慢慢地去理解每一个知识点的含义,慢慢地去领悟java这门神奇的语言,反正,要解决这样的窘境,只能靠自己不断地动手,不断地练习。
本周代码托管截图
其他(感悟、思考等,可选)
本周主要学习了最后三章的内容。最大的感悟就是,不管自己真正学到了什么东西,但好说歹说也算把这本厚厚的java学习笔记过了一遍。虽然自己可能很多东西都模棱两可,但也算完成了一项任务,自己还是感觉有一点成就感。毕竟,可能其他同学不懂的东西,我有可能懂一点皮毛。每周发博客的习惯也坚持了下来,不说质量如何,但自己能坚持也算是一种不错的收获。娄老师让我们以这样的一种方式学习,肯定有其用意,是想让我们学会怎样去学习,学会以怎样的一种积极主动的态度去学习,我感觉可以将这样一种方法用在其他科目的学习中。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 2000 行 | 25篇 | 400小时 | |
第一周 | 100/100 | 2/2 | 20/20 | |
第二周 | 100/200 | 2/4 | 20/40 | |
第三周 | 50/250 | 1/5 | 20/60 | |
第四周 | 564/814 | 2/7 | 30/90 | |
第五周 | 623/1437 | 1/8 | 30/120 | 了解到了程序中的异常处理 |
第六周 | 2/9 | 30/120 | 了解到了java的输入与输出 | |
第七周 | 425/1872 | 2/11 | 20/140 | 了解到了Lambda语法与java中的日期与时间 |
第八周 | 265/2117 | 2/13 | 了解到了一些日志API | |
第九周 | 591/2708 | 2/15 | 30/150 | 初步认识SQL |