參考鏈接: Java在競爭性編程中的快速I/O
第1章 框架概述?
1.1 什么是框架?
1.1.1 什么是框架?
框架(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件實例間交互的方法;另一種定義認為,框架是可被應用開發者定制的應用骨架。前者是從應用方面而后者是從目的方面給出的定義。?
簡而言之,框架其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。?
1.1.2 框架要解決的問題?
框架要解決的最重要的一個問題是技術整合的問題,在 J2EE 的 框架中,有著各種各樣的技術,不同的軟件企業需要從 J2EE 中選擇不同的技術,這就使得軟件企業最終的應用依賴于這些技術,技術自身的復雜性和技術的風險性將會直接對應用造成沖擊。而應用是軟件企業的核心,是競爭力的關鍵所在,因此應該將應用自身的設計和具體的實現技術解耦。這樣,軟件企業的研發將集中在應用的設計上,而不是具體的技術實現,技術實現是應用的底層支撐,它不應該直接對應用產生影響。?
框架一般處在低層應用平臺(如 J2EE)和高層業務邏輯之間的中間層。?
1.1.3 軟件開發的分層重要性?
框架的重要性在于它實現了部分功能,并且能夠很好的將低層應用平臺和高層業務邏輯進行了緩和。為了實現軟件工程中的“高內聚、低耦合”。把問題劃分開來各個解決,易于控制,易于延展,易于分配資源。我們常見的 MVC 軟件設計思想就是很好的分層思想。? 通過分層更好的實現了各個部分的職責,在每一層將再細化出不同的框架,分別解決各層關注的問題。?
1.1.4 分層開發下的常見框架?
常見的 JavaEE 開發框架: 1、解決數據的持久化問題的框架? ?
1.1.5 MyBatis 框架概述?
mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身, 而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。?
mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 對象和statement 中sql 的動態參數進行映射生成最終執行的 sql 語句,最后由 mybatis 框架執行 sql 并將結果映射為 java 對象并返回。?
采用 ORM 思想解決了實體和數據庫映射的問題,對 jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與 jdbc api 打交道,就可以完成對數據庫的持久化操作。?
為了我們能夠更好掌握框架運行的內部過程,并且有更好的體驗,下面我們將從自定義 Mybatis 框架開始來學習框架。此時我們將會體驗框架從無到有的過程體驗,也能夠很好的綜合前面階段所學的基礎。?
1.2 JDBC 編程的分析?
1.2.1 jdbc 程序的回顧?
public static void main(String[] args) {
? ? ? ? Connection connection = null;
? ? ? ? PreparedStatement preparedStatement = null;
? ? ? ? ResultSet resultSet = null;
? ? ? ? try {
? ? ? ? ? ? //加載數據庫驅動
? ? ? ? ? ? Class.forName("com.mysql.jdbc.Driver");
? ? ? ? ? ? //通過驅動管理類獲取數據庫鏈接
? ? ? ? ? ? connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "ro ot", "root");
? ? ? ? ? ? //定義 sql 語句 ?表示占位符
? ? ? ? ? ? //獲取預處理 statement
? ? ? ? ? ? preparedStatement = connection.prepareStatement(sql);
? ? ? ? ? ? //設置參數,第一個參數為 sql 語句中參數的序號(從 1 開始),第二個參數為設置的
?
? ? ? ? ? ? preparedStatement.setString(1, "王五");
? ? ? ? ? ? //向數據庫發出 sql 執行查詢,查詢出結果集
? ? ? ? ? ? resultSet = preparedStatement.executeQuery();
? ? ? ? ? ? //遍歷查詢結果集
? ? ? ? ? ? while (resultSet.next()) {
? ? ? ? ? ? ? ? System.out.println(resultSet.getString("id") + "
? ? ? ? ? ? ? ? ? ? ? ? "+resultSet.getString("username"));
?
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? //釋放資源
? ? ? ? ? ? if (resultSet != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? resultSet.close();
? ? ? ? ? ? ? ? } catch (SQLException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if (preparedStatement != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? preparedStatement.close();
? ? ? ? ? ? ? ? } catch (SQLException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if (connection != null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? connection.close();
? ? ? ? ? ? ? ? } catch (SQLException e) {
? ? ? ? ? ? ? ? ? ? // TODO Auto-generated catch block e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
?
上邊使用 jdbc 的原始方法(未經封裝)實現了查詢數據庫表記錄的操作。?
1.2.2 jdbc 問題分析?
1、數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。 2、Sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變 java代碼。 3、使用 preparedStatement 向占有位符號傳參數存在硬編碼,因為 sql 語句的 where 條件不一定,可能多也可能少,修改 sql 還要修改代碼,系統不易維護。 4、對結果集解析存在硬編碼(查詢列名),sql 變化導致解析代碼變化,系統不易維護,如果能將數據庫記錄封裝成 pojo 對象解析比較方便。