20145232 韩文浩 《Java程序设计》第9周学习总结

时间:2023-03-09 13:01:19
20145232 韩文浩 《Java程序设计》第9周学习总结

教材学习内容总结

学习目标

  • 了解JDBC架构
  • 掌握JDBC架构
  • 掌握反射与ClassLoader
  • 了解自定义泛型和自定义枚举
  • 会使用标准注解

JDBC标准主要分为两个部分:JDBC应用程序开发者接口JDBC驱动程序开发者接口。应用程序需要联机数据库,其相关API主要在java.sql和javax.sql两个包中。

应用程序会使用JDBC联机数据库:
Connection conn = DriverManager.getConnection(……);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM T_USER");

JDBC驱动程序分为四种:

  1. JDBC-ODBC Bridge Driver
  2. Native API Driver
  3. JDBC-Net Driver
  4. Native Protocl Drivel:可跨平台,是最常见的驱动程序类型

基本数据库操作相关JDBC接口或类是为位于java.sql包中。要取得数据库联机,必须进行几个动作:

  • 注册Driver对象
  • 取得Connection操作对象
  • 关闭Connection操作对象

使用JDBC要求加载.class文档的4种方式:
(1)使用Class.forName()
(2)自行建立Driver接口操作类的实例
直接撰写程序代码:
java.sql.Driver driver = new com.mysql.jdbc.Driver()
(3)启动JVM时指定jdbc.drivers属性
执行Java指令:
> java -Djdbc.drivers=com.mysql.jdbc.Driver;ooo.XXXDriver YourProgram
(4)设定JAR中/services/java.sql.Driver文档

  • Statement是SQL描述的代表对象,可以使用executeUpdate()、executeQuery()等方法来执行SQL。

  • Statement的executeUpdate()方法用于SELECT等查询数据库的SQL,返回int结果,表示数据变动的笔数

  • Statement的executeQuery()方法返回java.sql.ResultSet对象,代表查询结果。

  • Statement的execute()方法用来执行SQL,返回true表示SQL执行将返回ResultSet作为查询结果。

  • 建立Statement或PreparedStatement实例时,可以指定结果集类型与并行方式。
    createStatement(int resultSetType,int resultSetConcurrency) prepareStatement(String sql,int resultSetType,int resultSetConcurrency)

  • 结果集类型resultSetType可以指定3种:
ResultSet.TYPE _ FORWARD _ ONLY(默认)
ResultSet.TYPE _ SCROLL _ INSENSITIVE
ResultSet.TYPE _ SCROLL _ SENSITIVE
  • 更新设定resultSetConcurrency可以有2种指定:
ResultSet.CONCURREADONLY(默认)
ResultSet.CONCUR_UPDATABLE
  • ResultSet进行数据修改,则有些条件限制:
必须选取单一表格
必须选取主键
必须选取所有NOT NULL的值
  • 交易的四个基本原则:
    原子性:若有一个步骤失败,必须撤回曾经执行过的动作,回到交易前的状态
    一致性:交易作用的数据集合在交易前后必须一致
    隔离行为:交易与交易之间,必须互不干扰
    持续性:即使系统挂了,交易的结果也不能遗失

  • 多个交易并行时,可能引发很多数据不一致的问题。

更新遗失:一个交易进行时,因为另一个交易的介入而遗失更新效力。
脏读:两个交易同时进行,一个更新数据但是未确认,另一个就读取,可能会读取到不正确的数据。
无法重复的读取:某个交易两次读取同一段数据的结果不一致
幻读:同一交易期间,读取到的交易笔数不一样

  • “诠读取数据的数据”
    可以通过Connection的getMetaDate()方法取得DatebaseMetaDate对象。

  • JDBC的数据列集合(电子表格、XML数据或其他具有列集合概念的数据源),可以使用RowSet对列集合进行增删查改。通过setCommand()设定查询指令,通过execute()执行查询指令以填充数据。

  • RowSet定义了五个标准列集合子接口:
    jdbcRowSet
    是联机式的RowSet,保持与数据库的联机,可视为取得、操作RowSet的行为封装。
    CacheRowSet
    是脱机式的RowSet,在查询并填充完数据后,会断开与数据源的联机
    FilteredRowSet
    可以对列集合进行过滤,实现类似SQL中WHERE等条件式的功能。
    JoinRowSet
    可以让你结合两个RowSet对象,可以通过setMatchColumn()指定要结合的行,然后使用addRowSet()来加入RowSet进行结合。
    WebRowSet
    是CachedRowSet的子接口,不仅具备脱机操作,还能进行XM读写。

  • 反射:.class文档反映了类基本信息,从Class等API取得类信息的方式称为反射。

  • 建立ClassLoader实例

  1. 使用URLClassLoader来产生新的类加载器,需要java.net.URL作为其参数来指定类加载的搜索路径。使用URLClassLoader的loadClass()方法加载指定类时,会先委托父加载器代为搜索。

  2. 由同一类加载器载入的.class文档,只会有一个Class实例。如果同一.class文档由两个不同的类加载器载入,则会有两份不同的Class实例。

  3. path可以输入不在System Loader以上层级类加载器搜索路径的其他路径。

  • 使用常用的标准注释
  1. @Override
    就是标准注释,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为重新定义方法。

  2. @Deprecated
    如果某个方法原先存在与API中,后来不建议再使用,可以在该方法上注释。若有用户后续想调用或重新定义这个方法,编译程序会提出警告。对于支持泛型的API,建议明确指定泛型真正类型,如果没有指定,编译程序会提出警告。

  3. @SuppressWarnings
    指定抑制unchecked的警告产生:
    @SuppressWarnings(value={"unchecked"})

  4. @SafeVarargs
    表明开发人员确定避免了heap pollution问题。heap pollution问题就是编译程序无法检查执行时期的类型错误,无法具体确认自变量类型。

  5. @FunctionalInterface
    让编译程序可协助检查interface是否可做为lambda的目标类型

本周代码托管截图

20145232 韩文浩 《Java程序设计》第9周学习总结
20145232 韩文浩 《Java程序设计》第9周学习总结
20145232 韩文浩 《Java程序设计》第9周学习总结

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 4000行 16篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 1/3 25/45
第三周 500/1000 1/4 40/85
第四周 800/1800 1/5 45/130
第五周 700/2500 1/6 43/173
第六周 700/3200 1/7 48/221
第七周 400/3600 1/8 39/260
第八周 400/4000 1/9 40/300
第九周 500/4500 1/10 45/345

参考资料