Mybatis 學習---基礎知識

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查詢支持差,不能支持存儲過程


說明: 本文大部分內容都是跟隨者傳播智課的教學視頻學習而來,可以看做是翻譯文章,只是自己吸收之後又書寫一遍,加深自己的知識理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章