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 组成
  1. 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小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted on 2017-04-22 16:26  吕宇轩  阅读(171)  评论(2编辑  收藏  举报