zoukankan      html  css  js  c++  java
  • 20155217 2016-2017-2 《Java程序设计》第9周学习总结

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

    教材学习内容总结

    • JBDC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商对接口直接操作,开发人员无须接触底层数据可驱动程序的差异性。
    16.1JDBC入门
    • JDBC全名Java DataBase Connectivity,是java联机数据库的标准规范。它定义一组标准类与接口,应用程序需要联机数据库时调用这组标准API。
    16.1.1JDBC简介
    • JDBC标准主要分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口

    eg: 应用程序使用JDBC联机数据库。

    Connection conn = DriverManager.getConnection(...);
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuesry(...);
    
    其中标准类(DriverManager)与接口(Connection、Statement、ResultSet)等就是标准API。
    
    • “写一个Java程序,操作所有数据库”

    • 驱动程序的四种类型:

    JDBC-ODBC Bridge Driver
    Native API Driver 提供原生链接库
    JDBC-Net Driver 将方法调用转换为特定的网络协议调用
    Native Protocal Driver
    
    16.1.2连接数据库
    • 要连接数据库系统,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序JAR文档
    • 基本数据库操作相关的JDBC接口或类是位于java.sql包中。
    • 要取得数据库联机,必须有几个动作:
    注册Driver的操作对象
    取得Connection操作对象
    关闭connection操作对象
    
    1. 注册Driver的操作对象

      操作Driver接口的对象是JDBC进行数据库存取的起点。

    2. 取得Connection操作对象

    • Connection接口的操作对象是数据库联机代表对象,要取得Connection操作对象,可以通过DriverManager的getConnection():

    • Connection conn = DriverManager.getConnection(jdbcUrl, username, passwd);

    • 除了基本的用户名称、密码之外,还必须提供JDBC URL,其定义了连接数据库时的协议、自协议、数据源识别。

    • 主机名可以市本机或其他联机主机名、地址,MySQL端口默认为3306。

    1. 关闭connection操作对象
    • 取得Connection对象之后,可以使用isClosed()方法测试与数据库的链接是否关闭。

    • 在操作完数据库之后,若确定不再需要连接,则必须使用close()来关闭与数据库的连接,以释放连接时相关的必要资源,像是联机相关对象、授权资源等。

    16.1.3使用Statement、ResultSet
    • Connection是数据库链接的代表对象,接下来要执行QSL的话,必须取得java.sql.Statement操作对象,他是Sql描述的代表对象。

    • 使用Connection的createStatement()建立Statement对象。

    • Statement的execute()用来执行SQL,并可以测试SQL是执行查询或更新,返回true表示SQL执行将返回ResultSet作为查询结果。

    eg:留言板,先制作一个MessageDAO来存取数据库,再撰写一个MessageDAODemo类来使用。

    • 运行结果。

    16.1.4使用PreparedStment、CallableStatement
    • 可以使用Connection的prepareStatement()方法建立好预先编译的SQL语句,当中参数会变动的部分,先指定“?”这个占位字符。
      eg:
    PrepareStatement stmt = conn.prepareStatement("INSERT INTO t_message VALUES(?, ?, ?, ?)");
    
    • 等到需要真正指定参数执行时,再使用相对应的setInt()setString()等方法,指定“?”处真正应该有的参数。
      eg:
        stmt.setInt(1,2);
        stmt.setString(2,"momor");
        stmt.executeUpdate();
    
    • 在使用PreparedStatement或CallableStatement时,必须注意SQL类型与java数据类型的对应。
    16.2JDBC进阶
    16.2.1使用DataSource取得联机
    • MessageDAO的用户无法告知DriverManager有关JDBC URL、用户名称、密码等信息时,可以让MessageDAO依赖于javax.sql.DataSource接口,通过其定义的getConnection()方法取得Connection
    16.2.2使用ResultSet卷动、更新数据
    • ResultSet时,默认可以使用next()移动数据光标至下一笔数据,然后使用getxxx()方法来取得数据。

    • ResultSet可以使用previous()first()last()等方法前后移动数据光标,还可以调用updatexxx()updateRow()等方法进行数据修改。

    • 结果集类型3种设定:

    只能前进数据光标:ResultSet.TYPE_FORWARD_ONLY(默认)
    
    可以前后移动数据光标:ResultSet.TYPE_SCROLL_INSENSITIVE
    
    前后移动数据光标,反映数据库中的数据修改:ResultSet.TYPE_SCROLL_SENSITIVE
    
    • 更新设定的两种设定:
    进行数据读取:ResultSet.CONCUR_READ_ONLY(默认)
    
    进行数据读取、更新:ResultSet.CONCUR_UPDATABLE
    
    • 数据光标移动的API:
    绝对位置移动:absolute()、afterLast()、beforeFirst()、first()、last()。
    
    相对位置移动:relative()、previous()、next()。
    
    判断目前位置:isAfterLast()、isBeforeFirst()、isFirst()、isLast()。
    
    • 使用ResultSet进行数据修改的条件限制:
    必须选取单一表格;
    
    必须选取主键;
    
    必须选取所有的NOT FULL的值。
    
    • 数据更新:取得ResutlSet()之后要进行数据更新,必须要移动至要更新的列,调用updatexxx()方法,然后调用updateRow()方法

    • 取消更新:调用cancelRowUpdates(),必须在调用updateRow()前进行更新的取消。

    • 新增数据:取得ResutlSet()之后要进行数据的新增,要先调用moveToInsertRow(),之后调用updatexxx()设定要新增的数据各个字段,然后调用insertRow()新增数据。

    • 删除数据列:取得ResutlSet()之后想直接进行数据的删除,移动光标至想要删除的列,调用deleteRow()

    16.2.3批次更新
    • 每次执行excuteUpdate(),都会向数据库发送一次SQL。可以使用addBatch()方法来收集SQL,并使用executeBatch()方法将所收集的SQL传送出去。

    • 所有收集的SQL,最后会串为依据SQL,然后传送给数据库,节省了I/O、网络路由等动作所耗费的时间。
      SQL不能使SELECT,否则会抛出异常。

    • 使用executeBush()时,SQL的执行顺序就是addBash()时的顺序。

    16.2.4Blob与Clob
    • 要将文档写入数据库,可以在数据库表格字段上使用BLOB或CLOB数据类型。

    • BLOB用于存储大量的二进制数据,像是图档、影音档等。

    • CLOB用于存储大量的文字数据。

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

    • Blob拥有getBinaryStream()getBytes()等方法,可以取得代表字段来源的InputStream或字段的byte[]数据

    • Blob拥有getCharacterStream()getAsciiStream()等方法、可以取得Reader或InputStream等数据。可以查看API文件来获取更详细的信息。

    • 也可以把BLOB字段对应byte[]或输入/输出串流。

    16.2.5交易简介
    • 交易的四个基本要求(ACID):
    原子性、一致性、隔离行为、持续性。
    
    1. 更新遗失
    • 指某个交易对字段进行更新的消息,因另一个交易的介入而遗失更新效力。

    • 如果要避免此类问题,可以设定隔离层级为“可读取未确认”。

    • 可以通过ConnectionsetTransactionIsolation()设定为TRANSACTION_UNCOMMITTED来提示数据库确定此隔离行为。

    1. 脏读
    • 读取到不干净、不正确的数据。

    • 如果要避免此类问题,可以设定隔离层级为“可读取确认”,可以通过ConnectionsetTransactionIsolation()设定为TRANSACTION_COMMITTED来提示数据库确定此隔离行为。

    1. 无法重复的读取
    • 某个交易两次读取同一字段的数据并不一致。

    • 如果要避免此类问题,可以设定隔离层级为“可重复读取”,可以通过ConnectionsetTransactionIsolation()设定为TRANSACTION_REPEATABLE_READ来提示数据库确定此隔离行为。

    1. 幻读
    • 同一交易期间读取到的数据笔数不一致。

    • 如果要避免此类问题,可以设定隔离层级为“可循序”,可以通过ConnectionsetTransactionIsolation()设定为TRANSACTION_SERIALIZABLE来提示数据库确定此隔离行为。

    16.2.6metadata简介
    • Metadata即“诠读数据的数据”。

    • JDBC中可以通过ConnectiongetMetaD()方法取得DatabaseMetadata对象,通过这个对象提供的各种方法可以取得数据库整体信息,而ResultSet表示查询到的数据,而数据本身的字段、类型等信息,可以通过ResulSetgetMetaData对象,通过这个对象提供的相关方法就可以取得域名、字段类型等信息。

    16.2.7RowSet简介
    • 定义了javax.sql.RowSet接口用以代表数据的类集合。

    • 数据可以是电子表格数据、XML数据或任何具有列集合概念的数据源。可以使用RowSet对列集合进行增删查改。

    • JdcRowSet是联机式的RowSet,在操作期间会保持与数据库的联机,可视为取得、操作的行为封装。

    • CachedRowSet为脱机式的RowSet,在查询并填充完数据后就会断开与数据源的联机。

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

    • 问题1:

      对于教材509页的代码不是很理解,代码如下:

    • 问题1解决方案:

      Connection使用尝试自动关闭资源语法,所以执行完try区块后,Connection的close()就会被调用。

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

    • 问题1:

      p555 Student.java

    • 问题1解决方案:

      这段代码中莫名其妙的略了一部分……缺少了后面函数中调用的size(),所以就没办法运行, 就只能自己构造了一个size()

    代码托管

    上周考试错题总结

    • Java NIO中与InputStream/OutputStream相对应的接口是(),用来连接数据节点。
      A .Channel
      B .Buffer
      C .Path
      D .FileStore

      解析:A.Channel

    • 正则表达式 zo* 匹配()

      A .z

      B .zo

      C .zoo

      D .zooooooooooooooooooooooooooo

      解析:ABCD

    • 正则表达式“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

    结对及互评

    评分标准

    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

    • 参考示例

    点评过的同学博客和代码

    • 本周结对学习情况
      • 20155236

      • 结对照片

      • 结对学习内容

        1. 注册Driver的操作对象
          操作Driver接口的对象是JDBC进行数据库存取的起点。

        2. 取得Connection操作对象

        • Connection接口的操作对象是数据库联机代表对象,要取得Connection操作对象,可以通过DriverManager的getConnection():

        • Connection conn = DriverManager.getConnection(jdbcUrl, username, passwd);

        • 除了基本的用户名称、密码之外,还必须提供JDBC URL,其定义了连接数据库时的协议、自协议、数据源识别。

        • 主机名可以市本机或其他联机主机名、地址,MySQL端口默认为3306。

        1. 关闭connection操作对象
        • 取得Connection对象之后,可以使用isClosed()方法测试与数据库的链接是否关闭。

        • 在操作完数据库之后,若确定不再需要连接,则必须使用close()来关闭与数据库的连接,以释放连接时相关的必要资源,像是联机相关对象、授权资源等。

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

      • 20155208

      • 20155203

      • 20155311

      • 20145202

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

    这周的学习目标是学完十六、十七、十八三章,主要是第十六章,需要我们了解JDBC架构、使用JDBC API、了解交易与隔离层级等等。通过前面几周的学习,java的核心知识与难点之前都已经学完了,后面的章节大概都主要是需要了解的知识。在不断的学习中,我也在不断的寻找适合自己的学习方法。平时自己要主动敲代码,主动发现问题,提高学习效率。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 5/5 1/4 20/20
    第二周 140/145 1/5 18/38
    第三周 330/451 1/6 16/54
    第四周 578/1038 1/7 18/72
    第五周 774/1472 1/8 18/90
    第六周 1592/3064 1/9 18/108
    第七周 1034/4098 2/11 22/130
    第八周 613/4711 1/12 20/150
    第九周 2924/5574 2/14 16/166

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

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

    • 计划学习时间:22小时

    • 实际学习时间:16小时

    • 改进情况:这周没有什么改进。

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

    参考资料

  • 相关阅读:
    Knockout应用开发指南 第八章:简单应用举例(2)
    微软ASP.NET站点部署指南(7):生产环境部署
    Knockout应用开发指南 第七章:Mapping插件
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(6)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(5)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(3)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(8)
    Microsoft Visual Studio .NET 2003 引导程序插件下载地址(非官方)
    Vs2010在没有安装SQL Server 2005/2008 Express时如何连接MDF数据文件?
  • 原文地址:https://www.cnblogs.com/yangdi0420/p/6747179.html
Copyright © 2011-2022 走看看