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
    	<include refid="query_user"/>
    
  • 動態sql標籤:trim、where、set、foreach、if、choose、when、otherwisr、bind

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

重載
在這裏插入圖片描述
映射
在這裏插入圖片描述
運行拋出異常,不能準確定位方法。所以不能重載

因爲Mybatis是使用 全限名+方法名 的保存和尋找策略,重載後方法不唯一,無法準確找到需要的方法,拋出異常

不同的映射文件xml中的id值可以重複嗎?

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

一般都是使用生成工具自動生成的代碼,會自動添加namespace的
在這裏插入圖片描述

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必須爲接口的全路徑名。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章