教材内容介绍
一 JDBC简介
JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性
JDBC标准分为两个部分:JDBC应用程序开发者接口、JDBC驱动程序开发者接口
厂商在操作JDBC驱动程序时,依照操作方式可以将驱动程序分成四类
- Tpye 1:JDBC-ODBC Bridge Driver 驱动程序将JDBC调用转换为对ODBC驱动程序的调用,由ODBC驱动程序操作数据库
- Tpye 2:Native API Driver 驱动程序会以原生方式调用数据库提供的原生链接库
- Tpye 3:JDBC-Net Driver 驱动程序会将JDBC方法调用转换成特定的网络协议调用
- Tpye 4:Native Protocol Driver 驱动程序将JDBC调用转换成数据库特定的网络协议与数据库进行沟通操作
连接数据库
Statement、ResultSet: Conection是数据库连接的代表对象,接下来必须取得java.sql.Statement操作对象 调用clearstatement清除设置的参数,之后就能再次使用这个PreparedStatement实例
二 JDBC进阶
使用DataSource取得联机:messageDAO依赖于 javax.sql.DataSource接口,可以通过定义的getConnection()方法取得Connection
使用ResultSet卷动、更新数据:ResultSet不仅可以使用previous() first()、last()等方法前后移动数据,还可以调用updateXXX()、updateRow()
批次更新:仅仅用在更新操作,且批次更新的限制是SQL不能是SELECT
交易:四个基本要求(ACID) 原子性(Atomicity) 一致性(Consisitency) 隔离行为(Isolathion) 持续性(Durability)
三.反射与类加载器
一个命令对应一个进程
当我们启动一个Java程序,即启动一个main方法时,都将启动一个Java虚拟机进程,不管这个进程有多么复杂。而不同的JVM进程之间是不会相互影响的。这也就是为什么说,Java程序只有一个入口——main方法,让虚拟机调用。而两个mian方法,对应的是2个JVM进程,启动的是两个不同的类加载器,操作的实际上是不同的类。故而不会互相影响。
类加载
当我们使用一个类,如果这个类还未加载到内存中,系统会通过加载、连接、初始化对类进行初始化。
1、类加载:指的是将类的class文件读入JVM,并为之创建一个Class对象。
2、类连接:指的是把类的二进制数据合并到JRE中,这又分为3个阶段:
a)、校验:检查载入Class文件数据的正确性。
b)、准备:给类的静态变量分配存储空间,并进行默认初始化。
c)、解析:将类的二进制数据中的符号引用替换成直接引用。
3、初始化:对类的静态变量、静态初始化块进行初始化。
(注意:一个final类型的静态属性,如果在编译时已经得到了属性值,那么调用该属性时,不会导致该类初始化,因为这个相当于使用常量;
使用ClassLoader()方法,只是加载该类,并未初始化。)
三、类加载器。
类加载器就是负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象,它负责加载所有的类,而一旦一个类被加载入JVM中,就不会被再次载入了。
在Java中,一个类用其全限定类名(即包名+类名)作为标识。
而在JVM中,一个类用其全限定类名和其类加载器作为标识。
JVM运行时会产生3个ClassLoader,分别为:BootstrapClassLoader(根类加载器)、ExtClassLoader(扩展类加载器)和AppClassLoader(系统类加载器)。UML结构如下:
四、类加载机制。
JVM的类加载机制主要有如下三种机制:
1、全盘负责:当一个类加载器负责加载某个Class的时候,该Class所依赖的和引用的其他Class也将由该类加载器负责载入。
2、父类委托:先委托父加载器试图加载该类,只有在父加载器无法加载该类时才从自己的类路径中查找并装载该类。
3、缓存机制:缓存机制保证所有被家加载过的类都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存中搜寻。缓存中搜寻不到,才会重新读取该类对应的二进制数据,并创建对应的Class对象。
(注意:类加载器之间的父子关系,并不是类继承上的父子关系,而是类加载器实例之间的关系)
自定义类加载器
重写ClassLoader的loadClass打破双亲委托,findClass遵循双亲委托,defineClass方法将字节码转换成Class对象,并校验有效性,该方法是final方法。
补充:URLClassLoader是系统类加载器和扩展类加载器的父类(除根类加载器之外的所有加载器都是ClassLoader子类的实例,根加载器是JVM自身实现的),它既可以从本地文件获取二进制文件加载类,也可以从远程主机获取二进制文件加载类
五、反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
教材中的问题及解决
问题:区分不了幻读与无法重复的读取,隔离层级“可重复读取”、“可循序”
解决过程:结合教材的图解,“可重复读取”针对两次交易读取数据不一致,同一交易读取数据必须相同的情况,“可循序”针对同一交易期间读取到的数据不一致,在数据不一致时,交易可以照顺序逐一进行
代码调试及解决过程
没有发现代码调试上的问题。
代码托管
https://git.oschina.net/bestiisjava2017/nhx20155309-Java
结对及互评
结对对象:
20155220 吴思其http://www.cnblogs.com/20155220wsq/p/6718224.html
互评对象:
20155314 刘子健http://www.cnblogs.com/crazymosquito/p/6711316.html#3670478
20155336 虎光元http://www.cnblogs.com/hxl681207/p/6709628.html
20155223 苏黄永郦http://www.cnblogs.com/battlefieldheros/p/6711388.html
20155230 张瑞琦http://www.cnblogs.com/J1n233/p/6719877.html
错题总结及分析
1.Linux中使用rm删除文件时,如果想忽略提示,直接删除文件,可以使用()选项强制删除。
A .
-r
B .
-R
C .
-c
D .
-f
答案是d
2.Linux中使用cp命令拷贝目录时要加上()选项。
A .
-r
B .
-directory
C .
-all
D .
-R
答案是ad
3.Linux中获取当前路径的绝对路径的命令是()?
A .
cd
B .
passwd
C .
tree
D .
pwd
答案是d
4.NIO2中,可以使用()中的方法取出文件系统根目录信息。
A .
Path
B .
DirectoryStream
C .
FileStore
D .
FileSystem
答案是d
5.Java NIO中与InputStream/OutputStream相对应的接口是(),用来连接数据节点。
A .
Channel
B .
Buffer
C .
Path
D .
FileStore
答案是a
6.正则表达式 zo* 匹配()
A .
z
B .
zo
C .
zoo
D .
zooooooooooooooooooooooooooo
答案是abcd
7.正则表达式 r.t 能够匹配字符串()
A .
rat
B .
rt
C .
rut
D .
root
答案是ac
8.正则表达式“r.t”匹配字符串“rat”的Java 代码表达式是()
A .
"rat".matcher("r.t")
B .
"r.t".matcher("rat")
C .
Pattern.compile("rat").matcher("r.t")
D .
Pattern.compile("r.t").matcher("rat")
答案是d
9.Suppose we have an array of String objects identified by the variable names. Which of the following for loops will not correctly process each element in the array.(假如我们有一个名为names的String对象数组,下面哪个for循环不能遍历数组中的每一个元素?)
A .
for(int i = 0; i < names.length; i++)
B .
for(String name : names)
C .
for(int i = 0; i < names.length(); i++)
D .
none of these will correctly process each element(以上都不能遍历)
E .
all of these will correctly process each element(以上都能遍历)
答案是c
10.可以通过Logger logger = new Logger(); 来产生Logger对象。
A .
True
B .
False
答案是b
学习与感悟
不知不觉课本上的内容已经接近了尾声。但是感觉自己对于java课程的了解还只是杯水车薪。在java路上还有很长一段路要走。正如同每周的小测验就算是自己感觉掌握得很好,可是结果还是不尽如人意。所以书自己准备再翻阅一遍,希望之后自己对java的理解能更深。
学习进度条
代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 50/100 1/1 24/24
第二周 250/300 1/2 30/54
第三周 552/852 1/3 16/60
第四周 717/1569 1/4 10/70
第五周 495/2064 1/5 6/76
第六周 754/2818 1/6 7/82
第七周 679/3493 2/8 5/87
第八周 302/3795 3/8 6/90
预计学习时间6小时
实际学习时间3小时