文章目錄
- 什麼是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是使用 全限名+方法名 的儲存和尋找政策,重載後方法不唯一,無法準确找到需要的方法,抛出異常
不同的映射檔案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必須為接口的全路徑名。