9月22日培训日记(上)
首先檢查昨天的作業,了解學員對昨天講解知識的掌握情況。
(1)根據馬獻忠完成的BasicDataSourceFactory.createDataSource(Properties properties) 方法中設置的properties對象,詢問他是怎么知道該如何設置properties對象的,我給大家分析了properties對象中的關鍵字就是根據BasicDataSource的bean屬性來的原因。
(2)檢查魏奕東完成的作業情況,下面是他的程序代碼
package cn.itcast;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import com.ibatis.common.jdbc.SimpleDataSource;
public class SimpleDataSourceDemo {
?public static void main(String[] args) {
??Connection conn = null;
??PreparedStatement pstmt = null;
??ResultSet rs = null;
??
??Properties props = new Properties();
??InputStream ips = InputStream.class.getResourceAsStream("/" + "config.properties");
??try {
???props.load(ips);
??} catch (Exception e) {
???e.printStackTrace();
???return;
??}finally{
???try{
????ips.close();
????ips = null;
???}catch(Exception e){
????e.printStackTrace();
???}
??}
??try {
???SimpleDataSource simpleDS = new SimpleDataSource(props);
???conn = simpleDS.getConnection();
???pstmt = conn.prepareStatement("select * from pet where species='dog'");
???rs = pstmt.executeQuery();
???
?????????? if(!rs.next()){
??????????? ?System.out.println("No record!");
?????????? }
??????????? else{
??????????? ?rs.beforeFirst();//非滾動結果集而不拋異常,不知其故。
????while (rs.next()) {
?????System.out.println("NAME:" + rs.getString("name") +
????????????????? "/tOWNER:"+ rs.getString("owner") +
????????????????? "/tBIRTH:" + rs.getString("birth"));
????}
??????????? }
??} catch (Exception e) {
???e.printStackTrace();
??}finally{
???if(rs != null){
???????????? try {
?????rs.close();
????} catch (SQLException e) {
?????e.printStackTrace();
????}
???????????? rs = null;
???}
???????? if(rs != null){
???????? ?try {
?????pstmt.close();
????} catch (SQLException e) {
?????e.printStackTrace();
????}
???????? }
???????? if(conn != null){
???????????? try {
?????conn.close();
????} catch (SQLException e) {
?????e.printStackTrace();
????}
???????? }
??}
?}
}
總體上來說,魏奕東做得不錯,接著魏奕東針對他上面的程序向我提了一個問題,與問題相關的代碼如下:
?????????? if(!rs.next()){
??????????? ?System.out.println("No record!");
?????????? }
??????????? else{
??????????? ?rs.beforeFirst();//非滾動結果集而不拋異常,不知其故。
??while (rs.next()) {
???System.out.println("NAME:" + rs.getString("name") +
?????"/tOWNER:"+ rs.getString("owner") +
?????"/tBIRTH:" + rs.getString("birth"));
??}
??????????? }
他從JDK文檔中看到:對于非滾動結果集調用beforeFirst方法,應該拋出異常,可是他使用的就是默認的不可滾動的結果集,怎么對這個結果集調用beforeFirst方法不拋出異常。
我先沒有直接回答他的這個問題,而是挑出了他程序中的一個大敗筆。他上面的程序是先調用rs.next判斷是否有記錄,如果有記錄,再打印出所有記錄。在打印所有記錄時,他也意識到了游標已移動到第一行,所以,再使用rs.beforeFirst()方法將游標移回到第一行之前,再按照通常的方式對整個結果集進行遍歷處理。我笑話他說:“他在走路時,先邁出一步試了試路是否可走,如果可以走,他又退回到起點,然后再向前走;他為何不邁出一步后,發現路可走時,接著邁出的第一步繼續往前走呢?”,同學們都哈哈大笑,點頭稱是,但代碼怎么寫?我針對魏奕東的代碼,給出了如下建議:
?do
?{
??...
?}while(rs.next());
再回過頭來說為什么不可滾動的結果集調用beforeFirst時,沒有拋出異常。我分析兩種可能的原因:a.可能是某種驅動程序的原因,換個數據庫驅動程序試試;b.在很久以前,要產生可滾動結果集,是一種特殊功能,而對現在的驅動程序來說,這是一項基本功能,只要產生結果集,就是可滾動的,這就好比以前的彩電要帶遙控功能需要特殊定制,而現在只要是臺彩電,就具有遙控功能,遙控成了彩電的基本配置,要想弄臺沒有遙控功能的彩電,還弄不到了呢!JDBC規范為了向前兼容,要保留這個參數設置和文檔說明,但各個驅動廠商會忽略這點現在看來毫無意義的要求和建議。
針對魏奕東的問題,我補充講解了可滾動,可更改,保持光標的結果集,主要就是分析了Connection.createStatement(int resultSetType,int resultSetConcurrency,int resultSetHoldability)中的各個參數的作用和各個參數的各種設置值的意義。接著,我又要魏奕東將結果集類型強制設置成ResultSet.TYPE_FORWARD_ONLY,然后看實驗結果,他報告在這種情況下,結果集還是可以滾動,看來現在真是難以弄出不可滾動的結果集了,這就像我們難以再弄臺沒有遙控功能的彩電的道理。然后,我講解了如何使用可更改的結果集來更改、插入和刪除底層數據庫中的記錄。
為了講清楚resultSetHoldability這個參數,我又為大家補充了JDBC中的事務處理問題,給出了如下示意代碼:
try
{
?cn.setAutoCommit(false);
?stmt.executeUpdate();
?stmt.exectueUpdate();
?rs = stmt.executeQuerey();
?rs.next();
?cn.commit();
?rs.next(); //用于測試resultSetHoldability這個參數
}
catch(Exception e)
{
?cn.roolback();
}
在上午下課時,臨時為同學們布置了一道作業題:通過自己的實驗來了解JDBC中的事務處理,了解“可滾動,可更改,保持光標的結果集”的應用。
后面的內容還很多,留在“9月22日培訓日記(下)”中續寫............
轉載于:https://www.cnblogs.com/dairongle97/archive/2006/09/23/2402203.html
總結
以上是生活随笔為你收集整理的9月22日培训日记(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码生成工具的分类及比较
- 下一篇: 认识httphandler