最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis中bind的使用示例詳解

 更新時(shí)間:2025年06月19日 16:33:03   作者:五月天的尾巴  
在 MyBatis 中,bind?標(biāo)簽允許在 OGNL 表達(dá)式上下文中創(chuàng)建一個(gè)變量并將其綁定到當(dāng)前上下文,常用于動態(tài) SQL 中簡化復(fù)雜表達(dá)式或重復(fù)計(jì)算,這篇文章主要介紹了mybatis中bind的使用示例詳解,需要的朋友可以參考下

mybatis中bind的使用

一、介紹

在 MyBatis 中,bind 標(biāo)簽允許在 OGNL 表達(dá)式上下文中創(chuàng)建一個(gè)變量并將其綁定到當(dāng)前上下文,常用于動態(tài) SQL 中簡化復(fù)雜表達(dá)式或重復(fù)計(jì)算。

二、語法

<bind name="變量名" value="OGNL表達(dá)式"/>
  • name:變量名稱,后續(xù)可直接引用。
  • value:OGNL 表達(dá)式,可以是字符串拼接、計(jì)算等操作。

三、常見示例

3.1、字符串拼接

在模糊查詢中,避免直接在 SQL 中拼接 %,提升可讀性:

<select id="searchUsers" resultType="User">
    <bind name="pattern" value="'%' + username + '%'"/>
    SELECT * FROM users 
    WHERE username LIKE #{pattern}
</select>

3.2、動態(tài)條件處理(三元表達(dá)式)

結(jié)合條件判斷,簡化復(fù)雜邏輯:

<select id="getUsers" resultType="User">
    <bind name="filterName" value="name != null ? name : '%'"/>
    SELECT * FROM users
    WHERE name LIKE #{filterName}
</select>

3.3、避免重復(fù)計(jì)算

在多次使用同一表達(dá)式時(shí),通過 bind 復(fù)用:

<select id="calculate" resultType="double">
    <bind name="total" value="price * quantity"/>
    <bind name="discounted" value="total * (1 - discount)"/>
    SELECT #{discounted} AS final_price
</select>

3.4、bind與分頁查詢

bind經(jīng)常與分頁查詢limit一起使用,用來計(jì)算limit中的起始條數(shù)與分頁數(shù)。

<select id="pageListUser" resultType="com.demo.entity.User"
            parameterType="java.util.List">
    select * from user 
    where name = #{name}
    <if test="pageNo != null and pageSize != null">
        <bind name="pageNo" value="(pageNo-1)*pageSize"/>
        limit #{pageNo},#{pageSize}
    </if>
</select>
  • pageNo:頁碼、第幾頁
  • pageSize: 每頁顯示條數(shù)

3.5、foreach中使用bind

在 MyBatis 的 foreach 循環(huán)中,應(yīng)避免使用 bind 來創(chuàng)建每個(gè)迭代的臨時(shí)變量,因?yàn)?bind 的作用域是當(dāng)前上下文,在循環(huán)中會被覆蓋。替代方案是在 Java 代碼中預(yù)處理數(shù)據(jù),或者直接在表達(dá)式中使用循環(huán)項(xiàng)和索引。

若實(shí)在需要在foreach中使用bind,可以參考文末補(bǔ)充介紹《mybatis foreach里用bind、foreach中使用bind的坑、foreach中動態(tài)生成表名》

四、錯誤示例

4.1、where后面跟著bind

網(wǎng)上看到有些博文寫過這樣的示例,bind跟在where條件后面,但這是一種錯誤的寫法。bind 變量僅在當(dāng)前語句塊(如 <select>、<update>)內(nèi)有效。

&lt;select id="getUsersByNameAndAge" resultType="User"&gt;
    SELECT * FROM users
    WHERE name = #{name} AND age &gt;= &lt;bind name="minAge" value="${minAge}" /&gt;
&lt;/select&gt;

<bind> 必須放在 SQL 語句的最前面,不能跟在 WHERE 條件后面。

五、總結(jié)

5.1、注意事項(xiàng)

  • bind 變量僅在當(dāng)前語句塊(如 <select><update>)內(nèi)有效。
  • OGNL 表達(dá)式支持 Java 語法,如三元運(yùn)算符、方法調(diào)用等。
  • 優(yōu)先使用 bind 而非直接拼接 SQL,以提高安全性和可維護(hù)性。

通過靈活使用 bind,可以顯著提升 MyBatis 動態(tài) SQL 的可讀性和簡潔性。

補(bǔ)充:mybatis foreach里用bind、foreach中使用bind的坑、foreach中動態(tài)生成表名

mybatis foreach里用bind、foreach中使用bind的坑、foreach中動態(tài)生成表名

一、前言

在mybatis實(shí)際開發(fā)中遇到這樣一個(gè)場景,foreach標(biāo)簽中需要動態(tài)生成一個(gè)表名,如t0,t1,t2…等等, 可以在dao層傳入,也可以在foreach中用bind標(biāo)簽生成,這里我們介紹使用bind生成該變量。

示例如下:

dao層傳入[張三、李四]。 mapper.xml中根據(jù)傳入的列表個(gè)數(shù)使用foreach進(jìn)行union all拼接,并且需要動態(tài)生成表名 t0、t1等等。最終拼接sql如下:

select * from(
	select * from user where name='張三' order by id
) t0
union all
select * from(
	select * from user where name='李四' order by id
) t1

二、解決方法/foreach中使用bind

下面為公共的UserService.java、UserMapper.java中的代碼

UserService.java代碼:

@Autowired
private UserMapper userMapper;
public List<User> selectByNameList(){
    userMapper.selectByNameList(Arrays.asList("張三","李四"));
    return null;
}

UserMapper.java代碼:

public interface UserMapper  {
    List<User> selectByNameList(List<String> nameList);
}

2.1、方法一:#傳參

UserMapper.xml代碼

<select id="selectByNameList" resultType="com.demo.entity.User"
            parameterType="java.util.List">
    <foreach collection="list" item="item" separator="union all"  index="index">
        select * from (
            select * from user where name = #{item} order by id
        ) t#{index}
    </foreach>
</select>

日志如下:

==>  Preparing: select * from ( select * from user where name = ? order by id ) t? union all select * from ( select * from user where name = ? order by id ) t?
==> Parameters: 張三(String), 0(Integer), 李四(String), 1(Integer)

2.2、方法二:$傳參 bind生成變量

UserMapper.xml代碼

<select id="selectByNameList" resultType="com.demo.entity.User"
            parameterType="java.util.List">
    <foreach collection="list" item="item" separator="union all"  index="index">
        <bind name="tableName" value="'t' + index"></bind>
        select * from (
            select * from user where name = #{item} order by id
        ) ${tableName}
    </foreach>
</select>

日志如下:

==>  Preparing: select * from ( select * from user where name = ? order by id ) t0 union all select * from ( select * from user where name = ? order by id ) t1
==> Parameters: 張三(String), 李四(String)

注意:

  • ${}方式傳參有sql注入問題,所以確保${}中的變量沒有注入風(fēng)險(xiǎn)。

三、bind變量覆蓋問題/錯誤示例

上面的示例中,我們在foreach標(biāo)簽內(nèi)使用了bind綁定變量給tableName并且用${tableName}的方式獲取值。如果我們是使用#{tableName}的方式獲取值,會發(fā)現(xiàn)每次tableName的值都會是最后一個(gè)元素。

錯誤示例一:

<select id="selectByNameList" resultType="com.demo.entity.User"
            parameterType="java.util.List">
    <foreach collection="list" item="item" separator="union all"  index="index">
        <bind name="tableName" value="'t' + index"></bind>
        select * from (
            select * from user where name = #{item} order by id
        ) #{tableName}
    </foreach>
</select>

日志文件:

==>  Preparing: select * from ( select * from user where name = ? order by id ) ? union all select * from ( select * from user where name = ? order by id ) ?
==> Parameters: 張三(String), t1(String), 李四(String), t1(String)

錯誤示例二:循環(huán)內(nèi)重復(fù)綁定同名變量

<foreach item="item" collection="list" separator=",">
  <!-- 錯誤:每次循環(huán)覆蓋 previousItem,最終所有值相同 -->
  <bind name="previousItem" value="item" />
  #{previousItem}
</foreach>

四、總結(jié)

總結(jié):在 MyBatis 的 foreach 循環(huán)中,應(yīng)避免使用 bind 來創(chuàng)建每個(gè)迭代的臨時(shí)變量,因?yàn)?bind 的作用域是當(dāng)前上下文,在循環(huán)中會被覆蓋。替代方案是在 Java 代碼中預(yù)處理數(shù)據(jù),或者直接在表達(dá)式中使用循環(huán)項(xiàng)和索引。

在 MyBatis 的 foreach 循環(huán)中使用 bind 元素時(shí),需特別注意 bind 的作用域是當(dāng)前整個(gè) SQL 語句,而非單次循環(huán)迭代。這意味著在循環(huán)內(nèi)多次使用 bind 綁定同名變量時(shí),后一次會覆蓋前一次的值,可能導(dǎo)致邏輯錯誤。

到此這篇關(guān)于mybatis中bind的使用的文章就介紹到這了,更多相關(guān)mybatis bind使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql去重查詢的三種方法小結(jié)

    mysql去重查詢的三種方法小結(jié)

    本文主要介紹了mysql去重查詢的三種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • MySQL中觸發(fā)器入門簡單實(shí)例與介紹

    MySQL中觸發(fā)器入門簡單實(shí)例與介紹

    本文章來mysql初學(xué)者介紹在mysql怎么創(chuàng)建觸發(fā)器及觸發(fā)器在mysql執(zhí)行順序,下面我來給大家詳細(xì)介紹
    2013-08-08
  • MySQL表列數(shù)和行大小限制詳解

    MySQL表列數(shù)和行大小限制詳解

    MySQL在表的列數(shù)和行大小方面有一些限制,本文將對這些限制進(jìn)行詳細(xì)解釋,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • cmd命令提示符輸入:mysql?-u?root?-p報(bào)錯提示"mysql?不是內(nèi)部或外部命令,也不是可運(yùn)行的程序"問題解決

    cmd命令提示符輸入:mysql?-u?root?-p報(bào)錯提示"mysql?不是內(nèi)部或外部命令,也不是

    這篇文章主要給大家介紹了關(guān)于cmd命令提示符輸入:mysql?-u?root?-p報(bào)錯提示"mysql?不是內(nèi)部或外部命令,也不是可運(yùn)行的程序"問題的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Mysql執(zhí)行原理之索引合并步驟詳解

    Mysql執(zhí)行原理之索引合并步驟詳解

    這篇文章主要介紹了Mysql執(zhí)行原理之索引合并詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Mybatis中的動態(tài)SQL語句解析

    Mybatis中的動態(tài)SQL語句解析

    這篇文章主要介紹了Mybatis中的動態(tài)SQL語句解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • MySQL中給自定義的字段查詢結(jié)果添加排名的方法

    MySQL中給自定義的字段查詢結(jié)果添加排名的方法

    這篇文章主要介紹了MySQL中給自定義的字段查詢結(jié)果添加排名的方法,只需要對counter寫一個(gè)小算式,非常簡單,需要的朋友可以參考下
    2015-06-06
  • Node.js下向MySQL數(shù)據(jù)庫插入批量數(shù)據(jù)的方法

    Node.js下向MySQL數(shù)據(jù)庫插入批量數(shù)據(jù)的方法

    這篇文章主要介紹了Node.js下向MySQL數(shù)據(jù)庫插入批量數(shù)據(jù)的實(shí)現(xiàn)方法,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-10-10
  • MYSQL中的json數(shù)據(jù)操作代碼

    MYSQL中的json數(shù)據(jù)操作代碼

    這篇文章主要介紹了MYSQL中的json數(shù)據(jù)操作,主要包括基礎(chǔ)查詢操作,JSON函數(shù)操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • MySQL數(shù)據(jù)庫多表聯(lián)合查詢代碼示例

    MySQL數(shù)據(jù)庫多表聯(lián)合查詢代碼示例

    所謂聯(lián)合就是把多個(gè)表的記錄往一起合并,一起進(jìn)行查詢,也叫多表查詢,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫多表聯(lián)合查詢的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論

泽库县| 高青县| 安徽省| 沁阳市| 东丽区| 集安市| 平安县| 瑞昌市| 邹城市| 千阳县| 普洱| 祥云县| 深州市| 博湖县| 东丽区| 眉山市| 万荣县| 桐城市| 平遥县| 城口县| 乌什县| 香河县| 万年县| 大足县| 噶尔县| 闸北区| 上高县| 敦煌市| 鱼台县| 随州市| 会宁县| 阳泉市| 崇义县| 赣州市| 淮北市| 盐城市| 尚志市| 安乡县| 扶风县| 民县| 绿春县|