20155239 2016-2017-2 《Java程序设计》第9周学习总
教材学习内容
JDBC 简单功能
-
连接数据源,如数据库
-
传给数据库查询和更新指令
-
获取并处理数据库返回结果(对查询等的响应)
public void connectDBAndQuery(String username, String password) { Connection con = DriverManager.getConnection("jdbc:myDriver:myDatabase", username, password); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); } }
JDBC 组成
- JDBC API
- 提供关系型数据的编程访问接口
- 与分布式或异构环的数据源交互
- 是 Java平台的一部分(包括J2SE和J2EE)
- JDBC 4.0 API 分成 java.sql 和 javax.sql 两个包
2.DriverManager
JDBC 架构的基石:定义对象,将 Java 应用连接到 JDBC 驱动
标准扩展包 :javax.naming 和 javax.sql,允许使用注册到 JNDI 的 DataSource对象,来部署数据源的连接
评价:小而简
推荐:虽可使用 Connection,但推荐使用 DataSource
3、JDBC 测试组件
判断 JDBC 驱动是否运行程序
虽不全面,但体现 JDBC API 很多重要特性
4、JDBC-ODBC 桥
通过 ODBC 驱动,来提供 JDBC 访问
但要求每个机器都有 ODBC 驱动
因此,适用于企业网络(如果客户端安装不是问题),或三层架构的应用服务器代码
JDBC 架构
分为双层架构和三层架构
双层
-
作用:此架构中,Java Applet 或应用直接访问数据源
-
条件:要求 Driver 能与访问的数据库交互
-
机制:用户命令传给数据库或其他数据源,随之结果被返回
-
部署:数据源可以在另一台机器上,用户通过网络连接,称为
C/S配置(可以是内联网或互联网)
三层
- 侧架构特殊之处在于,引入中间层服务
- 流程:命令和结构都会经过该层
- 吸引:
可以增加企业数据的访问控制,以及多种类型的更新;
另外,也可简化应用的部署,并在多数情况下有性能优势
- 历史趋势:
以往,因性能问题,中间层都用 C 或 C++ 编写
随着优化编译器(将 Java 字节码 转为 高效的 特定机器码)和技术的发展,
如EJB,Java 开始用于中间层的开发
这也让 Java 的优势突显出现出来
使用 Java 作为服务器代码语言,JDBC随之被重视
反射与ClassLoader
java的反射机制原理
一 反射机制的概念:
指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制.
二 反射机制的应用:
生成动态代理,面向切片编程(在调用方法的前后各加栈帧).
三 反射机制的原理:
1 首先明确的概念: 一切皆对象----类也是对象.
2 然后知道类中的内容 :modifier constructor field method.
3 其次明白加载: 当Animal.class在硬盘中时,是一个文件,当载入到内存中,可以认为是一个对象,是java.lang.class的对象.
ClassLoader类位于java.lang包中,直接继承自Object,是一个抽象类。
ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。想想也是的,一次性加载那么多jar包那么多class,那内存不崩溃。本文的目的也是学习ClassLoader这种加载机制。
自定义泛型
泛型定义:
(1)仅定义在方法上的泛型语法
(2)用来限制泛型可用类型的extends与super关键字
(3)?类型通配字符的使用
自定义枚举
了解java.lang.Enum类
1、直接撰写程序继承Enum类会被编译程序拒绝。
2、Enum是个抽象类,无法直接实例化,它操作了Comparable接口。Action的构造函数被声明为private,因此只能在Action类中调用。
3、在JDK1.4之前撰写的API,仍是使用interface定义常数作为枚举值。
4、Enum的equals()方法与hashCode()方法基本上继承了Object的行为,但被标示为final。由于标示为final,所以定义枚举是,不能重新操作equals()与hashCode(),这是因为枚举成员,在JVM中智慧存在单一实例,Object定义的equals()与hashCode()作为对象相等性比较是适当的定义。
常用标准注释
1、@Override
就是标准注释,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为重新定义方法。
2、@Deprecated
如果某个方法原先存在与API中,后来不建议再使用,可以在该方法上注释。若有用户后续想调用或重新定义这个方法,编译程序会提出警告。对于支持泛型的API,建议明确指定泛型真正类型,如果没有指定,编译程序会提出警告。
3、@SuppressWarnings
指定抑制unchecked的警告产生:
@SuppressWarnings(value={"unchecked"})
4、@SafeVarargs
表明开发人员确定避免了heap pollution问题。heap pollution问题就是编译程序无法检查执行时期的类型错误,无法具体确认自变量类型。
5、@FunctionalInterface
让编译程序可协助检查interface是否可做为lambda的目标类型
教材学习中的问题和解决过程
问题1:JDBC到底是什么?
问题1解决方案:jdbc是 java数据库连接(java DataBase Connectivity)技术的简称,由一组使用java语言编写的类与接口组成,可以为多种关系数据库提供统一访问。
代码调试中的问题和解决过程
问题1:没有some类
补充some类
代码托管
上周考试错题总结
- Linux中使用rm删除文件时,如果想忽略提示,直接删除文件,可以使用()选项强制删除。
A .-r
B .-R
C .-c
D .-f
正确答案: D
- Linux中使用cp命令拷贝目录时要加上()选项。
A .-r
B .-directory
C .-all
D .-R
正确答案: A D
- 正则表达式”(‘|”)(.*?)\1”匹配 “'Hello',"World””的结果是()
A .不匹配
B .'Hello'
C ."World"
D .'Hello',"World"
正确答案: B C
- 正则表达式 zo* 匹配()
A .z
B .zo
C .zoo
D .zooooooooooooooooooooooooooo
- 以下代码,第五行和第七行设为()结果只会出现两条日志信息:
1 import java.util.logging.*;
2 public class LoggerDemo {
3 public static void main(String[] args) {
4 Logger logger = Logger.getLogger(LoggerDemo2.class.getName());
5 logger.setLevel(XXX);
6 for(Handler handler :
logger.getParent().getHandlers()) {
7 handler.setLevel(XXX);
8 }
9 logger.log(Level.WARNING, "WARNING 訊息");
10 logger.log(Level.INFO, "INFO 訊息");
11 logger.log(Level.CONFIG, "CONFIG 訊息");
12 logger.log(Level.FINE, "FINE 訊息");
13 }
14 }
A .Level.FINE
B .Level.CONFIG
C .Level.INFO
D .Level.WARNING
正确答案: C
- It is possible to send in data to a Java program via the command-line.(可以在命令行中给Java程序发送数据)
A .True
B .False
正确答案: A
Which of the following array declarations are invalid? (下面哪个数组声明是不合法的)
A .int[] grades = new int[5];
B .int grades[] = new int[5];
C .int[] grades = { 91, 83, 42,
100, 77 };
D .all of the above are valid(以上三个都合法)
E .none of the above are valid(以上三个都不合法)
正确答案: D
Which of the statements is true about the following code snippet?(对于下面的代码段,说法正确的是?)
int[] array = new int[25];
array[25] = 2;
A .The integer value 2 will be assigned to the last index in the array.(整数2会赋给数组中最后一个元素)
B .The integer value 25 will be assigned to the second index in the array.(整数25会赋给数组中的第2个索引)
C .The integer value 25 will be assigned to the third value in the array. (整数25会赋给数组中的第3个元素)
D .This code will result in a compile-time error.(代码会产生编译时错误)
E .This code will result in a run-time error. (代码会产生运行时错误)
正确答案: E
结对及互评
评分标准
正确使用Markdown语法(加1分):
不使用Markdown不加分
有语法错误的不加分(链接打不开,表格不对,列表不正确...)
排版混乱的不加分
模板中的要素齐全(加1分)
缺少“教材学习中的问题和解决过程”的不加分
缺少“代码调试中的问题和解决过程”的不加分
代码托管不能打开的不加分
缺少“结对及互评”的不能打开的不加分
缺少“上周考试错题总结”的不能加分
缺少“进度条”的不能加分
缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
本周有效代码超过300分行的(加2分)
一周提交次数少于20次的不加分
其他加分:
周五前发博客的加1分
感想,体会不假大空的加1分
排版精美的加一分
进度条中记录学习时间与改进情况的加1分
有动手写新代码的加1分
课后选择题有验证的加1分
代码Commit Message规范的加1分
错题学习深入的加1分
点评认真,能指出博客和代码中的问题的加1分
结对学习情况真实可信的加1分
扣分:
有抄袭的扣至0分
代码作弊的扣至0分
迟交作业的扣至0分
点评模板:
博客中值得学习的或问题:
xxx
xxx
...
代码中值得学习的或问题:
xxx
xxx
...
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
参考示例
结对及互评
点评过的同学博客和代码
本周结对学习情况
结对学习内容
-时间与日期
上周博客互评情况
其他(感悟、思考等,可选)
这周学习效率一般般,有待提高。不熟悉地方后面花些时间多看看。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
| 第九周 | 300/2080 | 2/9 | 30/90 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)