当前位置: 首页 > news >正文

9月22日培训日记(上)

首先检查昨天的作业,了解学员对昨天讲解知识的掌握情况。
(1)根据马献忠完成的BasicDataSourceFactory.createDataSource(Properties properties) 方法中设置的properties对象,询问他是怎么知道该如何设置properties对象的,我给大家分析了properties对象中的关键字就是根据BasicDataSource的bean属性来的原因。
(2)检查魏奕东完成的作业情况,下面是他的程序代码
package cn.itcast;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.ibatis.common.jdbc.SimpleDataSource;

public class SimpleDataSourceDemo {

public static void main(String[] args) {

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

Properties props = new Properties();
InputStream ips = InputStream.class.getResourceAsStream("/" + "config.properties");
try {
props.load(ips);
} catch (Exception e) {
e.printStackTrace();
return;
}finally{
try{
ips.close();
ips = null;
}catch(Exception e){
e.printStackTrace();
}
}

try {

SimpleDataSource simpleDS = new SimpleDataSource(props);
conn = simpleDS.getConnection();
pstmt = conn.prepareStatement("select * from pet where species='dog'");
rs = pstmt.executeQuery();

if(!rs.next()){
System.out.println("No record!");
}
else{
rs.beforeFirst();//非滚动结果集而不抛异常,不知其故。
while (rs.next()) {
System.out.println("NAME:" + rs.getString("name") +
"\tOWNER:"+ rs.getString("owner") +
"\tBIRTH:" + rs.getString("birth"));
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(rs != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

}

总体上来说,魏奕东做得不错,接着魏奕东针对他上面的程序向我提了一个问题,与问题相关的代码如下:
if(!rs.next()){
System.out.println("No record!");
}
else{
rs.beforeFirst();//非滚动结果集而不抛异常,不知其故。
while (rs.next()) {
System.out.println("NAME:" + rs.getString("name") +
"\tOWNER:"+ rs.getString("owner") +
"\tBIRTH:" + rs.getString("birth"));
}
}

他从JDK文档中看到:对于非滚动结果集调用beforeFirst方法,应该抛出异常,可是他使用的就是默认的不可滚动的结果集,怎么对这个结果集调用beforeFirst方法不抛出异常。
我先没有直接回答他的这个问题,而是挑出了他程序中的一个大败笔。他上面的程序是先调用rs.next判断是否有记录,如果有记录,再打印出所有记录。在打印所有记录时,他也意识到了游标已移动到第一行,所以,再使用rs.beforeFirst()方法将游标移回到第一行之前,再按照通常的方式对整个结果集进行遍历处理。我笑话他说:“他在走路时,先迈出一步试了试路是否可走,如果可以走,他又退回到起点,然后再向前走;他为何不迈出一步后,发现路可走时,接着迈出的第一步继续往前走呢?”,同学们都哈哈大笑,点头称是,但代码怎么写?我针对魏奕东的代码,给出了如下建议:
do
{
...
}while(rs.next());

再回过头来说为什么不可滚动的结果集调用beforeFirst时,没有抛出异常。我分析两种可能的原因:a.可能是某种驱动程序的原因,换个数据库驱动程序试试;b.在很久以前,要产生可滚动结果集,是一种特殊功能,而对现在的驱动程序来说,这是一项基本功能,只要产生结果集,就是可滚动的,这就好比以前的彩电要带遥控功能需要特殊定制,而现在只要是台彩电,就具有遥控功能,遥控成了彩电的基本配置,要想弄台没有遥控功能的彩电,还弄不到了呢!JDBC规范为了向前兼容,要保留这个参数设置和文档说明,但各个驱动厂商会忽略这点现在看来毫无意义的要求和建议。

针对魏奕东的问题,我补充讲解了可滚动,可更改,保持光标的结果集,主要就是分析了Connection.createStatement(int resultSetType,int resultSetConcurrency,int resultSetHoldability)中的各个参数的作用和各个参数的各种设置值的意义。接着,我又要魏奕东将结果集类型强制设置成ResultSet.TYPE_FORWARD_ONLY,然后看实验结果,他报告在这种情况下,结果集还是可以滚动,看来现在真是难以弄出不可滚动的结果集了,这就像我们难以再弄台没有遥控功能的彩电的道理。然后,我讲解了如何使用可更改的结果集来更改、插入和删除底层数据库中的记录。
为了讲清楚resultSetHoldability这个参数,我又为大家补充了JDBC中的事务处理问题,给出了如下示意代码:
try
{
cn.setAutoCommit(false);
stmt.executeUpdate();
stmt.exectueUpdate();
rs = stmt.executeQuerey();
rs.next();
cn.commit();
rs.next(); //用于测试resultSetHoldability这个参数
}
catch(Exception e)
{
cn.roolback();
}

在上午下课时,临时为同学们布置了一道作业题:通过自己的实验来了解JDBC中的事务处理,了解“可滚动,可更改,保持光标的结果集”的应用。
后面的内容还很多,留在“9月22日培训日记(下)”中续写............

相关文章:

  • 人脸识别,并生成包含所有人脸的合适UIImage
  • 9月22日培训日记(下)
  • 我认为二氧化碳排放是好事
  • iOS7的UITableViewCell的clipsToBounds默认是YES
  • 发现Hibernate的bug与对Properties的深入认识
  • NSNumber、NSData、NSValue的使用场景
  • Blog小技巧之二-让朋友在Blog上也能QQ到自己
  • 高尔夫实际和弹玻璃珠是一回事
  • 兰德酷路泽原来就是陆地巡洋舰啊
  • 市场上咋没有好的关于嵌入式项目管理的书呢?
  • 比较日期精确到日
  • 一个感人的真事
  • 为什么《Visual Basic 2005程序开发与界面设计秘诀》和《Visual C# 2005程序开发与界面设计秘诀》值得买?...
  • 父亲的一个同学
  • appfuse配置文件解读
  • php的引用
  • Cookie 在前端中的实践
  • C学习-枚举(九)
  • Docker: 容器互访的三种方式
  • docker容器内的网络抓包
  • echarts花样作死的坑
  • exif信息对照
  • Java 内存分配及垃圾回收机制初探
  • java第三方包学习之lombok
  • OSS Web直传 (文件图片)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python3爬取英雄联盟英雄皮肤大图
  • spring security oauth2 password授权模式
  • VuePress 静态网站生成
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于Android乐音识别(2)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 王永庆:技术创新改变教育未来
  • 微服务核心架构梳理
  • 项目实战-Api的解决方案
  • 在Docker Swarm上部署Apache Storm:第1部分
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (7)STL算法之交换赋值
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (九)One-Wire总线-DS18B20
  • (三)uboot源码分析
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET CF命令行调试器MDbg入门(一)
  • .NET建议使用的大小写命名原则
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Builder用法
  • [] 与 [[]], -gt 与 > 的比较
  • [04] Android逐帧动画(一)
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)