MyBatis實現(xiàn)動態(tài)SQL的方法
1 動態(tài) SQL 介紹
動態(tài) SQL 是 MyBatis 強大特性之一,極大的簡化我們拼裝 SQL 的操作。MyBatis 的動態(tài) SQL 是基于 OGNL 的( Object Graph Navigation Language ,對象圖導航語言),它是一種強大的表達式語言,通過它可以非常方便的來操作對象屬性, 類似于 EL,SpEL 等的表達式。動態(tài) SQL 主要有以下幾類:
- if 標簽:用于條件判斷,根據(jù)條件是否滿足來決定是否包含某個元素。
- where 標簽:用于生成 WHERE 子句,并會自動去掉(忽略)第一個條件的 and 或 or 關鍵字,避免語法錯誤
- set 標簽:用于生成 SET 子句,進行更新操作,可以自動處理最后一個條件結尾的逗號
- trim 標簽:用于去除或添加前綴和后綴
- choose、when、otherwise 標簽:類似于 Java 中的 switch、case、default 語句,根據(jù)不同的條件選擇執(zhí)行不同的 SQL 片段
- foreach 標簽:用于遍歷集合,常用于 IN 語句中的參數(shù)列表生成
- bind 標簽:用于在 OGNL 表達式之外創(chuàng)建一個變量,并將其綁定到當前的上下文中,以便在后續(xù)的表達式中使用
2 if 標簽
if 標簽,根據(jù)條件是否滿足來決定是否包含某個元素,判斷條件寫在 if 標簽的 test 屬性中
<resultMap id="employeeMap" type="com.dao.Employee"> <id property="empId" column="employee_id"/> <result property="empName" column="employee_name"/> <result property="empAge" column="employee_age"/> <result property="empSex" column="employee_sex"/> <result property="empEmail" column="employee_email"/> <result property="empAddress" column="employee_address"/> </resultMap> <select id="getEmpIf" parameterType="com.dao.Employee" resultMap="employeeMap"> select * from employee where <if test="empName != null and empName != ''"> employee_name=#{empName} </if> </select>
上述代碼如果 if 標簽的條件不符合,則查詢語句為 select * from employee where,會報錯
3 where 標簽
where 標簽,用于生成 WHERE 子句,并會自動去掉(忽略)第一個條件的 and 或 or 關鍵字,避免語法錯誤。
<select id="getEmpWhereIf" parameterType="com.dao.Employee" resultMap="employeeMap"> select * from employee <where> <if test="empName != null and empName !=''"> and employee_name=#{empName} </if> </where> </select>
通過 where 標簽查詢,不會出現(xiàn) SQL 語句多余 where 的情況
4 set 標簽
set 標簽,用于生成 SET 子句,進行更新操作,可以自動處理最后一個條件結尾的逗號
<update id="UpdateEmployee" parameterType="com.dao.Employee"> update employee <set> <if test="empName != null and empName !=''"> employee_name=#{empName}, </if> </set> where employee_id=#{empId} </update>
測試代碼需要提交事務,sqlSession.commit(); 否則不會更新數(shù)據(jù)庫
5 trim 標簽
trim 標簽,用于去除或添加前綴和后綴,以下是 trim 標簽的屬性:
- prefix:表示在 trim 標簽內(nèi)的 sql 語句加上前綴
- suffix:表示在 trim 標簽內(nèi)的 sql 語句加上后綴
- prefixOverrides:表示去除第一個前綴
- suffixOverrides:表示去除最后一個后綴
<select id="getEmpWhereIf" parameterType="com.dao.Employee" resultMap="employeeMap"> select * from employee <!-- 添加前綴 where,移除 and 或 or --> <trim prefix="where" prefixOverrides="and | or"> <if test="empName != null"> and employee_name=#{empName} </if> </trim> </select>
6 choose、when、otherwise 標簽
choose、when、otherwise 標簽,類似于 Java 中的 switch 語句,根據(jù)不同的條件選擇執(zhí)行不同的 SQL 片段
<select id="selectEmployeeByChoose" resultType="com.dao.Employee" parameterMap="employeeMap"> select * from employee <where> <choose> <when test="empName!= null and empName!=''"> employee_name=#{empName} </when> <when test="empAddress!= null and empAddress!=''"> and employee_address=#{empAddress} </when> <otherwise> and employee_age=#{empAge} </otherwise> </choose> </where> </select>
7 foreach 標簽
foreach 標簽,用于遍歷集合,常用于 IN 語句中的參數(shù)列表生成。foreach 標簽有以下幾個屬性:
- collection:表示要遍歷的集合元素,注意不要寫 #{}。
- item:表示每次遍歷時生成的對象名(當傳入 Map 對象或 Map.Entry 對象的集合時,index 是鍵,item 是值)
- index:表示在迭代過程中,每次迭代到的位置
- open:表示開始遍歷時要拼接的字符串
- close:表示結束遍歷時要拼接的字符串
- sperator:表示在每次遍歷時,兩個對象之間的連接字符串
在 Mapper.xml SQL 映射文件 <select id="selectEmployeeByListId" resultMap="employeeMap"> select * from employee <where> <!-- where employee_id in (?,?,?,?)--> <!-- <foreach collection="ids" item="id" open="employee_id in (" close=")" separator=",">--> <!-- #{id}--> <!-- </foreach>--> <!-- where employee_id=? or employee_id=?... --> <foreach collection="ids" item="id" separator="or"> employee_id=#{id} </foreach> </where> </select> 在 Mapper.java 接口 List<Employee> selectEmployeeByListId(@Param("ids") List<Integer> ids); 在 Test 測試類 @Test public void testSelectByListid() { List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(4); ids.add(5); List<Employee> employees = mapper.selectEmployeeByListId(ids); for (Employee employee : employees) { System.out.println(employee); } }
8 bind 標簽
bind 標簽,用于在 OGNL 表達式之外創(chuàng)建一個變量,并將其綁定到當前的上下文中,以便在后續(xù)的表達式中使用。
<!-- 查詢姓馬的員工 --> <select id="selectEmployeeByName" parameterType="com.dao.Employee" resultMap="employeeMap"> <bind name="pattern" value="'%' + empName + '%'"/> select * from employee where employee_name like #{pattern} </select>
到此這篇關于MyBatis實現(xiàn)動態(tài)SQL的方法的文章就介紹到這了,更多相關MyBatis 動態(tài)SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MyBatis中動態(tài)SQL的使用指南
- MyBatis中實現(xiàn)動態(tài)SQL標簽
- 使用MyBatis的動態(tài)SQL注解實現(xiàn)實體的CRUD操作代碼
- Mybatis之動態(tài)SQL使用小結(全網(wǎng)最新)
- Mybatis動態(tài)Sql標簽使用小結
- MyBatis中的XML實現(xiàn)和動態(tài)SQL實現(xiàn)示例詳解
- MyBatis映射文件中的動態(tài)SQL實例詳解
- 詳解MyBatis特性之動態(tài)SQL
- Mybatis使用注解實現(xiàn)復雜動態(tài)SQL的方法詳解
- MyBatis的動態(tài)攔截sql并修改
- mybatis動態(tài)生成sql語句的實現(xiàn)示例
相關文章
詳解Mybatis中的 ${} 和 #{}區(qū)別與用法
這篇文章主要介紹了Mybatis中的 ${} 和 #{}區(qū)別與用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Dwr3.0純注解(純Java Code配置)配置與應用淺析一之零配置文件化
Dwr對我來說最重要的功能點就是反向Ajax調(diào)用,通俗來將就是后端可以直接調(diào)用前端的JS方法(只要在所能訪問的范圍內(nèi)),這也就是Dwr的真正來由,當然它也有最基本的前端直接調(diào)用后端的特性,省去了我們經(jīng)常的一般Ajax調(diào)用2016-04-04