1、框架原理
sqlMapConfig.xml:(是mybatis的全局配置文件,名稱不固定的)配置了數據源、事務等mybatis運行環境
mapper.xml:配置sql語句
SqlSessionFactory:(會話工廠),根據配置文件建立工廠做用:建立SqlSession
SqlSession(會話),是一個接口,面向用戶(程序員)的接口做用:操做數據庫(發出sql增、刪、改、查)
Executor(執行器),是一個接口(基本執行器、緩存執行器)做用:SqlSession內部經過執行器操做數據庫
mapped statement(底層封裝對象)做用:對操做數據庫存儲封裝,包括 sql語句,輸入參數、輸出結果類型。java
2、傳統JDBC開發mysql
// 數據庫鏈接 Connection connection = null; // 預編譯的Statement,使用預編譯的Statement提升數據庫性能 PreparedStatement preparedStatement = null; // 結果 集 ResultSet resultSet = null; try { // 加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); // 經過驅動管理類獲取數據庫連接 connection = DriverManager .getConnection( "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root"); // 定義sql語句 ?表示佔位符 String sql = "select * from user where username = ?"; // 獲取預處理statement preparedStatement = connection.prepareStatement(sql); // 設置參數,第一個參數爲sql語句中參數的序號(從1開始),第二個參數爲設置的參數值 preparedStatement.setString(1, "xx"); // 向數據庫發出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) { e.printStackTrace(); } } }
這段代碼中充斥着硬編碼。
存在的問題大概分爲這麼幾種:
第一:對數據鏈接對象的使用,須要的時候就用,不須要的時候就關閉,這種頻繁的操做數據庫鏈接是一件很浪費資源的事情。
第二:sql語句編寫在java代碼中,當後期須要維護和修改sql那麼這個.java文件須要從新編譯。維護成本很高
第三:preparedStatement中設置參數,對佔位符號位置和設置參數值,硬編碼在java代碼中,不利於系統維護。
第四:遍歷結果集,我相信使用過結果集的人,會對這邊的狀況非常頭疼尤爲是查詢的字段不少的時候,一不留神字符串寫錯,那麼數據就取不到了。程序員