MyBatis的使用(XML映射文件)
MyBatis基于注解開發(fā)簡單便捷,但是弊端是失去SQL語句的靈活性,不能根據(jù)實際情況產(chǎn)生不同的SQL語句
MyBatis除了支持注解開發(fā)以外,還支持一種開發(fā)方式:XML映射文件,將SQL語句寫到XML映射文件中,基于更多種的選擇可以讓SQL變得更加靈活
1.開發(fā)方式
1.和基于注解開發(fā)方式一樣,有映射類/編寫配置文件/編寫Mapper持久層接口
2.將方法執(zhí)行時候要運行的SQL語句放到XML文件中進行編寫,提高靈活性
2.三重綁定
-
接口與XML文件的綁定關(guān)系,在XML映射文件的namespace中聲明綁定的接口的全類名
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.EmpMapper"> </mapper>
必須還要在配置文件中聲明xml文件位置,MyBatis才可以掃描到這些文件,掃描到與接口建立綁定關(guān)系
mybatis.mapper-locations=classpath:mappers/*.xml
-
接口中的方法與XML文件中標(biāo)簽的綁定關(guān)系
如果接口中有一個方法,XML文件中就必須有對應(yīng)的標(biāo)簽保存該方法對應(yīng)的SQL語句
根據(jù)方法功能的不同,提供四種標(biāo)簽:< select >、< update >、< delete >、< insert >
public void deleteEmp(@Param("id") Integer id);
標(biāo)簽必須給出id屬性,屬性就是對應(yīng)的方法名稱
<delete id="deleteEmp"> DELETE FROM emp WHERE id = #{id} </delete>
-
查詢語句的返回值類型與XML文件中標(biāo)簽屬性的綁定關(guān)系
如果執(zhí)行的是DQL語句,< select >標(biāo)簽中除了要生命id為方法名之外,還需要聲明一個屬性resultType值為封裝結(jié)果的全類名
public Emp selectEmpById(@Param("id") Integer id);
<select id="selectEmpById" resultType="com.itheima.entity.Emp"> SELECT * FROM emp WHERE id = #{id} </select>
3.動態(tài)SQL概述
可以隨著條件的改變隨之發(fā)生改變的SQL語句就是動態(tài)SQL,在MyBatis中只有XML映射文件的方式支持動態(tài)SQL
-
動態(tài)SQL使用-IF
< if >標(biāo)簽的核心功能對條件進行判斷,當(dāng)條件為true,則標(biāo)簽中的內(nèi)容參與SQL拼接,否則不參與
if標(biāo)簽中有一個核心屬性test,基于test傳遞條件可以進行判斷
(1)在test條件中可以直接獲取本次參數(shù)的內(nèi)容并且不需要加#{}
(2)test條件中可以基于=、!=、>、>=、<、<=對數(shù)據(jù)進行判斷,并且可以基于and或者or進行多條件連接
<if test="empQuery.name != null and empQuery.name != ''"> name LIKE CONCAT('%', #{empQuery.name}, '%') </if>
**如果有多個test條件,那么除了第一個之外后續(xù)的條件需要加 前AND **
<if test="empQuery.name != null and empQuery.name != ''"> name LIKE CONCAT('%', #{empQuery.name}, '%') </if> <if test="empQuery.gender != null"> AND gender = #{empQuery.gender} </if>
-
動態(tài)SQL使用-WHERE
如果if經(jīng)過了判斷第一個條件前包含AND,基于where標(biāo)簽進行包裹可以自動將前AND去掉
如果沒有任何一個if滿足,基于where標(biāo)簽進行包裹可以不在SQL中拼接WHERE
SELECT * FROM emp <where> <if test="empQuery.name != null and empQuery.name != ''"> name LIKE CONCAT('%', #{empQuery.name}, '%') </if> <if test="empQuery.gender != null"> AND gender = #{empQuery.gender} <!-- 注意:多個條件判斷除了第一個之外剩余條件需要前AND --> </if> <if test="empQuery.begin != null"> AND entrydate >= #{empQuery.begin} </if> <if test="empQuery.end != null"> AND entrydate <= #{empQuery.end} <!-- <在XML中有特殊含義 需要被轉(zhuǎn)義字符代替 --> </if> </where>
-
動態(tài)SQL使用-SET
如果if經(jīng)過了判斷第一個更新字段包含前,,基于set標(biāo)簽進行包裹可以自動將前逗號去掉
UPDATE emp <set> <if test="emp.username != null and emp.username != ''"> username = #{emp.username} </if> <if test="emp.password != null and emp.password != ''"> , password = #{emp.password} </if> <if test="emp.name != null and emp.name != ''"> , name = #{emp.name} </if> <if test="emp.gender != null"> , gender = #{emp.gender} </if> </set> WHERE id = #{emp.id}
-
動態(tài)SQL使用-FOREACH
foreach標(biāo)簽可以用于遍歷接口中的集合/數(shù)組參數(shù),在SQL語句中進行動態(tài)的拼接
//基于集合刪除員工信息 public void batchDelete(@Param("deleteIds") List<Integer> deleteIds);
<delete id="batchDelete"> DELETE FROM emp WHERE id IN <foreach collection="deleteIds" item="deleteId" separator="," open="(" close=")"> #{deleteId} </foreach> </delete>
-
動態(tài)SQL使用-SQL
SQL片段標(biāo)簽可以將XML文件重復(fù)的內(nèi)容抽取出來,并且可以在多處復(fù)用文章來源:http://www.zghlxwxcb.cn/news/detail-716349.html
當(dāng)要使用指定SQL片段的內(nèi)容進行拼接時,使用include標(biāo)簽文章來源地址http://www.zghlxwxcb.cn/news/detail-716349.html
<!-- SQL片段可以抽取XML文件中重復(fù)的內(nèi)容 --> <sql id="BASE_COLUMN"> id, username, password, name, gender, image, job, entrydate, dept_id </sql> <select id="selectEmpById" resultType="com.itheima.entity.Emp"> SELECT <include refid="BASE_COLUMN"> </include> FROM emp WHERE id = #{id} </select> <select id="selectEmpListByCondition" resultType="com.itheima.entity.Emp"> SELECT <include refid="BASE_COLUMN"> </include> FROM emp </select>
到了這里,關(guān)于MyBatis的使用(XML映射文件)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!