久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > MyBatis之動(dòng)態(tài)SQL語(yǔ)句

MyBatis之動(dòng)態(tài)SQL語(yǔ)句

來(lái)源:千鋒教育
發(fā)布人:小鋒
時(shí)間: 2019-09-11 16:34:00 1568190840

  前言

  我們?cè)谶M(jìn)行項(xiàng)目開(kāi)發(fā)時(shí),經(jīng)常遇到需要根據(jù)不同的需求,對(duì)原有SQL語(yǔ)句的內(nèi)容進(jìn)行修改,原來(lái)這是一個(gè)比較頭疼的問(wèn)題,因?yàn)樾枰獙?duì)原有SQL語(yǔ)句進(jìn)行拼接、重組,費(fèi)時(shí)費(fèi)力還容易出錯(cuò),今天我們將學(xué)習(xí)MyBatis的動(dòng)態(tài)SQL功能,可以解決這個(gè)問(wèn)題。

  動(dòng)態(tài)SQL語(yǔ)句簡(jiǎn)介

  動(dòng)態(tài)SQL語(yǔ)句是MyBatis的一個(gè)非常強(qiáng)大的功能,允許我們根據(jù)不同的需求,組合出不同的SQL語(yǔ)句,在select、update、insert、delete標(biāo)簽中都可以添加動(dòng)態(tài)SQL語(yǔ)句。

  IF標(biāo)簽

  IF標(biāo)簽可以在條件成立時(shí),在SQL語(yǔ)句中插入IF標(biāo)簽中的內(nèi)容,不成立就不插入

  示例:

  <select id="selectUserByUser" parameterType="User" resultMap="userMap">

  select * from tb_user where

  <if test="realname != null">

  u_realname=#{realname}

  </if>

  <if test="gender != null">

  and u_gender=#{gender}

  </if>

  </select>

  上面代碼中是按照User對(duì)象的各個(gè)屬性進(jìn)行查詢,如果姓名不為空就插入姓名作為條件,如果性別不為空就插入性別作為條件。

  但是我們會(huì)發(fā)現(xiàn)如果姓名為空,性別不為空,SQL語(yǔ)句就會(huì)變成:select * from tb_user where and u_gender=#{gender}

  或者姓名、性別都為空就會(huì)變成:select * from tb_user where

  這樣都會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤,這樣我們就需要下一個(gè)標(biāo)簽:where

  Where標(biāo)簽

  Where標(biāo)簽 用于配置where條件,會(huì)去掉多余的and或or,如果一個(gè)條件都不成立,會(huì)自動(dòng)去掉sql中的where。

  代碼改為:

  <select id="selectUserByUser" parameterType="User" resultMap="userMap">

  select * from tb_user

  <where>

  <if test="realname != null">

  u_realname=#{realname}

  </if>

  <if test="gender != null">

  and u_gender=#{gender}

  </if>

  <if test="age != null">

  and u_age=#{age}

  </if>

  </where>

  </select>

  這樣就不會(huì)出現(xiàn)上面可能的錯(cuò)誤了

  Trim標(biāo)簽

  上面where標(biāo)簽的功能,也可以使用trim標(biāo)簽實(shí)現(xiàn),trim能去掉多余的前綴和后綴。

  語(yǔ)法:

  <trim prefix="前綴SQL" suffix="后綴" prefixOverrides="刪除前面的符號(hào)" suffixOverrides="刪除后面的符號(hào)">

  <if標(biāo)簽>

  </trim>

  示例:

  <trim prefix="where" prefixOverrides="and|or">

  ...

  </trim>

  Set標(biāo)簽

  用于配置update語(yǔ)句中的set部分,可以自動(dòng)添加set關(guān)鍵字,刪除多余的逗號(hào)

  示例:

  <update id="update" parameterType="User">

  update tb_user

  <set>

  <if test="name != null">

  u_name=#{name},

  </if>

  <if test="password != null">

  u_password=#{password},

  </if>

  </set>

  where u_id=#{id}

  </update>

  也可以使用trim實(shí)現(xiàn):

  <trim prefix="set" suffixOverrides=",">

  <if test="name != null">

  u_name=#{name},

  </if>

  ...

  </trim>

  Foreach標(biāo)簽

  用于循環(huán)遍歷集合或數(shù)組的值,如:按多個(gè)人姓名查詢

  select * from tb_user where u_realname in ('張三','李四'....)

  語(yǔ)法:

  <foreach collection="集合名" item="變量名" index="下標(biāo)名" open="開(kāi)始符號(hào)" close="結(jié)束符號(hào)" seperator="分割符號(hào)">

  #{變量名}

  </foreach>

  注意:集合名在Mapper接口中需要使用@Param注解配置

  示例:

  <select id="selectUserByRealnames" resultMap="userMap">

  select * from tb_user where u_realname in

  <foreach collection="realnames" item="name" index="i" separator="," open="(" close=")">

  #{name}

  </foreach>

  </select>

  Choose標(biāo)簽

  Java中有if,也會(huì)有if-else、switch語(yǔ)句來(lái)判斷多個(gè)條件,MyBatis也有Choose標(biāo)簽可以進(jìn)行多條件判斷

  示例:

  <select id="findActiveBlogLike"

  resultType="Blog">

  SELECT * FROM BLOG WHERE state = ‘ACTIVE’

  <choose>

  <when test="title != null">

  AND title like #{title}

  </when>

  <when test="author != null">

  AND author_name like #{author}

  </when>

  <otherwise>

  AND featured = 1

  </otherwise>

  </choose>

  </select>

  這里從第一個(gè)when進(jìn)行判斷,如果成立就插入條件,結(jié)束choose標(biāo)簽,如果不成立再判斷下一個(gè)when,如果所有when都不成立,就插入otherwise中的語(yǔ)句。

  總結(jié)

  動(dòng)態(tài)SQL語(yǔ)句是MyBatis非常重要的特性,能夠讓我們根據(jù)不同需求組合SQL語(yǔ)句,而且不容易出錯(cuò)。動(dòng)態(tài)SQL的標(biāo)簽有:if、where、set、choose、foreach等。掌握好它們我們可以寫(xiě)出更加靈活、高效的數(shù)據(jù)庫(kù)操作代碼。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
市場(chǎng)上C++主要是用來(lái)做什么的?

C++是一種廣泛應(yīng)用于市場(chǎng)上的編程語(yǔ)言,具有高性能和強(qiáng)大的功能。它的設(shè)計(jì)目標(biāo)是提供高效的底層控制和與硬件交互的能力,同時(shí)保持可移植性和可...詳情>>

2023-10-14 06:01:51
為什么說(shuō)PHP與Swoole是優(yōu)異組合?

PHP與Swoole在Web開(kāi)發(fā)和網(wǎng)絡(luò)編程領(lǐng)域中,共同構(gòu)成了一種強(qiáng)大的解決方案。什么是PHPPHP是一種廣泛使用的開(kāi)源服務(wù)器端腳本語(yǔ)言,特別適用于Web開(kāi)...詳情>>

2023-10-14 05:08:41
Javaweb開(kāi)發(fā)為什么需要分前后端?

Javaweb開(kāi)發(fā)采用前后端分離的設(shè)計(jì)模式是有著諸多理由的,以下分析了這種設(shè)計(jì)模式的主要特點(diǎn)和優(yōu)勢(shì)。什么是前后端分離在Web開(kāi)發(fā)中,前后端分離是...詳情>>

2023-10-14 05:05:24
瀑布開(kāi)發(fā)和敏捷開(kāi)發(fā)的區(qū)別是什么?

一、開(kāi)發(fā)流程不同瀑布開(kāi)發(fā)采用線性的開(kāi)發(fā)流程,按照預(yù)先規(guī)劃的順序依次進(jìn)行需求分析、設(shè)計(jì)、編碼、測(cè)試和維護(hù)等環(huán)節(jié)。每個(gè)環(huán)節(jié)都有明確的交付物...詳情>>

2023-10-14 04:47:33
有哪款比較好用的免費(fèi)的缺陷管理工具?

一、BugzillaBugzilla是一款廣泛使用的免費(fèi)缺陷管理工具,具備完善的缺陷管理功能,并支持多用戶協(xié)同工作。Bugzilla提供了強(qiáng)大的搜索和過(guò)濾功能...詳情>>

2023-10-14 04:40:43
快速通道