MyBatis的註解使用、ORM層優化(懶加載和緩存)

Mybatis註解

  • 查找
      @Select( "SELECT * FROM tt_user WHERE username Like #{id};")
      User findUserByName(String name);

      <!--以map爲輸入參數查找-->
      @Select("select * from tt_user where username= #{name} and  password=#{pass}")
      User findUserByUsernameAndPassword(HashMap map);
  • 插入
      @Insert("insert into tt_user values (#{id},#{username},#{password},#{email},#{age})")
      int AddUser(User user) throws IOException;
  • 更改
      @Update("update tt_user set username = #{username} where id = #{id}")
      void updateUserById(User user);
  • 刪除
      @Delete("delete from tt_user where id =#{id}")
      void deleteUserById(String id);
  • 動態SQL語句
      @SelectProvider(type = UserDaoSqlProvider.class,method = "findUserByName")
      List<User> findUserByName(String username) throws IOException;
    public String findUserByName(String username){
        //return  "select * from tt_user where username like '" +username+"'";
        String sql = new SQL() {{
            SELECT("*");
            FROM("tt_user");
            if (username!=null&&!username.isEmpty()){
                WHERE("username like "+username );
            }
        }}.toString();
        System.out.println("sql="+sql);
        return sql;
}

Mybatis提供了一個匿名內部類
這裏寫圖片描述

另一種寫法:

    public String getxxx(){

       return new SQL().UPDATE("PERSON")
                 .SET("FULL_NAME = #{fullName}", "DATE_OF_BIRTH = #{dateOfBirth}")
                 .WHERE("ID = #{id}")
                 .toString();
    }
}

Mybatis對ORM層的優化

緩存

查了一次,結果保存在本地,下次查相同內容的時候就不用再去訪問數據庫了。

懶加載

Lazyloading:先加載主信息,在需要的時候再去加載關聯數據
Mybatis中ResultMap中的association和Collection標籤具有懶加載的功能

  • 默認情況沒有懶加載
  • 如何開啓懶加載呢?
    在主配置文件中的configuration標籤下配置
    <!--全局懶加載-->
    <settings>
        <!--開關-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
  • 局部懶加載配置
    在從配置文件中的association或者collection裏邊添加fetchType字段(fetch翻譯是拿、取)
    <resultMap id="studentAndCourses" type="com.bamzhy.bean.Student">
        <id column="id" property="id"></id>
        <collection property="courses"
                    javaType="list"
                    select="com.bamzhy.dao.UserDao.findcourseBySid"
                    column="id"
                    fetchType="eager">
            <id column="cid" property="cid"></id>
        </collection>
    </resultMap>
  • 全局懶加載和局部懶加載同時出現時,以局部懶加載優先;

MyBatis緩存機制

這裏寫圖片描述

一級緩存

  • 一級緩存指的就是sqlsession,在sqlsession中有一個數據區域,是map結構,這個區域就是一級緩存區域。
    查詢同一個對象(使用同一個session)時,第二次查詢並不會調用sql語句,而是從sqlsession中取數據。
  • 開啓一級緩存:默認開啓
  • 驗證一級緩存存在

這裏寫圖片描述

我查了兩次,但是隻執行了一次sql語句
這裏寫圖片描述

現在在第一次查詢結束後關閉sqlSession,再重新new一個session出來,
這裏寫圖片描述

執行查詢
這裏寫圖片描述

果然,sql語句被執行了兩次,可以證明一級緩存的確存在

二級緩存

二級緩存指的就是同一個namespace下的mapper,二級緩存中,也有一個map結構,這個區域就是二級緩存區域。

  • 開啓二級緩存
    主配置文件裏邊:
    這裏寫圖片描述
    從配置文件:
    這裏寫圖片描述

  • 注意點 cache對象需要實現序列化接口,否則會報Error serializing object

  • 測試二級緩存

這裏寫圖片描述

雖然我關閉了sqlsession,但仍然沒有執行兩次sql。

這裏寫圖片描述

說明二級緩存的確存在

  • 如果不關閉一級緩存,那麼二級緩存就不生效。

比如我創建了一個sqlsession,不關閉,再創建一個sqlsession,那麼二級緩存看見第一個sqlsession沒有關閉(一級緩存生效了),二級緩存他就不生效了。事實上這倆session不是同一個session,二級緩存也沒生效,這樣要執行兩次sql語句。

發佈了85 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章