20155236 2016-2017-2 《Java程序设计》第九周学习总结
20155236 2016-2017-2 《Java程序设计》第九周学习总结
教材学习内容总结
JDBC入门
1.JDBC简介
JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性,数据库本身是个独立运行的应用程序,你撰写的应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找。通常你的应用程序会利用一组专门与数据库进行通信协议的链接库,以简化与数据库沟通时的程序撰写。有时候,更换数据库的需求并不是没有,应用程序跨平台也是经常的需求,JDBC基本上就是用来解决这些问题的。JDBC是Java联机数据库的标准规范。具体而言,它定义了一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口由数据库厂商操作,通常称为JDBC驱动程序。JDBC标准主要分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口。
2.连接数据库
为了要连接数据库系统,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序JAR文档。
3.使用Statement、ResultSet
Connection
是数据库连接的代表对象,接下来要执行SQL的话,必须取得java.sql.Statement
操作对象,它是SQL描述的代表对象。Statement
的execute()
可以用来执行SQL,并可以测试SQL是执行查询或更新,返回true
表示SQL执行将返回ResultSet
作为查询结果。视需求而定,Statement
或者ResultSet
在不使用时,可以使用close()
将之关闭,以释放相关资源。Statement
关闭时,所关联的ResultSet
也会自动关闭。
4.使用PreparedStatement
、CallableStatement
如果有些操作只是SQL语句当中某些参数会有所不同,其余的SQL子句皆相同,则可以使用java.sql.PreparedStatement
。可以使用Connection
的PreparedStatement()
方法建立好预先编译的SQL语句,当中参数会变动的部分,先指定“?”这个占位字符。在JDBC里要表示日期,是使用java.sql.Date
,其日期格式是“年、月、日”,要表示时间的话则是使用java.sql.Time
,其时间格式为“时、分、秒”,如果要表示“时、分、秒、微秒”的格式,你可以使用java.sql.Timestamp
。
二、JDBC进阶
1.使用ResultSet
卷动、更新数据
在ResultSet
时,默认可以使用next()
移动数据光标至下一笔数据,而后使用getXXX()
方法来取得数据。结果集类型可以指定3种设定:ResultSet.TYPEFORWARDONLY
(默认)、ResultSet.TYPESCROLLINSENSITIVE
、ResultSet.TYPESCROLLSENSITIVE
。更新设定可以有两种指定:ResultSet.CONCURREADONLY
(默认)、ResultSet.CONCUR_UPDATABLE
。如果要使用ResultSet进行数据修改,则有些条件限制:必须选取单一表格、必须选取主键、必须选取所有NOT NULL的值。
2.批次更新
每一次执行executeUpdate
(),其实都会向数据库发送一次SQL,如果大量更新的SQL有一万笔,就等于通过网络进行了一万次的信息传送,网络传送信息实际上必须打开I/O、进行路由等动作。所以最好就是所有收集的SQL,最后会串为一句SQL,然后传送给数据库,既然是批次更新,顾名思义,就是仅用在更新上,所以批次更新的限制是,SQL不能是SELECT,否则会抛出异常。
3.Blob与Clob
如果要将文档写入数据库,可以在数据库表格字段上使用BLOB或CLOB数据类型,BLOB用于存储大量二进制数据,像是图档、影音档等,CLOB用于存储大量的文字数据。
4.交易简介
交易的四个基本要求是原子性、一致性、隔离行为与持续性。当多个交易并行时,可能引发的数据不一致问题有哪些呢?(1)更新遗失:基本上就是指某个交易对字段进行更新的信息,因另一个交易的介入而遗失更新效力。(2)脏读:两个交易同时进行时,其中一个交易更新数据但未确认,另一个交易就读取数据,就有可能发生脏读问题。(3)无法重复的读取:某个交易两次读取同一字段的数据并不一致。(4)幻读:同一交易期间,读取到的数据笔数不一致。
5.metadata简介
Metadata即“诠读数据的数据”,数据库是用来存储数据的地方,然而数据库本身产品名称为何?数据库中有几个数据表格?表格名称为何?表格中有几个字段等?这些都是metadata
。
6.RowSet简介
JDBC定义了java.sql.RowSet
接口,用以代表数据的列集合,这里的数据并不一定是数据库中的数据,可以是电子表格数据、XML数据或任何具有列集合概念的数据源。RowSet
定义了列集合基本行为,其下有JdbcRowSet
、CachedRowSet
、FilteredRowSet
、JoinRowSet
,WebRowSet
五个标准列集合子接口。JdbcRowSet
是联机式的RowSet
,也就是操作JdbcRowSet
期间,会保持与数据库的联机,可视为取得、操作ResultSet
的行为封装,可简化JDBC程序的撰写,或作为JavaBean
使用。CachedRowSet
为脱机式的RowSet
,在查询并填充完数据后,就会断开与数据源的联机,而不用占据相关联机资源,必要时也可以再与数据源联机进行数据同步。
教材学习中的问题和解决过程
- 区分不了幻读与无法重复的读取,隔离层级“可重复读取”、“可循序”
解决:“可重复读取”针对两次交易读取数据不一致,同一交易读取数据必须相同的情况,“可循序”针对同一交易期间读取到的数据不一致,在数据不一致时,交易可以照顺序逐一进行 - 默认会将注释信息存储于.class文档,可被编译程序或位码分析工具读取,但执行时期无法读取注释信息,在执行时期读取注释信息,用什么方式?
可以使用java.lang.annotation.Retention搭配java.lang.annotation.RetentionPolicy枚举指定。
代码调试中的问题和解决过程
-
P509的代码
-
Connection使用尝试自动关闭资源语法,所以执行完try区块后,Connection的close()就会被调用。
代码托管
上周考试错题总结
- 1.正则表达式”(‘|”)(.*?)\1”匹配 “'Hello',"World””的结果是(D)
:
A . 不匹配
B . 'Hello'
C . "World"
D . 'Hello',"World"
解释:反向引用 \1 代表第一个()中的匹配内容
2.正则表达式 zo* 匹配(ABCD)
:
A . z
B . zo
C . zoo
D . zooooooooooooooooooooooooo
解析:* 可以是0次
3.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循环不能遍历数组中的每一个元素?)
:(C)
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不能正确处理每个元素。长度变量不是方法,因此在它之后没有圆括号。选择b是使用foreach循环处理数组的示例,并且选择a是循环的正确。
4.正则表达式“r.t”匹配字符串“rat”的Java 代码表达式是(D)
A .
"rat".matcher("r.t")
B .
"r.t".matcher("rat")
C .
Pattern.compile("rat").matcher("r.t")
D .
Pattern.compile("r.t").matcher("rat")
5.Which of the statements is true about the following code snippet?(对于下面的代码段,说法正确的是?)(D)
int[] array = new int[25];
array[25] = 2;
A .
The integer value 2 will be assigned to the last index in the array.(整数2会赋给数组中最后一个元素)
B .
The integer value 25 will be assigned to the second index in the array.(整数25会赋给数组中的第2个索引)
C .
The integer value 25 will be assigned to the third value in the array. (整数25会赋给数组中的第3个元素)
D .
This code will result in a compile-time error.(代码会产生编译时错误)
E .
This code will result in a run-time error. (代码会产生运行时错误)
解析:此代码将抛出一个对象的大小时抛出,因为这个数组中最后一个指数是24。这会导致运行时错误。
结对及互评
- 学习内容
-
注册Driver的操作对象
操作
Driver
接口的对象是JDBC进行数据库存取的起点。 -
取得Connection操作对象
-
Connection
接口的操作对象是数据库联机代表对象,要取得Connection操作对象,可以通过DriverManager的getConnection()
: -
Connection conn = DriverManager.getConnection(jdbcUrl, username, passwd);
-
除了基本的用户名称、密码之外,还必须提供
JDBC URL
,其定义了连接数据库时的协议、自协议、数据源识别。 -
主机名可以市本机或其他联机主机名、地址,
MySQL
端口默认为3306。
- 关闭connection操作对象
-
取得
Connection
对象之后,可以使用isClosed()
方法测试与数据库的链接是否关闭。 -
在操作完数据库之后,若确定不再需要连接,则必须使用
close()
来关闭与数据库的连接,以释放连接时相关的必要资源,像是联机相关对象、授权资源等。
结对照片
点评过的同学博客和代码
其他(感悟、思考等,可选)
我知道第16章、第17章和第18章跟之前一样,还是介绍一些类的应用,于是我采取和之前一样的办法,一边看书,一边总结,看书上总共介绍了多少种API,每一种API的架构是什么,每一种API的作用与注意事项是什么。就这样有系统的去学习,感觉效率十分高!而且头脑思绪清晰。娄老师课上强调了数据库这一章节内容的重要性,因为这部分知识与我们大三要学习的内容息息相关,于是我刻意的在16章花更多的时间,更仔细的敲代码,发现问题。其实这些知识不是难,我们只是感到陌生而已。同学们有了畏难情绪和厌学情绪,当然就学不进去了,还谈什么效率!这三章的知识不像之前的对象、封装、继承、多态那些概念那么抽象难懂,都是活生生的具体的例子,接受起来其实也挺快的。娄老师说的很对,重要的不是要你学多少java知识,而是通过不断的学习过程,来总结出一套适合自己的良好的学习方法,这将受用一生。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10/10 | 1/1 | 10/10 | |
第二周 | 100/100 | 2/2 | 19/25 | |
第三周 | 200/278 | 1/3 | 10/26 | |
第四周 | 660/938 | 1/4 | 10/36 | |
第五周 | 1100/2100 | 1/5 | 18/54 | |
第六周 | 740/2840 | 1/6 | 23/77 | |
第七周 | 352/3192 | 2/8 | 20/97 | |
第八周 | 631/3805 | 1/9 | 20/117 | |
第九周 | 2/11 | 20/137 |
-
计划学习时间:30小时
-
实际学习时间:20小时
-
改进情况:这周又做了实验,感觉自己对IDEA的理解比以前深入了,比如一些小插件像junit这些可以辅助我们实现更高水平的代码。
参考资料
无0.0