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的包中,要去的数据库联机,必须有三个动作
- 注册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();
- 取得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明确处理,在异常发生时尝试关闭相关资源。
- 关闭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)
- ...