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)

-  ...

posted on 2017-04-23 21:42  愤怒的小鸟哭了  阅读(177)  评论(2编辑  收藏  举报