最新中國(guó)b2b網(wǎng)站排名南寧seo做法哪家好
目錄
什么是MyBtais動(dòng)態(tài)語句???
MyBatis常用的動(dòng)態(tài)標(biāo)簽和表達(dá)式
if標(biāo)簽
Choose標(biāo)簽
where標(biāo)簽
MyBatis模糊查詢?
#與$的區(qū)別
?編輯
?MyBatis映射
resultType
resultMap
?
什么是MyBtais動(dòng)態(tài)語句???
MyBatis動(dòng)態(tài)語句是指在編寫SQL語句時(shí),使用MyBatis提供的動(dòng)態(tài)標(biāo)簽和表達(dá)式,根據(jù)不同的條件生成不同的SQL語句片段。通過使用動(dòng)態(tài)語句,我們可以根據(jù)不同的條件動(dòng)態(tài)地拼接SQL語句,使其更靈活和可復(fù)用。
MyBatis常用的動(dòng)態(tài)標(biāo)簽和表達(dá)式
if標(biāo)簽
? ?用于根據(jù)條件判斷是否包含某個(gè)SQL語句片段。當(dāng)條件成立時(shí),會(huì)將<if>標(biāo)簽內(nèi)部的SQL語句包含到最終生成的SQL語句中
示例代碼:
<select id="getUser" parameterType="int" resultType="User">SELECT * FROM user WHERE 1=1<if test="id != null">AND id = #{id}</if><if test="username != null">AND username = #{username}</if>
</select>
上面屬性解釋,具體定義一個(gè)查詢語句的標(biāo)簽,id屬性指定了查詢語句的唯一標(biāo)識(shí),parameterType屬性指定了輸入?yún)?shù)的類型,resultType屬性指定了返回結(jié)果的類型
<if test="id != null">:動(dòng)態(tài)語句的起始標(biāo)簽,用于判斷條件是否成立
AND id = #{id}: ? ? ? ? ? ?:SQL語句片段 將id!=null 成立sql條件包含到最終生成的SQL語句中
AND username = #{username}:SQL語句片段,當(dāng)條件username != null成立時(shí),將被包含到最終生成的SQL語句中
其中的 test屬性用于指定一個(gè)表達(dá)式,用來判斷條件是否成立。表達(dá)式可以是任意的合法表達(dá)式,通常使用參數(shù)的屬性進(jìn)行判斷。#{}是MyBatis中的占位符,可以獲取參數(shù)的值。
Choose標(biāo)簽
使用<choose>標(biāo)簽和<when>、<otherwise>標(biāo)簽來實(shí)現(xiàn)多條件選擇,根據(jù)條件選擇對(duì)應(yīng)的SQL語句片段
示例代碼:
<select id="getUser" parameterType="int" resultType="User">SELECT * FROM user WHERE 1=1<choose><when test="id != null">AND id = #{id}</when><when test="username != null">AND username = #{username}</when><otherwise>AND age > #{age}</otherwise></choose>
</select>
在上面的代碼<otherwise>標(biāo)簽用于指定條件都不成立時(shí)執(zhí)行的SQL語句片段。
where標(biāo)簽
使用<where>標(biāo)簽將條件拼接到WHERE子句中,如果條件不成立則不會(huì)生成WHERE關(guān)鍵字?
示例代碼:
<select id="getUser" parameterType="int" resultType="User">SELECT * FROM user<where><if test="id != null">AND id = #{id}</if><if test="username != null">AND username = #{username}</if></where>
</select>
Set標(biāo)簽
? 使用<set>標(biāo)簽將更新的字段拼接到SET子句中,如果條件不成立則不會(huì)生成SET關(guān)鍵字?
實(shí)例代碼:
<update id="updateUser" parameterType="User">UPDATE user<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if></set>WHERE id = #{id}
MyBatis模糊查詢?
#與$的區(qū)別
? #(井號(hào))
? ? ? 用于預(yù)編譯階段,也稱為安全的參數(shù)替換。當(dāng)我們使用#來表示一個(gè)參數(shù)時(shí),MyBatis會(huì)自動(dòng)將傳入的參數(shù)進(jìn)行預(yù)編譯處理,并且會(huì)對(duì)參數(shù)進(jìn)行類型安全檢查,然后將其轉(zhuǎn)義后嵌入到SQL語句中。這樣可以防止SQL注入攻擊。因此,#通常在我們需要傳遞動(dòng)態(tài)參數(shù)時(shí)使用。在SQL語句中使用#表示參數(shù)的位置
例如:
SELECT * FROM user WHERE id = #{userId}
? ? $(美元符號(hào))
(美元符號(hào))則是直接拼接參數(shù)值。當(dāng)我們使用來表示一個(gè)參數(shù)時(shí),MyBatis會(huì)把參數(shù)原封不動(dòng)地拼接到SQL語句中,而不會(huì)進(jìn)行任何轉(zhuǎn)義或預(yù)編譯處理。這樣的參數(shù)替換是不安全的,容易受到SQL注入攻擊。因此,通常在我們確保參數(shù)安全或需要傳遞動(dòng)態(tài)的表名、列名等情況下使用。在SQL語句中使用表示參數(shù)的內(nèi)容
例如:
SELECT * FROM ${tableName}
注意:使用$進(jìn)行參數(shù)替換時(shí),我們需要自己確保參數(shù)的值正確并且安全,以避免潛在的安全風(fēng)險(xiǎn)。而使用#進(jìn)行參數(shù)替換時(shí),MyBatis會(huì)幫助我們處理參數(shù)的類型安全和轉(zhuǎn)義等問題,更加安全可靠。
?
代碼展示
為了更好的體現(xiàn)出#跟$的區(qū)別,我們配置三種方式來測(cè)試,#和$及concat
?在我們前面一篇的Mybatis講解中,生成增刪改查的類中配置剛所寫的xml中的模糊查詢方法
?
package com.xiaoxu.mapper;import com.xiaoxu.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface BookMapper {int deleteByPrimaryKey(Integer bid);int insert(Book record);int insertSelective(Book record);Book selectByPrimaryKey(Integer bid);int updateByPrimaryKeySelective(Book record);int updateByPrimaryKey(Book record);List<Book> selectByBids(@Param("bids") List bids);List<Book> like1(@Param("bname")String bname);List<Book> like2(@Param("bname")String bname);List<Book> like3(@Param("bname")String bname);
在前端和后端進(jìn)行相對(duì)應(yīng)的dao方法
定義一個(gè)接口并實(shí)現(xiàn)
接口方法:
List<Book> like1(@Param("bname") String bname);List<Book> like2(@Param("bname") String bname);List<Book> like3(@Param("bname") String bname);
實(shí)現(xiàn)類
package com.xiaoxu.biz.impl;import com.xiaoxu.biz.BookBiz;
import com.xiaoxu.mapper.BookMapper;
import com.xiaoxu.model.Book;import java.util.List;/*** @author小徐* @site www.veryedu.cn* @company xu集團(tuán)* @create 2023-08-20 16:02*/
public class BookBizImpl implements BookBiz {private BookMapper bookMapper;public BookBizImpl() {}public BookMapper getBookMapper() {return bookMapper;}public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int deleteByPrimaryKey(Integer bid) {return bookMapper.deleteByPrimaryKey(bid);}@Overridepublic int insert(Book record) {return bookMapper.insert(record);}@Overridepublic int insertSelective(Book record) {return bookMapper.insertSelective(record);}@Overridepublic Book selectByPrimaryKey(Integer bid) {return bookMapper.selectByPrimaryKey(bid);}@Overridepublic int updateByPrimaryKeySelective(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}@Overridepublic int updatByPrimaryKey(Book record) {return bookMapper.updatByPrimaryKey(record);}@Overridepublic List<Book> selectByBids(List bids) {return bookMapper.selectByBids(bids);}@Overridepublic List<Book> like1(String bname) {return bookMapper.mhcx1(bname);}@Overridepublic List<Book> like2(String bname) {return bookMapper.mhcx2(bname);}@Overridepublic List<Book> like3(String bname) {return bookMapper.mhcx3(bname);}}
接下來測(cè)試#號(hào),記得調(diào)用#的方法
@Testpublic void like1() {bookBiz.like1("%圣墟%").forEach(System.out::println);}
?運(yùn)行結(jié)果:
?
#{bname}會(huì)將傳入的bname值進(jìn)行預(yù)編譯轉(zhuǎn)義處理,然后再拼接到SQL語句中
測(cè)試$號(hào)
@Testpublic void mhcx2() {bookBiz.mhcx2("%圣墟%").forEach(System.out::println);}
運(yùn)行會(huì)報(bào)錯(cuò)
?
?在測(cè)試一遍
?MyBatis映射
resultType
? 是在 SQL 映射文件中指定查詢結(jié)果的數(shù)據(jù)類型。它可以直接指定一個(gè)基本數(shù)據(jù)類型(如 String、Integer 等)或一個(gè)實(shí)體類的全限定名。當(dāng)查詢結(jié)果只包含單個(gè)簡(jiǎn)單數(shù)據(jù)類型時(shí),通常使用 resultType
例如:
<select id="getUserAge" resultType="Integer">SELECT age FROM user WHERE id = #{userId}
</select>
resultMap
?是用于處理復(fù)雜的查詢結(jié)果映射關(guān)系。它定義了數(shù)據(jù)庫列和 Java 對(duì)象屬性之間的映射規(guī)則。通過使用 resultMap,我們可以將查詢結(jié)果映射到一個(gè)復(fù)雜的對(duì)象結(jié)構(gòu)中,可以包含嵌套查詢結(jié)果、聯(lián)合查詢等復(fù)雜情況。通常,在查詢結(jié)果需要轉(zhuǎn)換成復(fù)雜對(duì)象或者集合時(shí)使用 resultMap
<resultMap id="userMap" type="User"><id column="id" property="id"/><result column="name" property="name"/><result column="age" property="age"/><!-- 其他屬性映射 -->
</resultMap><select id="getUsers" resultMap="userMap">SELECT * FROM user
</select>
其中 <resultMap> 標(biāo)簽定義了 User 類中各個(gè)屬性與數(shù)據(jù)庫表的列之間的映射規(guī)則,并設(shè)置了唯一標(biāo)識(shí)符 userMap。在 <select> 標(biāo)簽中使用 resultMap 屬性指定查詢結(jié)果的映射關(guān)系。
總結(jié)來說,resultType 適用于簡(jiǎn)單的查詢結(jié)果映射,而 resultMap 適用于復(fù)雜的查詢結(jié)果映射。根據(jù)實(shí)際情況選擇合適的方式可以提高 MyBatis 查詢結(jié)果的靈活性和可讀性。
?