Mybatis 學習—基礎知識
1. 原生JDBC存在的一些問題
- jdbc 連接數據庫的一般步驟
1、 加載數據庫驅動
2、 創建並獲取數據庫鏈接
3、 創建jdbc statement對象
4、 設置sql語句
5、 設置sql語句中的參數(使用preparedStatement)
6、 通過statement執行sql並獲取結果
7、 對sql執行結果進行解析處理
8、 釋放資源(resultSet、preparedstatement、connection)
Connection connection = null;
// 預編譯的Statement, 使用preparedStatement能夠爲預先進行編譯計劃的執行,
// 提高數據庫性能,而且能夠防止sql注入
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", "011152");
//定義sql語句 ?表示佔位符
String sql = "select * from user where username = ?";
//獲取預處理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{
//釋放資源
}
- jdbc 連接數據庫的缺點及解決方案設想
1.數據庫連接使用時就連接,不使用時就釋放,浪費了大量的資源,影響數據庫性能
解讀方案:使用數據庫連接池
2.sql語句硬編碼到Java代碼中,一旦修改sql也需要修改Java代碼,不利於維護
解決方案: sql 配置到xml中
3、向preparedStatement中設置參數,對佔位符號位置和設置參數值,硬編碼在java代碼中,不利於系統維護。
設想:將sql語句及佔位符號和參數全部配置在xml中。
4.從resutSet中遍歷結果集數據時,存在硬編碼,將獲取表的字段進行硬編碼,,不利於系統維護。
設想:將查詢的結果集,自動映射成java對象。
2. Mybatis 框架
Mybatis 是一個持久層的ORM的輕量級的框架,原來是Apach的開源項目,後來託管到google code,現在在github上。
讓程序員將其主要精力放在sql上面,通過mybatis提供的映射方式,自由靈活生成sql語句
與hibernate不同,mybatis一般需要程序員自己寫sql,比較靈活易控,而hibernate則自動生成sql
mybatis可以將向 preparedStatement中的輸入參數自動進行輸入映射,將查詢結果集靈活映射成java對象。(輸出映射)
mybatis 與hibernate的對比
mybatis | hibernate | |
---|---|---|
特點 | 輕量級的ORM框架,需要程序員自己寫sql,sql修改、優化比較方便 | 標準的ORM框架,提供了HQL語言,不需要程序員自己寫SQL,全表映射 |
開發速度 | 簡單相對容易上手,但是根據你的項目的內容來說,如果需要的查詢語句比較複雜,則使用mybatis會會快些 | 相對掌握困難一些,如果項目是一些簡單的增刪查改,則項目開發會快一些 |
對象管理 | 需要維護SQL與對象,可移植性比較差 | hibernate對象管理會更好一些,因爲對象與底層數據庫的映射關係已經建好,不需要考慮SQL語句,只需要關注對象就好,可移植性比較好 |
緩存 | 二級緩存要比hibernate差,Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,然後再在具體的表-對象映射中配置,而mybatis則在表-對象映射中進行配置,針對不同的表可以實現不同的緩存配置,可以在命名空間中共享相同的緩存配置和實例,通過Cache-ref來實現 | hibernate 提供了二級緩存,一級緩存是Session緩存,二級緩存是SessionFactory級的緩存,分爲內置緩存(SessionFactory對象的一些集合屬性包含的數據,只讀)和外置緩存(存放的是數據庫中數據副本),它可以被所有session共享,Hibernate對查詢對象有着良好的管理機制,如果在適應二級緩存查詢時出現髒數據,程序會自動報錯 |
應用場景 | 適用與需求變化較多的項目,比如:互聯網項目 | 適用與需求變化不多的中小型項目,比如:後臺管理系統,erp、oa |
更多的一個對比可以查看博客 : https://www.cnblogs.com/inspurhaitian/p/4647485.html
Hibernate 消除了代碼的映射規則(即與數據庫中表的映射規則),它被分離到XML中去配置或者註解實現,而且數據庫的連接也被配置在XML中,通過Session進行操作,消除了JDBC的大量代碼,提高了可編程性和簡潔性,而且提供了級聯、緩存、映射、一對多等功能
mybatis 解決了hibernate的哪些痛點?
1. Hibernate屏蔽了SQl,是全表映射,帶來性能問題,因爲有時我們可能只關注表中的某些字段,例如更新修改時需要發送表中的所有字段
2. 雖然提供了HQL,但是封裝了SQL,SQL修改與優化困難
3. 無法根據不同的條件組裝不同SQL
4. 對於多表關聯與複雜SQL查詢支持差,不能支持存儲過程
說明: 本文大部分內容都是跟隨者傳播智課的教學視頻學習而來,可以看做是翻譯文章,只是自己吸收之後又書寫一遍,加深自己的知識理解。