文章目錄
什麼是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必須爲接口的全路徑名。