11月12日-14日,北京的陽光依舊燦爛,只是每天刺骨的北風都在提醒我們冬天的威嚴。想起某學霸的文章,北京每年的11月1日—14日,是一年最冷的時段,之所以說是學霸,是因為他做了一個很高冷的比方,說這段日子像是電子深勢阱,具體啥意思咱不懂,不過一看圖就明白了很形象。14日將是最后的嚴寒,15日北方所有地區都將開始供暖。
CE項目V3.0升級計劃
剛開始列了一個簡單的計劃,由于對于數據庫學習的難度有些吃不準,所以計劃的時間是3~5天完成,不過學習起來,發現數據庫相較圖形界面編程還是要簡單一些的,當然也可能是我目前還用不上大型數據庫和高級功能,所以最后3天的時間就完成了計劃,不過最后犯了個懶,把總結復盤放到第四天來做了。
知識點學習
這部分采用的教程是《MySQL入門很簡單》。是的,又是一本入門書籍[\捂臉]。真的是從數據表的基本范式和數據表集的結構類型開始學起,了解了SQL其實是一種目前通用的數據庫編程語言(跟Java一樣是一種高級語言),五種常用的數據庫系統及適用選擇(如本例因為便宜好用選擇了MySQL),以及三種常見的數據庫訪問技術(如本例所選用的Java/JDBC),還有常用的三種存儲引擎及適用選擇(本例選用了InnoDB引擎)。詳細的知識點見圖:
再總結一下SQL語言常用的關鍵字:
此時,還需要在MySQL的官網下載一個免費的安裝程序,并且將數據庫安裝到本地電腦上(目前提供5.7版本的下載),在以上學習梳理過程中,不斷地練習加以熟悉。
JDBC編程
Java語言體系與SQL語言體系是兩個相對獨立的高級編程語言,中間需要一座橋梁連接起來,而JDBC技術就是Java語言提供的一座橋梁,或者更形象的說就是一個同聲傳譯。
其中MySQL面向Java/JDBC,C#/ADO.NET,PHP/mysqli等高級編程語言分別提供了一個帶驅動程序的庫文件,面向Java/JDBC的驅動庫叫做“mysql-connector-java-5.1.44-bin.jar”,因此,在Java項目中必須在構建路徑中添加該驅動庫,否則程序將無法編譯(每一個項目都必須單獨添加該驅動庫)。
完成驅動加載后,就可以使用JDBC的API調用該驅動,具體實現過程如下圖所示:
其中幾個關鍵步驟是:
一、使用java.lang.Class.forName("數據庫驅動")加載MySQL驅動;
二、使用java.mysql.DriverManager.getConnection(url,user,password)與數據庫建立連接,并返回Connection實例;
三、使用java.mysql.Connection.createStatement()或java.mysql.Connection.prepareStatement()創建SQL語句執行器,并返回Statement或PreparedStatement實例;
四、使用java.mysql.Statement.excutequery()執行SQL查詢語句,并返回ResultSet類型實例;
五、使用java.mysql.ResultSet.next()和java.mysql.ResultSet.getString()獲取查詢字段記錄值。
以上是從數據庫中讀取數據,向數據庫中寫入數據,或者修改數據庫,過程類似。
CE項目V3.0
此階段對CE項目的升級內容包括:
- 在MySQL數據庫系統中創建了CEproject數據庫;
- 在Java程序中定義了MyDatabaseClass數據庫類;
- 在MyDatabaseClass數據庫類的構造方法中實現了與CEproject建立連接;
- 在MyDatabaseClass數據庫類中用Customlist2Database()等6個方法實現了程序用戶集和活動集對數據庫的讀寫操作,其中對寫入方法進行了重載,分為覆蓋寫入和單個記錄寫入;
- 在MyDatabaseClass數據庫類中QueryEntertain()方法實現了用戶對活動的模糊查詢;
- 對CEproject的查詢結果頁面和數據讀寫操作頁面進行了設計和Swing編程實現,由用戶操作觸發對數據庫的操作;
- 對CEproject的數據存儲子系統中的數據進行了整體遷移,拋棄了前兩版的txt數據存儲系統,改為全部使用MySQL進行數據存儲。
此外,在編程技術方面,做了以下練習并提煉了一定的干貨:
- MAP-LIST嵌套集合實現批量數據處理。MAP集合和數據類對象分別記錄用戶數據,并分別創建MAP集合LIST與數據類對象LIST,并進行了比較,結果表明兩者均可從數據結構上模擬數據庫中用戶數據表,并使用循環對數據進行批量操作。注意點:須在循環體內創建MAP集合,否則前期加入LIST的MAP對象數據將被后期MAP對象數據覆蓋。
- Iterator迭代器。使用Iterator迭代器及Iterator.hasNext()方法對LIST集合和MAP集合進行操作。
- 模糊查詢的實現。剛開始只是簡單地將用戶在搜索欄輸入的查詢字符傳入數據庫進行字符串匹配,結果發現只有整個字符串完全匹配才能給出結果;改進的辦法是使用like關鍵字和%通配符,將用戶查詢字符串拆散,然后在每個字符之間插入%,再傳入數據庫,就可以實現模糊查詢。后續更進一步可以去實現用戶輸入字符串帶空格或+號等查詢字符,再用戶意圖轉化為數據庫能理解的語言。
- JDBC在SQL命令行中引入變量。對PrepaerdStatement預處理方法進行了多項練習,熟悉了通配符‘?’的使用,確定了通過SetObject()在其SQL表達式中引入變量的可行性,從而實現批量變化數據的處理。
- Java程序對MySQL數據庫操作效率。對Java中操作大批量數據在數據庫中的讀寫效率進行了一定的研究,比較了四種方法,對1000個三字段記錄的批量寫入操作:
- 單循環編譯處理Statement.execute()方法,運行時間5095ms
- 單循環Statement.addBatch()加循環結束Statement.executeBatch()方法,運行時間4945ms
- 同樣是單循環Statement.addBatch()加循環結束Statement.executeBatch()方法,在循環體外conn.createStatement()后,添加一句conn.setAutoCommit(false),運行時間為435ms
- 同樣是單循環PreparedStatement.addBatch()加循環結束PreparedStatement.executeBatch()方法,在循環體外conn.prepareStatement()后,添加一句conn.setAutoCommit(false),運行時間為342ms
可以看出,同樣進行批處理命令,加入conn.setAutoCommit(false)后,效率提升十余倍,發生了根本性的變化。加入的這句話的作用是設置不自動提交,這樣Java程序就可以在添加了所有批處理命令后,只與MySQL系統連接,并一次提交所有命令,因此,節省了大量用于兩個系統間“過橋”的時間。
結論一:JDBC的批處理語句默認沒添加一句就執行一句,需要手動設置為不自動提交。這樣在用批處理方法處理大量數據時,將極大提升效率。
結論二:使用預處理的方法PreparedStatement,不僅可以進行語句的動態調整,還可以提升程序效率,因此在JDBC技術中應當優先于Statement方法使用。
參考書目
《MySQL入門很簡單》
《Java從入門到精通》