学号 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)

-  ...

20155335 俞昆 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. 经典优秀屏幕截图录像工具FastStone Capture推荐

    FastStone Capture (FSCapture) 是经典好用的屏幕截图软件,还具有图像编辑和屏幕录制两大功能. FastStone Capture 主要功能 包括:1.截图功能(可以捕捉:活 ...

  2. Debian/Kali 安装原生Firefox

    出于种种原因,有很多人信仰原装纯净:就像debian下的iceweasel,有人总想换成firefox.好吧,正好最近29版发布了,我们无视掉这两者哥两好的关系,尝试在Debian/Kali 下安装F ...

  3. 指数循环节&欧拉降幂

    证明:https://www.cnblogs.com/maijing/p/5046628.html 注意使用条件(B的范围) 例题: FZU1759 HDU2837 ZOJ1674 HDU4335

  4. 【模板】Splay总结

    rentenglong大佬写的splay的梳理使我受益颇丰,特此做出一定的总结. 数据结构 定义了一个struct结构体. 为了在splay操作下储存根节点,我们宏定义了root 为 tree[0]. ...

  5. 解决hash冲突方法

    转自:https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公 ...

  6. mysql忘记密码重置密码方法

    https://blog.csdn.net/weidong_y/article/details/80493743

  7. 用条件变量实现事件等待器的正确与错误做法--转自陈硕的Blog

    用条件变量实现事件等待器的正确与错误做法 TL;DR 如果你能一眼看出 https://gist.github.com/chenshuo/6430925 中的那 8 个 Waiter classes ...

  8. 第23章 I2C—读写EEPR

    本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>及<I2C ...

  9. Notes 20180307 : 运算符

    我们前边曾说过程序=数据结构+算法,数据结构讲的是数据在内存中的存储形式,这个我会作为2018的一个重点来研究,不过在这里不做赘述,前半年的工作以JavaSE为主.算法则是我们在数据结构的基础上对其的 ...

  10. python 创建虚拟环境

    创建一个文件夹:mkdir tf_env 进入到文件夹内:cd tf_env 创建虚拟环境:python3 -m venv tensorflow-dev 激活虚拟环境:source tensorflo ...