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()注册输出参数
  • 使用PreparedStatementCallableStatement时,注意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次……

结对及互评

评分标准

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

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)
    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

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

  5. 本周有效代码超过300分行的(加2分)
    • 一周提交次数少于20次的不加分
  6. 其他加分:
    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:
    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

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

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

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

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

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 2/2 20/20
第二周 186/186 2/4 18/38
第三周 689/875 3/7 22/60
第四周 242/1117 2/9 30/90
第五周 698/1815 2/9 30/120
第六周 1269/3084 2/9 30/120
第七周 342/3426 2/9 30/120
第八周 398/3824 2/9 30/120
第九周 1198/5022 2/9 30/120

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:24小时

  • 实际学习时间:24

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

20155207 2016-2017-2 《Java程序设计》第九周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第九周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2.书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什 ...

  2. 20145220java程序设计第九周学习总结

    20145220java程序设计第九周学习总结 教材学习内容总结 JBDC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商对接口直接操作,开发人员无须接触底层数据可驱动程序的差异 ...

  3. 201771010134杨其菊《面向对象程序设计java》第九周学习总结

                                                                      第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...

  4. 201521044152<java程序设计>第一周学习总结

    本周学习总结 java开发时间虽然很短,但是发展迅速,已成为现在非常流行的一门语言,很开心能有幸学习java.第一周学习了java的平台,运行环境jdk以及jrt等等新名词,还了解了eclipse的基 ...

  5. 20145304 刘钦令 Java程序设计第二周学习总结

    20145304 <Java程序设计>第2周学习总结 教材学习内容总结 java可区分基本类型和类类型(即参考类型)两大类型系统. 基本类型主要可区分为整数.字节.浮点数.字符与布尔. 整 ...

  6. 20145304 刘钦令 Java程序设计第一周学习总结

    20145304<Java程序设计>第1周学习总结 教材学习内容总结 1995年5月23日,是公认的Java的诞生日,Java正式由Oak改名为Java. Java的三大平台是:Java ...

  7. 201621123007 Java程序设计第一周 学习总结

    第一周-Java基本概念 201621123007 <Java程序设计> 第一周学习总结 1. 本周学习总结 java是面向对象的一类语言,三大特征:封装性,继承性,多态性. jdk jr ...

  8. 马凯军201771010116《面向对象与程序设计Java》第九周学习总结

    一.理论知识部分 异常.日志.断言和调试 1.异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. 2.Java的异常处理机制可以控制程序从错误产生的位置转移到能够进行错误处理的位置. 3 ...

  9. 201521123063 JAVA程序设计 第二周学习总结

    1.本周学习重点(2.27-3.5) java中的数组 以二维数组为例,数组名为scores,则 (1)先声明数组 int[][] scores;或int scores[][];或int[] scor ...

  10. 《Java》第九周学习总结

    下载mysql 选择mysql的管理软件 idea可以直接连接 然后用库运行程序,但是没有截图,,因为想在navicat上试试,可惜速度太慢了 打开idea又很慢,所以明天再更新

随机推荐

  1. WINdows常用监控相关

    参考网址: http://www.jb51.net/article/49986.htm 一.图新Shell下: 1.    最直观的:(在运行里面输入CMD,以下命令都是在CMD下输入的:) 输入 s ...

  2. Nginx相关笔记

    相关参考: 编译安装测试nginx            https://www.cnblogs.com/jimisun/p/8057156.html

  3. https Configure a Spring Boot app for HTTPS on Amazon AWS.

    参考: https://geocolumbus.github.io/HTTPS-ELB-AWS-Spring-Boot/ 1.  在服务器端配置  证书 域名 映射 2. 导入依赖: <depe ...

  4. leetcode268

    public class Solution { public int MissingNumber(int[] nums) { var list = nums.OrderBy(x => x).To ...

  5. FMX ScrollBox 拖拽控制

    Firemonkey下的ScrollBox 拖拽控制,滚动控制,拖拽,滚动条 AniCalculations 仅允许纵向拖拽,拖拽 scrlbx.AniCalculations.TouchTracki ...

  6. PCI Simple Communications Controller

    PCI Simple Communications Controller Intel Management Engine Interface (MEI)

  7. vim跳转到指定行

    第一种方法 在编辑模式下(非输入模式)下输入ngg 或者 nGn为指定的行数(如25)25gg或者25G 跳转到第25行. 25gg 第二种方法 在命令模式下输入行号n : n 查看当然光标所在的行和 ...

  8. js中常用的内部函数的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. maven配置国内镜像库

    https://www.cnblogs.com/xiongxx/p/6057558.html

  10. centos7部署cacti

    一.centos部署cacti 1. 关闭selinux. 2.fabric一键部署lamp 3. 设置mysql密码123456 1 mysql_secure_installation 4. 安装s ...