Mybatis模糊查詢(xún)和動(dòng)態(tài)sql語(yǔ)句的用法
Mybatis 模糊查詢(xún)和動(dòng)態(tài)sql語(yǔ)句
模糊查詢(xún)
對(duì)數(shù)據(jù)庫(kù)最常用的操作就是查詢(xún)了,但是如何使用Mybatis進(jìn)行模糊查詢(xún)呢?下面先看一個(gè)簡(jiǎn)單的模糊查詢(xún)
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
WHERE emp_name LIKE #{asd}
</select>
這是一條偽模糊查詢(xún), 因?yàn)闆](méi)有實(shí)現(xiàn)真正的模糊 “%”。參數(shù)為字符串,所以#{}中內(nèi)容不被限制。但是應(yīng)該如何插入 % 字符呢。 我們首先想到的是傳遞字符串參數(shù)時(shí)將%插入到字符串中 “張%”,但是這種方法操作略微繁瑣了一些。 下面提供了使用sql方法的策略
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
WHERE emp_name LIKE CONCAT( #{asd} ,'%')
</select>
另外一種不推薦的寫(xiě)法給大家
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
WHERE emp_name LIKE '${emp_name}%'
</select>
#{} 是采用預(yù)編譯的寫(xiě)法,也就是JDBC中的PerpareStatement,這種寫(xiě)法可以防止sql注入,但${}這種寫(xiě)法是不采用預(yù)編譯,其中的參數(shù)寫(xiě)成類(lèi)中的屬性或者map的key值或者為接口中注解的參數(shù)名。
mybatis 提供了bind 標(biāo)簽。下面舉個(gè)例子
<select id="select01" resultMap="BasicResultMap">
<bind name="emp_name" value="'%'+ _parameter.getEmp_name() +'%'"/>
SELECT
*
FROM
oa_employee
WHERE emp_name LIKE #{emp_name}
</select>
他是在#{}表達(dá)式自動(dòng)填入value值,值得注意的是“_parameter.getEmp_name()” 調(diào)用的方法是對(duì)象中作為查詢(xún)參數(shù)的屬性的get方法
多條件查詢(xún)
多種條件查詢(xún)的要點(diǎn)是判斷查詢(xún)條件是否為空,拼接sql語(yǔ)句。在mybatis中提供了if標(biāo)簽和where 標(biāo)簽。 下面來(lái)介紹兩種標(biāo)簽的用法。
if標(biāo)簽
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
WHERE 1=1
<if test="emp_name != null and emp_name != ''">
and emp_name = #{emp_name }
</if>
<if test="emp_sex != null and emp_sex != ''">
and sex = #{emp_sex}
</if>
</select>
mybatis 中的if標(biāo)簽有些類(lèi)似于EL表達(dá)式的使用,test中可以直接寫(xiě)入類(lèi)中的屬性或者key值。
where標(biāo)簽
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
<where>
<if test="emp_name != null and emp_name != ''">
and emp_name = #{emp_name }
</if>
<if test="emp_sex != null and emp_sex != ''">
and sex = #{emp_sex}
</if>
</where>
</select>
這里的where標(biāo)簽 替換了前一段代碼的 where 1=1 。 mybatis中的where 標(biāo)簽會(huì)判斷標(biāo)簽內(nèi)是否有內(nèi)容, 如果有內(nèi)容就自動(dòng)生成where 并把 where 后面的第一個(gè)and +一個(gè)空格,or+一個(gè)空格 去掉。
choose , when 和 otherwise 標(biāo)簽
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
<where>
<choose>
<when test="emp_name != null and emp_name != ''">
and emp_name = #{emp_name }
</when>
<when test="emp_sex != null and emp_sex != ''">
and sex = #{emp_sex}
</when>
<otherwise>
emp_id = 50
</otherwise>
</choose>
</where>
</select>
當(dāng)所有條件不滿(mǎn)足時(shí),執(zhí)行otherwise標(biāo)簽的內(nèi)容。
trim標(biāo)簽
<select id="select01" resultMap="BasicResultMap">
SELECT
*
FROM
oa_employee
<trim prefix="where" prefixOverrides="and |or ">
<if test="emp_name != null and emp_name != ''">
and emp_name = #{emp_name }
</if>
<if test="emp_sex != null and emp_sex != ''">
and sex = #{emp_sex}
</if>
</trim>
trim標(biāo)簽的屬性及其含義
- - prefix : 標(biāo)簽之間有內(nèi)容在最前面加入
- - prefixOverrides: 檢查內(nèi)容的最前面是否匹配,匹配就刪除
- - suffix: 標(biāo)簽之間有內(nèi)容在最后面加入
- - suffixOverrides:檢查內(nèi)容的最后面是否匹配,匹配就刪除
set標(biāo)簽
set標(biāo)簽常用于update操作,并且會(huì)自動(dòng)抹掉無(wú)關(guān)的,
<update id="update01" >
UPDATE
oa_employee
<set>
<if test="emp_name != null and emp_name != ''">
emp_name = #{emp_name}
</if>
<if test="emp_sex != null and emp_sex != ''">
,sex = #{emp_sex}
</if>
</set>
WHERE emp_id = 50
</update>
foreach標(biāo)簽
foreach 用于處理數(shù)組或者list集合,下面是一個(gè)批量添加的例子
<insert id="insert01">
INSERT INTO
oa_employee
( emp_name, sex, fk_dept_id)
VALUES
<foreach collection="list" item="employee" separator=",">
(#{employee.emp_name},#{employee.emp_sex},#{employee.fk_dept_id})
</foreach>
</insert>
其中 如果參數(shù)為數(shù)組 則collection只能為“array” 參數(shù)為L(zhǎng)ist集合則collection只能為 “l(fā)ist” item類(lèi)似JSTL 中的var的作用, 指代容器中的每一個(gè)對(duì)象。separator=”,”的含義是每條數(shù)據(jù)以 , 分割。 未注明的屬性有 open 和 close 他們的含義是在遍歷開(kāi)始和結(jié)束時(shí)分別添加其內(nèi)容。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- mybatis的動(dòng)態(tài)sql詳解(精)
- mybatis動(dòng)態(tài)sql之Map參數(shù)的講解
- MyBatis執(zhí)行動(dòng)態(tài)SQL的方法
- Mybatis中的動(dòng)態(tài)SQL語(yǔ)句解析
- MyBatis動(dòng)態(tài)SQL中的trim標(biāo)簽的使用方法
- MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢(xún)
- MyBatis動(dòng)態(tài)SQL標(biāo)簽用法實(shí)例詳解
- mybatis的動(dòng)態(tài)sql之if test的使用說(shuō)明
- 詳解Mybatis動(dòng)態(tài)sql
- Mybatis超級(jí)強(qiáng)大的動(dòng)態(tài)SQL語(yǔ)句大全
相關(guān)文章
Java優(yōu)化for循環(huán)嵌套的高效率方法
這篇文章主要介紹了Java優(yōu)化for循環(huán)嵌套的高效率方法,幫助大家更好的提升java程序性能,感興趣的朋友可以了解下2020-09-09
Spring Boot 和 Spring 到底有啥區(qū)別你知道嗎
Spring Boot框架的核心就是自動(dòng)配置,只要存在相應(yīng)的jar包,Spring就幫我們自動(dòng)配置。接下來(lái)通過(guò)本文給大家介紹Spring與Spring boot的區(qū)別介紹,非常不錯(cuò),需要的朋友參考下吧2021-08-08
RestFul風(fēng)格 — 使用@PathVariable傳遞參數(shù)報(bào)錯(cuò)404的解決
這篇文章主要介紹了RestFul風(fēng)格 — 使用@PathVariable傳遞參數(shù)報(bào)錯(cuò)404的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java實(shí)現(xiàn)答答租車(chē)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)答答租車(chē)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
java動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理示例分享
這篇文章主要介紹了java動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理示例,JDK1.3之后,Java提供了動(dòng)態(tài)代理的技術(shù),允許開(kāi)發(fā)者在運(yùn)行期間創(chuàng)建接口的代理實(shí)例,下面我們使用示例學(xué)習(xí)一下2014-03-03

