天天看點

MyBatis必知必會什麼是MyBatisMyBatis與Hibernate的差別MyBatis的核心元件有哪些?MyBatis的動态SQL有了解嗎?MyBatis的Mapper中的常見标簽有哪些?DAO接口中的方法可以重載嗎(重點)不同的映射檔案xml中的id值可以重複嗎?MyBatis中 # 和 $ 的差別是什麼?(高頻考點)Mybatis的緩存機制MyBatis的接口綁定以及實作方式

文章目錄

  • 什麼是MyBatis
  • MyBatis與Hibernate的差別
  • MyBatis的核心元件有哪些?
  • MyBatis的動态SQL有了解嗎?
  • MyBatis的Mapper中的常見标簽有哪些?
  • DAO接口中的方法可以重載嗎(重點)
  • 不同的映射檔案xml中的id值可以重複嗎?
  • MyBatis中 # 和 $ 的差別是什麼?(高頻考點)
  • Mybatis的緩存機制
  • MyBatis的接口綁定以及實作方式

什麼是MyBatis

Mybatis是一個半ORM(對象關系映射)集合,内部封裝了JDBC,在開發時隻需要關注SQL語句本身而不需要去關注驅動加載,建立連接配接,statement使用等,可通過原生SQL和動态SQL操作資料庫

MyBatis與Hibernate的差別

  • MyBatis的優點是代碼開發量少,容易上手,SQL與代碼分離,友善修改;缺點是SQL需要自己寫
  • Hibernate的優點是完全面對對象,不需要手寫SQL;缺點是不能靈活使用原生SQL,SQL無法優化,學習成本較高

MyBatis的核心元件有哪些?

  • SqlSessionFactoryBuilder:建構SqlSessionFactory
  • SqlSessionFactory :建構SqlSession
  • SqlSession:相當于Connection,擷取Mapper
  • Mapper : 發送SQL,傳回結果

MyBatis的動态SQL有了解嗎?

  • if:單條件分支的判斷語句
<if test="name!=null" >
			and name=#{name}
		</if>
           
  • choose, when, otherwise:多條件的分支判斷語句
<choose>
			<when test="no!=null">
				and no=#{no}
			</when>
			<when test="name!=null">
				and name=#{name}
			</when>
			<otherwise>
				<if test="age!=null" >
					and age=#{age}
				</if>
			</otherwise>
		</choose>
           
  • where 标簽
<where>
			<if test="no!=null" >
					 no=#{no}
				</if>
		</where>
           
  • set 标簽
<set>
			<if test="name!=null">name=#{name}</if>
			<if test="age!=null">age=#{age}</if>
		</set>
           
  • trim 标簽,格式化标簽,可以替代set和where,可以設定前字尾
    • prefix表示調用SQL語句時在最前面添加的字首
    • prefixOverrides表示調用SQL語句時去掉的第一個指定内容
    • suffix表示調用SQL語句時在最後面添加的字尾
    • suffixOverride表示調用SQL語句時去掉的最後一個指定内容
<trim prefix="set" prefixOverrides="and | or">
			<if test="name!=null"> and name=#{name}</if>
			<if test="age!=null"> or age=#{age}</if>
		</trim>
           
<trim prefix="where" prefixOverrides="and | or">
		    <if test="userName != null and userName != ''">
		      and u.userName like concat('%', #{userName}, '%')
		    </if>
		    <if test="userRole != null">
		      and u.userRole = #{userRole}
		    </if>
		  </trim>
           
  • foreach:列舉條件,周遊集合,實作循環語句
<foreach item="item" index="index" collection="list"
	        open="(" separator="," close=")">
	        #{item}
	    </foreach>
           

MyBatis的Mapper中的常見标簽有哪些?

  • 操作的标簽:select、insert、update、delete本質上沒什麼不同,隻是為了友善閱讀
  • 常用的标簽:
    • resultMap 結果集與實體映射配置
    <resultMap id="getStudentRM" type="EStudnet">
    	  <id property="id" column="ID"/>
    	  <result property="studentName" column="Name"/>
    	  <result property="studentAge" column="Age"/>
    	</resultMap>
               
    • sql:抽取出的公用代碼塊

      如sql查詢時select後的條件,多表查詢時組合好的結果可能多個地方用到

    <sql id="query_user">
    		username,password
    	</sql>
               
    • include:使用抽取的公共sql
  • 動态sql标簽:trim、where、set、foreach、if、choose、when、otherwisr、bind

DAO接口中的方法可以重載嗎(重點)

重載

MyBatis必知必會什麼是MyBatisMyBatis與Hibernate的差別MyBatis的核心元件有哪些?MyBatis的動态SQL有了解嗎?MyBatis的Mapper中的常見标簽有哪些?DAO接口中的方法可以重載嗎(重點)不同的映射檔案xml中的id值可以重複嗎?MyBatis中 # 和 $ 的差別是什麼?(高頻考點)Mybatis的緩存機制MyBatis的接口綁定以及實作方式

映射

MyBatis必知必會什麼是MyBatisMyBatis與Hibernate的差別MyBatis的核心元件有哪些?MyBatis的動态SQL有了解嗎?MyBatis的Mapper中的常見标簽有哪些?DAO接口中的方法可以重載嗎(重點)不同的映射檔案xml中的id值可以重複嗎?MyBatis中 # 和 $ 的差別是什麼?(高頻考點)Mybatis的緩存機制MyBatis的接口綁定以及實作方式

運作抛出異常,不能準确定位方法。是以不能重載

因為Mybatis是使用 全限名+方法名 的儲存和尋找政策,重載後方法不唯一,無法準确找到需要的方法,抛出異常

不同的映射檔案xml中的id值可以重複嗎?

  • 如果設定了namespace,那麼每個xml都在不同namespace下,可以重複
  • 如果沒有設定則全局在同一個namespace下,不能重複

一般都是使用生成工具自動生成的代碼,會自動添加namespace的

MyBatis必知必會什麼是MyBatisMyBatis與Hibernate的差別MyBatis的核心元件有哪些?MyBatis的動态SQL有了解嗎?MyBatis的Mapper中的常見标簽有哪些?DAO接口中的方法可以重載嗎(重點)不同的映射檔案xml中的id值可以重複嗎?MyBatis中 # 和 $ 的差別是什麼?(高頻考點)Mybatis的緩存機制MyBatis的接口綁定以及實作方式

MyBatis中 # 和 $ 的差別是什麼?(高頻考點)

  • #{}

    使用時會解析為一個JDBC預編譯語句的參數标記符,一個

    #{}

    被翻譯成一個占位符

    (相當于使用prepareStatement運作預編譯sql)
  • ${}

    使用時直接替換值(相當于使用Statement拼接sql)
  • 能使用

    #{}

    的地方盡可能的使用

    #{}

    ,相當于預編譯,可重複使用,并且能避免SQL注入
  • ${}

    一般可用在表名,字段名替換,如order by ${列名}語句中,直接設定排序順序

Mybatis的緩存機制

  • 一級緩存

    基于HashMap的本地緩存,存在于同一個SqlSession對象,Session flush或者close後清空,預設為開啟一級緩存

  • 二級緩存

    存在于SqlSessionFactory生命周期,需要手動開啟。當查詢頻率高更新頻率低時使用,因為每次更新都會重新整理緩存

MyBatis的接口綁定以及實作方式

  • 接口能幫到是指:把定義的接口裡面的方法與SQL語句的綁定, 使得我們直接調用接口方法就可以執行sql
  • 實作方式有兩種
    • 通過注解綁定,就是在接口的方法上面加上 @Select、@Update等注解,裡面包含SQL語句來綁定
    • 通過xml裡面寫SQL來綁定, 在這種情況下,要指定xml映射檔案裡面的namespace必須為接口的全路徑名。