MyBatis原理

LingLee_荊棘鳥發表於2017-07-19

MyBatis 是一個基於Java的持久層框架。它提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。

MyBatis 是支援普通 SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始對映,將介面和 Java 的POJO(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。


原理:

MyBatis應用程式根據XML配置檔案建立SqlSessionFactory,SqlSessionFactory在根據配置,配置來源於兩個地方,一處是xml配置檔案,一處是Java程式碼的註解,獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession例項直接執行對映的sql語句,完成對資料的增刪改查和事務提交等,用完之後關閉SqlSession。



圖片來自他人


二、MyBatis例子:

@Mapper
public interface NewsDAO {
	String TABLE_NAME="news";
	String 	INSERT_FIELDS=" title, link, image,like_count, comment_count,created_date,user_id ";
	String SELECT_FIELDS=" id, "+INSERT_FIELDS;
	
	
	//Java註解的方式******************
	@Update({"update ", TABLE_NAME, " set like_count = #{likeCount} where id=#{id}"})
    int updateLikeCount(@Param("id") int id, @Param("likeCount") int likeCount);
	
	//xml
	//從首頁中選擇一批諮詢(分頁處理)不在通過註解方式寫而是通過xml來寫該方法,xml放下相同的包目錄下並且自定義名字一樣
	List<News> selectByUserIdAndOffset(@Param("userId")int userId,@Param("offset") int offset
			,@Param("limit")int limit);
	
}

  與介面同名的xml檔案要放在,相同的包的相同的目錄下。 xml裡可以做一些複雜的處理的,比如下面例子中的<if  test="userId !=0">...</if>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.linglee.dao.NewsDAO"> <!--指定介面-->
    <sql id="table">news</sql><!--表名 列名-->
    <sql id="selectFields">id,title, link, image, like_count, comment_count,created_date,user_id
    </sql>
    <select id="selectByUserIdAndOffset" resultType="com.linglee.model.News"> <!--id-->
        SELECT
        <include refid="selectFields"/>
        FROM
        <include refid="table"/>
        <if test="userId != 0">
            WHERE user_id = #{userId}
        </if>
        ORDER BY id DESC
        LIMIT #{offset},#{limit}
    </select>
</mapper>


二、MyBatis與Hibernate:

相同點:他們都是市面上流行的ORM框架。他們均是通過xml配置生成sessionFactory然後通過sessionFactory生成session執行sql和管理事務。他們都支援JDBC和事務管理。

區別主要在一下幾個方面體現:​

1.開發速度

MyBatis支援的學習相比Hibernate更簡單,支援原生sql,學習更簡單。Hibernate的學習難度更大。開發速度差距不大。MyBatis要維護dao層資料庫欄位和bean屬性對映,Hibernate要在bean中新增欄位對映。

2.執行效率

   MyBatis支援原生sql自定義查詢欄位更加靈活,基本屬於JDBC操作hibernate是對JDBC更復雜的封裝。每次查詢需要完整的對映,對待複雜的查詢通過HQL語句生成的sql語句效率不能保證。​所以MyBatis會比Hi稍快。

3.日誌管理

  MyBatis需要log4j列印日誌。Hibernate有自己帶的日誌系統,且更細緻。​

4.快取機制

   Hibernate具有一級快取和二級快取。一級快取為session快取​,當session失效快取也失效。二級快取是SessionFactory級別,由於SessionFactory在系統中是單例,所以二級快取會一直存在整個應用的生命週期中。

5.對映方式

​    MyBatis的物件關係對映配置靈活,Hibernate則需要配置完整的物件關係對映,物件關係維護的更好。業務表的關聯太多,建議使用MyBatis。

6.sql優化效能調優​

​    MyBatis原生sql效能優化,有時候相比Hibernate自動生成的sql好太多。

7.資料庫移植方面​

    MyBatis的資料移植方面,沒有Hibernate。Hibernate自動生成sql能適應更多的資料庫,並且能反向生成表。​

8.後期維護​

    MyBatis後期維護比Hibernate更方便


相關文章