您的位置:首页 > 编程语言 > Java开发

20155207 2016-2017-2 《Java程序设计》第九周学习总结

2017-04-23 19:00 239 查看

20155207 2016-2017-2 《Java程序设计》第九周学习总结

教材学习内容总结

第16章 整合数据库

16.1 JDBC入门

16.1.1 JDBC简介

数据库本身是个独立运行的应用程序

撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找

JDBC可以解决更换数据库、应用跨平台的需求

JDBC(Java DataBase Connectivity)是Java联机数据库的标准规范,定义一组标准类与接口,应用程序需要联机数据库时调用这组标准API,标准API中接口会由数据库厂商操作,称为JDBC驱动程序

JDBC标准分为两部分:JDBC应用程序开发者接口、JDBC驱动程序开发者接口(数据库厂商操作驱动程序时的规范)

调用JDBC应用程序开发者接口,相关API主要在java.sql与javax.sql两个包中

联机数据库,需要在classpath中设定JDBC驱动程序

JDBC目的:让Java程序设计人员在撰写数据库操作程序时可以有个统一的接口,无须依赖特定的数据库API,“写一个Java程序,操作所有数据库”

依操作方式将驱动程序分为四种类型:(1)Type1:JDBC-ODBC Bridge Driver:由Microsoft主导的数据库连接标准,参考ODBC制定而来(2)Type2:Native API Driver:会以原生方式,调用数据库提供的原生数据库,JDBC的方法调用会转换为原生链接库,4种类型中最快的驱动程序,使用前必须先在各平台进行驱动程序的安装设定(3)Type3:JDBC-Net Driver:将JDBC方法转换为特定的网络协议调用,目的是远程与数据库特定的中介服务器或组件,中介服务器或组件再与数据库进行操作,可以跨程序,更换数据库系统只需更换中介组件,弹性好,速度慢(4)Type4:Native Protocol Driver:驱动程序会将JDBC调用转换为与数据库特定的网络协议,跨程序,弹性没有Type3好,最常见的驱动器类型

16.1.2 连接数据库

连接数据库,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序JAR文档

要取得数据库联机,必须的几个动作

注册Driver操作对象

取得Connection操作对象

关闭Connection操作对象

1.注册Driver操作对象

管理Driver操作对象的类是
java.sql.DriverManager
,必须调用其静态方法
registerDriver()
进行注册

加载Driver接口的操作类.calss文档,就会完成注册,可以通过
java.lang.class
类的
forName()
动态加载驱动程序类

使用JDBC加载.class文件方法有四种:(1)使用
Class.forName()
(2)自行建立Driver操作接口类的实例(直接撰写代码
java.sql.Driver driver = new com.mysql.jdbc.Driver()
)(3)启动JVM时指定jdbc.drivers属性(执行java命令时
java -Djdbc.drivers=com.mysql.jdbc.Driver;XXXDriver YourProgram
)指定多个驱动程序类,用分号间隔(4)设定JAR中/service/java.sql.Driver文档

2.取得Connection操作对象

Connection接口的操作对象是数据库联机代表对象,取得Connection对象,通过DriverManager的
getConnection()
,例
Connectin conn = DriverManager.getConnection(jdbcUrl,username,password);
(JDBC URL定义了连接数据库时的协议:子协议:数据源识别)

“协议”在JDBC URL中总是jdbc开始,“子协议”是桥接的驱动程序、数据库产品名称或联机机制,“数据源识别”标出数据库的地址、端口号、名称、用户、密码等信息

3.关闭Connection操作对象

取得Connection对象后,使用
isClosed()
方法测试与数据库的连接是否关闭,不再需要连接必须使用
close()
来关闭与数据库的连接,以释放连接时相关的必要资源,可以使用尝试自动关闭资源语法

16.1.3 使用Statement、ResultSet

执行SQL,必须取得
java.sql.Statement
,使用Connection的
createStatement()
建立Statement对象

使用Connnection的
createStatement()
建立Statement对象

取得Statement对象后,使用
executeUpdate()
(在表中插入一笔数据,返回int结果,表示数据变动的笔数)、
executeQuery()
(用于SELECT等查询数据库的SQL,返回java.sql.ResultSet对象,代表查询结果,会是一笔一笔的数据)

使用resultSet的
next()
移动至下一笔数据,返回true或false表示是否有下一笔数据,接着可以使用
getXXX()
取得数据

Statement的
execute()
可以用来执行SQL,并可测试SQL是执行查询或更新,返回true表示SQL执行将返回
ReaultSet
作为查询结果,可以使用
getResultSet()
取得ResultSet结果,返回false,表示SQL执行会返回更新笔数或没有结果,可以用
getUpdateCount()
取得更新笔数

Statement或ResultSet不使用时,使用
close()
关掉,Statement关闭时,所关联的ResultSet也会自动关闭

16.1.4 使用PreparedStatement、Callabletatement

Statement在执行
executeQuery()
executeUpdate()
时,如果有些部分是动态的数据,必须用+连字符串接字符串以组成完整的SQL语句

如果有些操作只是SQL语句当中某些参数不同,其余SQL子句皆相同,使用
java.sql.PrepareStatement
,使用Connection的
preparedStatement()
方法建立好预先编译好的SQL语句,用“?”代替参数中会变动的部分,需要真正指定参数执行时,再使用
setInt()
setString()
等方法指定“?”处应有的参数

执行
executeQuery()
executeUpdate()
方法后,可以调用
clearParameters()
清除设置的参数,之后就能再次使用这个PreparedStatement实例

撰写数据库的预存程序,并想使用JDBC来调用,可以使用java.sql.CallableStatement

java.sql.CallableStatement的API使用与PreparedStatement差别不大,除了必须调用
prepareCall()
建立CallableStatement异常之外,一样是使用
setXXX()
设定参数,查询操作使用
executeQuery()
,更新操作使用
executeUpdate()
,使用
registerOutParameter()
注册输出参数

使用
PreparedStatement
CallableStatement
时,注意SQL类型与Java数据类型的对应

日期在JDBC中,并不是使用java.util.Date,这个对象可代表的日期格式是“年、月、日、时、分、秒、毫秒”,JDBC表示日期,用
java.sql.Date
,日期格式是“年、月、日”,表示时间使用
java.sql.Time
,时间格式为“时、分、秒”,
java.sql.Timestamp
格式“时、分、秒、微秒”

对于TimeStamp实例,可以使用
toInstant()
方法将之转为Instant实例,Instant实例可以通过TimeStampe的
from()
静态方法将之转为TimeStampe实例

16.2 JDBC进阶

16.2.1 使用DataSource取得联机

MessageDAO依赖于javax.sql.DataSource接口,可以通过其自定义的
getConnection()
方法取得Connection

16.2.2 使用ResultSet卷动、更新

ResultSet时可默认使用
next()
移动数据光标至下一笔数据,而后使用
getXXX()
方法来取得数据

使用Connection的
createStatement()
prepareStatement()
方法建立Statement或PreparedStatement实例时,可以指定结果集类型与并行方式

结果集类型可以指定3种设定

ResultSet.TYPE_FORWARD_ONLY(默认)

ResultSet.TYPE_SCROLL_INSENSITIVE

ResultSet.TYPE_SCROLL_SENSITIVE

更新设定有两种指定

ResultSet.CONCUR_READ_ONLY(默认)

ResultSet.CONCUR_UPDATABLE

使用
absolute()
afterlast()
beforeFirst()
first()
last()
进行绝对位置移动,使用
relative()
previous()
next()
进行相对位置移动,成功返回true,使用
isAfterLast()
isBeforeFirst()
isFirst()
isLast()
判断目前位置

使用ResultSet进行数据修改有条件限制

必须选取单一表格

必须选取主键

必须选取NOT NULL的值

16.2.3 批次更新

使用
addBatch()
方法来收集SQL,并使用
executeBatch()
方法将所收集的SQL传送出去

SQL的执行顺序就是
addBath()
时的顺序

16.2.4 Blob与Clob

文档写入数据库,可以在数据库表格字段上使用BLOB(Binary Large Object),用于存储大量的二进制数据或CLOB数据类型(Character Large Object),用于储存大量的文字数据

JDBC中提供了java.sql.Blob与java.sql.Clob两个类分别代表BLOB与CLOB数据

通过PreparedStatement的
setBlob()
来设定Blob对象,读取数据时,可以通过ResultSet的
getBlob()
取得Blob对象

16.2.5 交易简介

交易的4个基本要求是原子性、一致性、隔离行为与持续性(ACID)

JDBC可以操作可以操作Connection的
setAutoCommit()
方法,给它false自变量,提示数据库开始交易

下达一连串的SQL语句后,自行调用Connection的
commit()
,提示数据库确认操作,中间发生错误,调用
rollback()
,提示数据库撤销所有的执行

隔离行为的支持上,JDBC可以通过Connection的
getTransactionIsolation()
取得数据库目前的隔离行为设定,通过
setTransactionIsolation()
可提示数据库设定指定的隔离行为,可设定常数是定义在Connection上

对交易不设定隔离行为
TRANSACTION_NONE


更新遗失,设定隔离层为“可读取未确认”
TRANSACTION_UNCOMMITTED


脏读,设定隔离层为“可读取确认”
TRANSACTION_COMMITTED


无法重复的读取,设定隔离层为“可重复读取”
TRANSACTION_REPEATABLE_READ


幻读,设定隔离层为“可循序”
TRANSACTION_SERIALIZABLE


16.2.6 metadata简介

诠释数据的数据

JDBC,通过Connection的
getMetaData()
方法取得DatabasemetaData对象,通过该对象提供的方法取得数据库整体信息,Result表示查询到的数据

16.2.7 RowSet简介

JDBC定义了javax.sql.RowSet接口,用以代表数据的列集合

RowSet定义了列列集合基本行为,其下有JdbcRowSet(联机式的)、CachedRowSet(脱机式的)、FilteredRowSet、JoinRowSet与WebRowSet五个标准列操作子接口,定义在javax.sql.rowset

教材学习中的问题和解决过程

问题:区分不了幻读与无法重复的读取,隔离层级“可重复读取”、“可循序”

解决过程:结合教材的图解,“可重复读取”针对两次交易读取数据不一致,同一交易读取数据必须相同的情况,“可循序”针对同一交易期间读取到的数据不一致,在数据不一致时,交易可以照顺序逐一进行

代码调试中的问题和解决过程

本周代码调试没有错误

代码托管



上周考试错题总结

『问题一』NIO2中,可以使用(D)中的方法取出文件系统根目录信息。

A .Path

B .DirectoryStream

C .FileStore

D .FileSystem

『考点』:FileSystem的getRootDirectorie方法可以取出文件系统根目录信息。对NIO各个方法还不够熟悉。

正则表达式”(‘|”)(.*?)\1”匹配 “'Hello',"World””的结果是()

A .不匹配

B .'Hello'

C ."World"

D .'Hello',"World"

解析:反向引用 \1 代表第一个()中的匹配内容。错题原因:漏选

正则表达式 r.t 能够匹配字符串()

A .rat

B .rt

C .rut

D .root

正确答案: A C

r.t 表示 r开着,中间为任意字符接着为t的三字母字符串

abc? 匹配( )

A .

ab

B .

abc

C .

abcc

D .

abccc

答案:AB

解析: ? 重复0或1次……

结对及互评

评分标准

正确使用Markdown语法(加1分):

不使用Markdown不加分

有语法错误的不加分(链接打不开,表格不对,列表不正确...)

排版混乱的不加分

模板中的要素齐全(加1分)

缺少“教材学习中的问题和解决过程”的不加分

缺少“代码调试中的问题和解决过程”的不加分

代码托管不能打开的不加分

缺少“结对及互评”的不能打开的不加分

缺少“上周考试错题总结”的不能加分

缺少“进度条”的不能加分

缺少“参考资料”的不能加分

教材学习中的问题和解决过程, 一个问题加1分

代码调试中的问题和解决过程, 一个问题加1分

本周有效代码超过300分行的(加2分)

一周提交次数少于20次的不加分

其他加分:

周五前发博客的加1分

感想,体会不假大空的加1分

排版精美的加一分

进度条中记录学习时间与改进情况的加1分

有动手写新代码的加1分

课后选择题有验证的加1分

代码Commit Message规范的加1分

错题学习深入的加1分

点评认真,能指出博客和代码中的问题的加1分

结对学习情况真实可信的加1分

扣分:

有抄袭的扣至0分

代码作弊的扣至0分

迟交作业的扣至0分

点评模板:

博客中值得学习的或问题:

xxx

xxx

...

代码中值得学习的或问题:

xxx

xxx

...

基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

参考示例

点评过的同学博客和代码

本周结对学习情况

20155223

结对照片



结对学习内容

第十六章

上周博客互评情况(只要链接,具体点评放相应博客下)

20155217

20155311

20145202

20155203

其他(感悟、思考等,可选)

本周学习了数据库及其在Java中对应的操作,开始不是很明白,百度关于SQL的一些知识,就懂了许多

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周0/02/220/20
第二周186/1862/418/38
第三周689/8753/722/60
第四周242/11172/930/90
第五周698/18152/930/120
第六周1269/30842/930/120
第七周342/34262/930/120
第八周398/38242/930/120
第九周1198/50222/930/120
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

计划学习时间:24小时

实际学习时间:24

(有空多看看现代软件工程 课件

软件工程师能力自我评价表)

参考资料

Java学习笔记(第8版)

《Java学习笔记(第8版)》学习指导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: