Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103546504
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546505
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546507
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546508
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546499
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546510
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546511
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546512
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546513
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546514
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546515
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546516
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546517
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546518
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546519
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546520
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546521
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546522
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546523
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546514
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546525
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546526
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546527
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546528
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546529
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546530
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546531
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546532
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546533
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546534
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546535
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546536
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546537
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546538
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546529
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546540
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546541
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546542
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546543
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546544
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546545
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546546
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546547
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546548
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546549
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546550
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546552
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546553
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546544
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546555
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546556
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 7 部分: Java 编程(4)-sdccf-ChinaUnix博客
  • 博客访问: 103546557
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:40:31

developerWorks



用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328586) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328584) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328583) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328582) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328577) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328576) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328575) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328573) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328572) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328571) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328570) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328569) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328567) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328566) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328563) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328561) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328560) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328557) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328554) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328553) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328549) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328548) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328545) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328542) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328541) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328540) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328539) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


用 JDBC 读取和更新数据

在本小节中,将学习如何使用 StatementPreparedStatement JDBC 对象,这些对象表示 JDBC 中的 SQL 语句。还将学习如何使用 JDBC ResultSet 对象,这个对象是由包含 SQL 查询的 StatementPreparedStatement 对象返回的。

Statement 对象是使用 Connection.createStatement() 方法创建的。例如:

Statement stmt;
...
stmt = con.createStatement();

为了执行 Statement 对象中的 INSERTUPDATEDELETE 语句,要将一个带有语句的字符串传递给 Statement.executeUpdate() 方法。例如:

stmt.executeUpdate("DELETE FROM EMPLOYEE WHERE EMPNO = '000099'");

为了使用 Statement 对象执行查询,要将带有 SELECT 语句的字符串传递给 Statement.executeQuery() 方法,并且检索 ResultSet 对象。例如:

ResultSet rs;
rs = stmt.executeQuery("SELECT EMPNO, LASTNAME FROM EMPLOYEE");

为了解析 ResultSet 对象,必须首先使用 ResultSet.next() 方法读取每一行。然后在每次读取之后,使用适合该数据类型的方法(例如 ResultSet.getInt())检索列值。

rs = stmt.executeQuery("SELECT LASTNAME, BIRTHDATE FROM EMPLOYEE");
while (rs.next()) {
  System.out.println(rs.getString(1) + ", " + rs.getDate(2));
}





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 Statement 对象
  • 执行 INSERTUPDATEDELETE 语句
  • 执行 SQL 查询
  • 解析 ResultSet 对象

这个应用程序向 Employee 表中插入一条雇员记录,然后对这个表运行一个查询,请求获得每一条记录的雇员编号和雇员姓氏。

//StmtDb.java
import java.sql.*;

class StmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    Statement stmt1, stmt2;
    ResultSet rs;
    String stmt1String =
       "INSERT INTO EMPLOYEE (EMPNO,FIRSTNME,MIDINIT,LASTNAME,EDLEVEL)" +
       " VALUES ('000099','MICHIEL','G','DEROOS',1)";
    String stmt2String = "SELECT EMPNO, LASTNAME FROM EMPLOYEE";

    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(true);

      stmt1 = con.createStatement();
      stmt2 = con.createStatement();

      stmt1.executeUpdate(stmt1String);
      rs = stmt2.executeQuery(stmt2String);

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "      " + rs.getString(2));
      }

      rs.close();
      stmt1.close();
      stmt2.close();
      con.close();

    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 StmtDb.java),要执行下列命令:

javac StmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java StmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
000010      HAAS
000020      THOMPSON
000030      KWAN
000050      GEYER
000060      STERN
000070      PULASKI
000090      HENDERSON
000100      SPENSER
000110      LUCCHESSI
000120      O'CONNELL
000130      QUINTANA
000140      NICHOLLS
000150      ADAMSON
000160      PIANKA
000170      YOSHIMURA
000180      SCOUTTEN
000190      WALKER
000200      BROWN
000210      JONES
000220      LUTZ
000230      JEFFERSON
000240      MARINO
000250      SMITH
000260      JOHNSON
000270      PEREZ
000280      SCHNEIDER
000290      PARKER
000300      SMITH
000310      SETRIGHT
000320      MEHTA
000330      LEE
000340      GOUNOT
200010      HEMMINGER
200120      ORLANDO
200140      NATZ
200170      YAMAMOTO
200220      JOHN
200240      MONTEVERDE
200280      SCHWARTZ
200310      SPRINGER
200330      WONG
200340      ALONZO
000099      DEROOS





回页首


PreparedStatement 对象是使用 Connection.prepareStatement() 方法创建的。例如:

PreparedStatement stmt;
...
stmt = con.prepareStatement();

通过使用 PreparedStatement 对象,可以动态地准备和执行 SQL 语句。通过重新绑定 SQL 语句中参数标记的值,可以用不同的值多次执行相同的语句。(参数标记是由 ? 表示的,它充当一个在运行时进行赋值的值的占位符)。例如:

pStmt = con.prepareStatement("UPDATE STAFF SET COMM=? WHERE ID=?");
pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

pStmt.setDouble(1,710.53);
pStmt.setInt(2,350);
pStmt.executeUpdate();

关于参数标记的更多信息,请阅读本系列中的第 8 篇文章(参见 参考资料 一节)。





回页首


下列应用程序演示在前一小节中讨论的所有概念:

  • 创建 PreparedStatement 对象。
  • 使用参数标记动态地指派 SQL 语句中的值。

这个应用程序解析一个由名称和工作头衔构成的数组。对于每个数组项,它向 staff 表中插入一条记录。

//pStmtDb.java
import java.sql.*;

class pStmtDb
{
  public static void main(String[] argv)
  {
    String url = "jdbc:db2:sample";
    Connection con;
    PreparedStatement pStmt;
    Statement sStmt;
    ResultSet rs;
    String stmtString = "INSERT INTO STAFF (ID,NAME,DEPT,JOB) VALUES (?,?,99,?)";
    String [][] staff = {{"Smyth","LW"},{"Hemsky","RW"},{"Horcoff","C"}};
    
    try
    {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
      con = DriverManager.getConnection(url);
      con.setAutoCommit(false);

      pStmt = con.prepareStatement(stmtString);

      for (int i=0; i<3; i++) {
        pStmt.setInt(1,401+i);
        pStmt.setString(2,staff[i][0]);
        pStmt.setString(3,staff[i][1]);
        pStmt.executeUpdate();
      }
      
      con.commit();

      sStmt = con.createStatement();
      rs = sStmt.executeQuery("SELECT ID, NAME FROM STAFF WHERE DEPT = 99");

      System.out.println("Employee #  Employee surname");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "         " + rs.getString(2));
      }

      rs.close();
      pStmt.close();
      sStmt.close();
      con.commit();
      con.close();
    }
    catch (ClassNotFoundException drvEx)
    {
      System.err.println("Could not load JDBC driver");
      System.out.println("Exception: " + drvEx);
      drvEx.printStackTrace();
    }
    catch(SQLException sqlEx)
    {
      while(sqlEx != null) {
        System.err.println("SQLException information");
        System.err.println("Error msg: " + sqlEx.getMessage());
        System.err.println("SQLSTATE: " + sqlEx.getSQLState());
        System.err.println("Error code: " + sqlEx.getErrorCode());
        sqlEx.printStackTrace();
        sqlEx=sqlEx.getNextException();
      }
    }
  }
}

为了编译以上文件(名为 pStmtDb.java),要执行下列命令:

javac pStmtDb.java

为了运行已编译好的应用程序,要执行下列命令:

java pStmtDb

这个应用程序的输出应该如下所示:

Employee #  Employee surname
401         Smyth
402         Hemsky
403         Horcoff





回页首


StatementPreparedStatement 示例代码中,使用了两种不同的方法来提交事务:自动提交(autocommit)和手工提交(manual commit)。

Statement 示例中所使用的方法是自动提交,即自动提交每个语句。自动提交是从 Connection 对象启用的,命令如下:

con.setAutoCommit(true);

与以前的版本不同,在启用自动提交的情况下,如果执行 Connection.Commit()Connection.Rollback(),IBM DB2 通用 JDBC 和 SQLJ 驱动程序的 DB2 9 版本就会抛出异常。

PreparedStatement 示例中所使用的方法是手工提交。在这种方法中,要么手工提交每条语句,要么回滚每条语句。如果应用程序最后未提交语句,这些语句将自动回滚。手工提交或回滚操作是由 Connection 对象来执行的,如下:

con.commit();
...
con.rollback();





回页首


为了从 Java 应用程序执行分布式事务,需要使用 Java Transaction API(JTA)。(分布式事务也称作两阶段提交事务,这些事务将更新多个数据库中的数据。)JTA 规范是 Java 2 Platform,Enterprise Edition(J2EE)标准的事务管理组件。

在 DB2 中,分布式事务是通过 DB2XADataSource 类管理的,该类实现 javax.sql 包中的 XADataSource 接口。

对于 DB2 9,在 IBM DB2 通用 JDBC 和 SQLJ 驱动程序和 DB2 JDBC Type 2 驱动程序中都提供了 JTA 支持。下列 Java 代码使用 IBM DB2 通用 JDBC 和 SQLJ 驱动程序创建 DB2XADataSource 类的一个实例:

DB2XADataSource db2ds = new com.ibm.db2.jcc.DB2XADataSource();
阅读(328536) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~