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

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

      

    ##JDBC入门

       在正式介绍JDBC前,已知JDBC是用来执行SQL的解决方案,开发人员使用JDBC的标准接口,开发人员不需接触底层数据库驱动程序的差异性。

    本章,我们需要了解JDBC与API使用和概念,我们先要认识应用程序如何与数据库进行沟通,数据库本身是一种独立运行的应用程旭,程序员撰写的应用程序是利用通信协议对数据库进行指令交换,以进行数据的增加删除以及查找。

    通常应用程序会利用一组专门与数据库进行通信协议的链接库,以简化与数据库沟通时的程序撰写,问题来了,我们应当知道其重点为,应用程序如何调用这组链接库?不同的数据库通常会有不同的通信协议,,用来联机不同数据库的链接库,在API上会有所不同,应用程序可以直接使用链接库例如:

    XYSqlConnection coon = new XYSqlConnection(“localhoost”,”root”,”1234”);

    Coon.selectDB(“gossip”);

    XYSqlQuery query = coon.query(“SELECT * FROM T_USER”);

    不妨假设这段程序代码中的API是某Xy数据库厂商的链接库所提供的,应用程序中要使用到的数据库联机时,都会调用这些API,若哪天应用程序打算改用Ab厂商数据库及其提供的数据库联机API,就要得到相关的程序代码。

         如果另外考虑:若Xy数据库厂商链接库底层实际使用了与操作系统相依的功能,若只打算换个操作系统,就要首先考虑是否有提供该平台的数据库链接库。

    并非没有更换数据库的需求,应用程序跨平台也是经常的需求,JDBC基本上就是来解决这些问题的,JDBC是JAVA数据库的标准规范,具体而言,定义一组标准类与接口,应用程序需要连机数据库时调用这些标准API,而标准API的接口会由数据厂商操作,通常称为JDBC驱动程序。

    已知数据库和JDBC驱动程序之间建立了通信协议,JDBC驱动程序置于最底层,JDBC标准API置于其上,JDBC标准主要分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口,如果应用程序需要联机数据库,就是调用JDBC应用程序开发者接口,相关API主要在java.sq1和javax.sq1两个包中,JDBC驱动程序开发者接口是数据库厂商操作驱动程序时的规范。

        

    如果将来要换为Oracle数据库,只要置换Oracle驱动程序,具体来说就是在CLASSPATH改设为Oracle驱动程序的JAR文档,然而应用程序本省不用修改。

       

    置换驱动程序不用修改应用程序

    操作JDBC应用程序时,依操作方式可驱动程序分为四种类型

    (1)        Type1:JDBC-ODBC Bridge Driver

    ODBC是由Microsoft主导的数据库连接标准,基本上JDBC是参考ODBC制订而来。故ODBC在Microsoft系统上最为成熟。

       Type1的驱动程序会将JDBC调用转换为对ODBC驱动程序的调用,由ODBC驱动程序操作数据库如下图

      

    由于利用现成的ODBC架构,只需要将JDBC调用转换为ODBC调用,所以要操作这种驱动程序非常简单。在Oracle/SunJDK中就附带有驱动程序,包名称以sun.jdbc.odbc开头。

    但是JDBC和ODBC并非一对一的对应,所以部分调用无法直接转换,由于多层转换的调用,访问速度也受限。ODBC本身需在平台上先设定好。

    (2)        Type2:Native API Driver

    这个类型的驱动程序会以原生的方式,调用数据库提供的原生链接库,JDBC的方法调用都会转换为原生链接库中的相关API调用,由于使用了原生链接库,所以驱动程序本身与平台相依,没有达到JDBC驱动程序的目标之一:跨平台不过由于直接调用数据库原生API,因此在速度上,有机会成为4种类型中最快的驱动程序。

    Type2驱动程序有机会成为速度最快的驱动程序,速度的优势是在于获得数据库相应数据后,创建相关JDBC API操作对象时,然而驱动程序本身无法跨平台,使用前必须先在个平台上进行驱动程序的安装设定。

    (3)        Type3:JDBC-Net Driver

        这类型的JDBC驱动程序会将JDBC方法调用转换为特定网络协议(Protocol)调用,目的是远程与数据库特定的中介服务器或组件进行协议操作,而中介服务器或组件在真正与数据库进行操作。

    (4)        Type4:Native Protocol Driver

         这种类型驱动程序操作通常由数据库厂商直接提供,驱动程序操作会将JDBC调用转换为数据库特定的网络协议,与数据库进行沟通操作

         由于这种类型驱动程序主要的作用,是将JDBC调用转换为特定网络协议,所以驱动程序可以使用纯粹的java技术实现,因此这种类型的驱动程序可以跨平台,再不需要如type3获得架构上的弹性时,通常会使用这种类型的驱动程序,算是最常见的驱动类型。

    为了连接好数据库系统,必须要有厂商操作的JDBC驱动程序,必须在CLASSPATH中设定驱动程序的JAR文档,但是如果使用IDEA,程序项目会有管理CLASSPATH的方式,通常是新增JAR之类的命令。例如NetBeans的话可以这样新增链接库:

    (1)       在项目上的Libraries节点上右击,从弹出的快捷键菜单上选择Add  JAR/Folder命令

    (2)        在出现的Add JAR/Folder对话框中,选择驱动程序JAR文档后单机打开按钮。

    (3)       确认项目的Libraries节点上出现JAR文档,这表示JAR文档已在项目中的CLASSPATH的管理中。

    基本数据库操作相关的JDBC接口或是类位于Java.sql的包中,要去的数据库联机,必须有三个动作

    1. 注册Driver操作对象

    操作Driver接口的对象是JDBC进行数据库存取的起点,基本上,必须调用regisiterDriver()进行注册

                只要想办法加载Driver接口操作类的.class文档,就会完成注册:

                 DriverManager.regisiterDriver(new com.mysql.jdbc.Driver());

                 不过实际上很少自行撰写程序代码这个动作,只要想办法加载Driver接口操作的类.class文档,就会完成注册。

                  如果查看MYSQL的Driver类操作原始码

    可以发现,在static区块中进行了注册Driver实例的动作,而static区块会载入.class文档中执行。使用JDBC是,要求加载.class文档的方式有4种

    (1)        使用Class.forName();

    (2)        自行建立Driver接口操作类的实例。

    (3)        启动JVM是指定的jdbc.drivers属性

    (4)        设定JAR中/services/java.sql.Driver文档

         第一种方式刚才已经说明。第二种方式就是直接撰写程序代码:

    Java.aql.Driver driver = new com.mysql.jdbc.Driver();

     

     

    1. 取得Connection操作对象

         要取得Connection操作对象,可以通过DriverManager的getConnection();

         Connection conn = Driver.getConnection(jdbcUrl,username,password);

         还要提供JDBC URL,其定义了链接数据库时的协议,子协议,数据源识别:

         协议:子协议:数据源识别

         除了协议在JDBC URL 中总是JDBC开始之外,JDBC URL格式各家数据库都不相同,必须查询数据库产品名称或使用手册。以下以MySQl为例,子协议是桥接的驱动程序,数据库产品名称或联机机制,例如使用MySQL的话,子协议名称是mysql’。数据库识别标出数据库地址、端口号、名称、用户、密码等信息。MySQL的撰写方式如下:

    Jdbc:mysql://主机名:端口/数据库名称?参数=值&参数=值。

    SQLException是在处理JDBC时常遇到的异常对象,为数据库操作过程发生错误时的代表对象。SQLException是受检异常,必须使用try。。。catch…finally明确处理,在异常发生时尝试关闭相关资源。

    1. 关闭Connection操作对象

         取得Connection对象之后,可以使用isClosed()方法测试数据库的链接是否关闭。在操作完数据库之后,若确定不需要链接,则必须使用close()来关闭与数据库的链接,已释放连接时相关的必要资源,像是联机相关对象、授权资源等。

    Driver的connect()方法在无法取得Connection时会返回null,所以简单来说,DriverManger就是逐一使用Driver实例尝试联机。如果联机成功就返回Connection对象,如果当中有异常发生,DriverManager会记录第一个异常,并继续尝试其他的Driver(),在所有Driver都试过了也无法取得联机,若原先尝试过程中有记录异常就抛出,没有的话,也是抛出异常告知没有适合的驱动程序。

    测试一下是否联机数据库并取得Connecton实例:

     

    使用statement、ResultSet

         Connection 是数据库连接的代表对象,接下来要执行SQL的话,必须取得java.sql.Statement操作对象,它是SQL描述的代表对象,可以使用Connection的createStatement()建立Statement对象:

    Statement stmt = conn.createStatement();

         取得Statement对象之后,可以使用excuteUpdate(),excuteQuery()等方法来执行SQL。ExcuteUpdate()主要用来执行CREATE TABLE,INSERT,DROP TABLE,ALTER TABLE等会改变数据库内容的SQL;可以在demo数据库中建立一个t_message表格:

         USE demo;

         CREATE TABLE t_message{

              Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

              Name CHAR(20) NOT null,

              Email CHAR;

    }CHARSET=UTF8;

    Statement的excuteQuery()用于SELECT等查询数据库的SQL,executeUplate()会返回int结果,表示数据变动的笔数,excuteQuery()会返回java.sql.ResultSet对象,代表查询结果,查询接过会是一笔一笔的数据,可以使用ResultSet的next()移动至下一笔数据,他会返回ture或false表示1是否有下一笔数据。Statement的execute()可以用来执行SQL,并可以测试SQL是执行查询或更新,返回ture表示SQL执行将返回ResultSet作为查询结果,此时可以使用getResultSet()取得ResultSet对象。如果excute返回false,表示SQL执行会返回更新笔数或没有结果,此时可以使用getUpdateCount()取得更新笔数,如果事先无法得知SQL执行是进行查询或更新,就可以使用excute()。

        

     

     

     

     

     

     

     

     

    尽量简单的总结一下本周学习内容

    尽量不要抄书,浪费时间

    看懂就过,看不懂,学习有心得的记一下

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

    - 问题1:XXXXXX

    - 问题1解决方案:XXXXXX

    - 问题2:XXXXXX

    - 问题2解决方案:XXXXXX

    - ...

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

    - 问题1:XXXXXX

    - 问题1解决方案:XXXXXX

    - 问题2:XXXXXX

    - 问题2解决方案:XXXXXX

    - ...

    ## [代码托管](码云学习项目链接)

    http://git.oschina.net/tianmaxingkomg/xinjianxianmu

    (statistics.sh脚本的运行结果截图)

    ## 上周考试错题总结

    - 错题1及原因,理解情况

    - 错题2及原因,理解情况

    - ...

    ## 结对及互评

    ### 评分标准

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

        - 不使用Markdown不加分

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

        - 排版混乱的不加分

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

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

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

        - [代码托管](链接)不能打开的不加分

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

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

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

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

    - 上周博客互评情况

        - [学号1](博客链接)

        - [学号2](博客链接)

        - [学号3](博客链接)

        - [学号4](博客链接)

        - ...

       

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

    xxx

    xxx

    ## 学习进度条

    |            | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|

    | --------   | :----------------:|:----------------:|:---------------:  |:-----:|

    | 目标        | 5000行            |   30篇           | 400小时            |       |

    | 第一周      | 200/200           |   2/2            | 20/20             |       |

    | 第二周      | 300/500           |   2/4            | 18/38             |       |

    | 第三周      | 500/1000          |   3/7            | 22/60             |       |

    | 第四周      | 300/1300          |   2/9            | 30/90             |       |

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

    耗时估计的公式

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

    参考:[软件工程软件的估计为什么这么难](http://www.cnblogs.com/xinz/archive/2011/04/05/2005978.html),[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294.html)

    - 计划学习时间:15小时

    - 实际学习时间:12小时

    - 改进情况:

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

    软件工程师能力自我评价表](http://www.cnblogs.com/xinz/p/3852177.html))

    ## 参考资料

    -  [Java学习笔记(第8版)](http://book.douban.com/subject/26371167/)

    -  [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)

    -  ...

  • 相关阅读:
    关于数据库索引,必须掌握的知识点
    Java基础知识面试题(最详细版)
    基于WinForm制作的用户名密码存储器
    DataGridView点击列名自动排序
    WebRequest.Create(url)无效的URI:无效端口指定的URL时
    knockout 数据绑定,同一个页面table位置加载两个不同的表格数据
    pipeline管道初体验
    Socket,长连接,消息推送,消息提醒,未读消息提醒,消息通知,未读消息通知
    搭建SVN服务器
    C#解决jsonp跨域问题jsonp跨域配置
  • 原文地址:https://www.cnblogs.com/xieboke/p/6754212.html
Copyright © 2011-2022 走看看