gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一起聊聊MySQL動(dòng)態(tài)SQL拼接

本篇文章給大家?guī)?lái)了關(guān)于mysql的相關(guān)知識(shí),其中主要介紹了關(guān)于動(dòng)態(tài)SQL拼接的相關(guān)內(nèi)容,實(shí)際業(yè)務(wù)開(kāi)發(fā)中,我們的SQL語(yǔ)句通常是動(dòng)態(tài)拼接而成的,比如條件搜索功能的SQL語(yǔ)句等等,下面一起來(lái)看一下,希望對(duì)大家有幫助。

一起聊聊MySQL動(dòng)態(tài)SQL拼接

程序員必備接口測(cè)試調(diào)試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設(shè)計(jì)、調(diào)試、文檔、自動(dòng)化測(cè)試工具
后端、前端、測(cè)試,同時(shí)在線協(xié)作,內(nèi)容實(shí)時(shí)同步

推薦學(xué)習(xí):mysql視頻教程

一、動(dòng)態(tài)sql拼接

目標(biāo)

  • 能夠使用mybatis的標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)SQL拼接

分析

我們?cè)谇斑叺膶W(xué)習(xí)過(guò)程中,使用的SQL語(yǔ)句都非常簡(jiǎn)單。而在實(shí)際業(yè)務(wù)開(kāi)發(fā)中,我們的SQL語(yǔ)句通常是動(dòng)態(tài)拼接而成的,比如:條件搜索功能的SQL語(yǔ)句。

# 提供了一個(gè)功能:用戶可以在頁(yè)面上根據(jù)username、sex、address進(jìn)行搜索 # 用戶輸入的搜索條件:可以是一個(gè)條件,也可能是兩個(gè)、三個(gè)  # 只輸入一個(gè)條件:姓名是"王" SELECT * FROM USER WHERE username LIKE '%王%' # 只輸入一個(gè)條件:性別是“男” SELECT * FROM USER WHERE sex = '男' # 輸入兩個(gè)條件:姓名“王”,性別“男” SELECT * FROM USER WHERE username LIKE '%王%' AND sex = '男' # 輸入三個(gè)條件:姓名“王”,性別“男”,地址“北京” SELECT * FROM USER WHERE username LIKE '%王%' AND sex = '男' AND address LIKE '%北京%';
登錄后復(fù)制

在Mybatis中,SQL語(yǔ)句是寫(xiě)在映射配置的XML文件中的。Mybatis提供了一些XML的標(biāo)簽,用來(lái)實(shí)現(xiàn)動(dòng)態(tài)SQL的拼接。

常用的標(biāo)簽有:

  • <if></if>:用來(lái)進(jìn)行判斷,相當(dāng)于Java里的if判斷
  • <where></where>:通常和if配合,用來(lái)代替SQL語(yǔ)句中的where 1=1
  • <foreach></foreach>:用來(lái)遍歷一個(gè)集合,把集合里的內(nèi)容拼接到SQL語(yǔ)句中。例如拼接:in (value1, value2, ...)
  • <sql></sql>:用于定義sql片段,達(dá)到重復(fù)使用的目的

講解

1. 準(zhǔn)備Mybatis環(huán)境

  • 創(chuàng)建java項(xiàng)目,導(dǎo)入jar包;準(zhǔn)備JavaBean

  • 創(chuàng)建映射器接口UserDao

  • 創(chuàng)建映射配置文件UserDao.xml

  • 創(chuàng)建全局配置文件SqlMapConfig.xml

  • 創(chuàng)建日志配置文件log4j.properties

2. <if>標(biāo)簽:

語(yǔ)法介紹

<if test="判斷條件,使用OGNL表達(dá)式進(jìn)行判斷"> 	SQL語(yǔ)句內(nèi)容, 如果判斷為true,這里的SQL語(yǔ)句就會(huì)進(jìn)行拼接</if>
登錄后復(fù)制

使用示例
  • 根據(jù)用戶的名稱和性別搜索用戶信息。把搜索條件放到User對(duì)象里,傳遞給SQL語(yǔ)句

  • 映射器接口UserDao上加方法

package com.demo.dao;import com.demo.domain.User;import java.util.List;public interface UserDao {     /**      * 根據(jù)username和sex搜索用戶      * @param user 封裝了搜索條件的User對(duì)象      * @return 搜索的結(jié)果      */     List<User> search1(User user);}
登錄后復(fù)制

  • 映射文件UserDao.xml里配置statement

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.itheima.dao.UserDao">      <!--     if標(biāo)簽:用于條件判斷         語(yǔ)法:<if test="用OGNL表達(dá)式判斷"> 如果判斷為true,這里的內(nèi)容會(huì)拼接上去 </if>         注意:標(biāo)簽里寫(xiě)OGNL表達(dá)式,不要再加#{}、${}         常用的OGNL表達(dá)式:             比較:>, <, >=, <=, ==, != 或者 gt, lt, gte, lte, eq, neq             邏輯:&&,||,! 或者 and, or, not             調(diào)用方法:username.length(),  list.size()     -->     <select id="search1" resultType="User">         select * from user where 1=1        <if test="username != null and username.length()>0">             and username like "%"#{username}"%"        </if>         <if test="sex != null and sex.length()>0">             and sex = #{sex}        </if>     </select></mapper>
登錄后復(fù)制

  • 功能測(cè)試,在測(cè)試類里加測(cè)試方法

package com.demo;import com.demo.dao.UserDao;import com.demo.domain.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;public class SqlTest {      private UserDao userDao;     private SqlSession session;     private InputStream is;      /**      * 要求:根據(jù)username和sex搜索用戶      *      搜索條件放到user對(duì)象里      */     @Test     public void testSearch(){         User user = new User();         // user.setUsername("王");         // user.setSex("男");          List<User> userList = userDao.search1(user);         userList.forEach(System.out::println);     }       @Before     public void init() throws IOException {         //1. 讀取全局配置文件         is = Resources.getResourceAsStream("SqlMapConfig.xml");         //2. 得到一個(gè)SqlSession對(duì)象         SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);         session = factory.openSession();         userDao = session.getMapper(UserDao.class);     }      @After     public void destroy() throws IOException {         session.close();         is.close();     }}
登錄后復(fù)制

3. <where>標(biāo)簽

語(yǔ)法介紹

在剛剛的練習(xí)的SQL語(yǔ)句中,我們寫(xiě)了where 1=1。如果不寫(xiě)的話,SQL語(yǔ)句會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。Mybatis提供了一種代替where 1=1的技術(shù):<where></where>標(biāo)簽。

代碼示例

把上一章節(jié)的實(shí)現(xiàn)代碼進(jìn)行優(yōu)化,使用<where></where>標(biāo)簽代替where 1=1

  • 映射器UserDao的search1方法:已有,不用修改

/**  * 根據(jù)username和sex搜索用戶  * @param user 封裝了搜索條件的User對(duì)象  * @return 搜索的結(jié)果  */List<User> search1(User user);
登錄后復(fù)制

  • 在映射文件UserDao.xml里修改SQL語(yǔ)句

<!--     where標(biāo)簽:讓Mybatis幫我們生成一個(gè)where關(guān)鍵字         Mybatis會(huì)智能判斷:             如果一個(gè)條件都沒(méi)有,就不生成where關(guān)鍵字             如果有條件,會(huì)判斷是否有多余的and關(guān)鍵字,把多余的and去掉         注意:建議把所有的where條件都放到where標(biāo)簽里邊     --><select id="search1" resultType="User">     select * from user    <where>         <if test="username != null and username.length()>0">             and username like "%"#{username}"%"        </if>         <if test="sex != null and sex.length()>0">             and sex = #{sex}        </if>     </where></select>
登錄后復(fù)制

  • 在測(cè)試類里進(jìn)行功能測(cè)試:測(cè)試方法不需要修改

@Testpublic void testSearch(){     User user = new User();     // user.setUsername("王");     // user.setSex("男");      List<User> userList = userDao.search1(user);     userList.forEach(System.out::println);}
登錄后復(fù)制

4. <foreach>標(biāo)簽

語(yǔ)法介紹

foreach標(biāo)簽,通常用于循環(huán)遍歷一個(gè)集合,把集合的內(nèi)容拼接到SQL語(yǔ)句中。例如,我們要根據(jù)多個(gè)id查詢用戶信息,SQL語(yǔ)句:

select * from user where id = 1 or id = 2 or id = 3;select * from user where id in (1, 2, 3);
登錄后復(fù)制

假如我們傳參了id的集合,那么在映射文件中,如何遍歷集合拼接SQL語(yǔ)句呢?可以使用foreach標(biāo)簽實(shí)現(xiàn)。

<!-- foreach標(biāo)簽: 	屬性: 		collection:被循環(huán)遍歷的對(duì)象,使用OGNL表達(dá)式獲取,注意不要加#{} 		open:循環(huán)之前,拼接的SQL語(yǔ)句的開(kāi)始部分 		item:定義變量名,代表被循環(huán)遍歷中每個(gè)元素,生成的變量名 		separator:分隔符 		close:循環(huán)之后,拼接SQL語(yǔ)句的結(jié)束部分 	標(biāo)簽體: 		使用#{OGNL}表達(dá)式,獲取到被循環(huán)遍歷對(duì)象中的每個(gè)元素 --><foreach collection="" open="id in(" item="id" separator="," close=")">     #{id}</foreach>
登錄后復(fù)制

使用示例
  • 有搜索條件類QueryVO如下:

package com.itheima.domain;public class QueryVO {     private Integer[] ids;      public Integer[] getIds() {         return ids;     }      public void setIds(Integer[] ids) {         this.ids = ids;     }}
登錄后復(fù)制

  • 在映射器UserDao里加方法

/**      * QueryVO里有一個(gè)Integer[] ids      * 要求:根據(jù)ids查詢對(duì)應(yīng)的用戶列表      */List<User> search2(QueryVO vo);
登錄后復(fù)制

  • 在映射文件UserDao.xml里配置statement

    <!--     foreach標(biāo)簽:用于循環(huán)遍歷         collection:被循環(huán)的集合/數(shù)組         item:定義一個(gè)變量         separator:定義拼接時(shí)的分隔符         open:拼接字符串時(shí)的開(kāi)始部分         close:拼接字符串時(shí)的結(jié)束部分          相當(dāng)于 for(Integer id: ids){}         select * from user where id in(41, 42, 45)     -->     <select id="search2" resultType="User">         <!--select * from user where id in(41, 42, 45)-->         select * from user where        <foreach collection="ids" open="id in(" item="id" separator="," close=")">             #{id}        </foreach>     </select>
登錄后復(fù)制

  • 功能測(cè)試

    @Test     public void testSearch2(){         QueryVO vo = new QueryVO();         vo.setIds(new Integer[]{41,42,43,44,45});         List<User> userList = userDao.search2(vo);         userList.forEach(System.out::println);     }
登錄后復(fù)制

5. <sql>標(biāo)簽

在映射文件中,我們發(fā)現(xiàn)有很多SQL片段是重復(fù)的,比如:select * from user。Mybatis提供了一個(gè)<sql>標(biāo)簽,把重復(fù)的SQL片段抽取出來(lái),可以重復(fù)使用。

語(yǔ)法介紹

在映射文件中定義SQL片段:

<sql id="唯一標(biāo)識(shí)">sql語(yǔ)句片段</sql>
登錄后復(fù)制

在映射文件中引用SQL片段:

<include refid="sql片段的id"></include>
登錄后復(fù)制

使用示例

在查詢用戶的SQL中,需要重復(fù)編寫(xiě):select * from user。把這部分SQL提取成SQL片段以重復(fù)使用

  • 要求:QueryVO里有ids,user對(duì)象。根據(jù)條件進(jìn)行搜索
  • 修改QueryVO,增加成員變量user

package com.itheima.domain;/**  * @author liuyp  * @date 2021/09/07  */public class QueryVO {     private Integer[] ids;     private User user;      //get/set方法……}
登錄后復(fù)制

  • 在映射器UserDao里加方法

    /**      * 動(dòng)態(tài)SQL拼接的綜合應(yīng)用:if、where、foreach      * 要求:QueryVo里有ids、username、sex值,根據(jù)這些值進(jìn)行搜索      */     List<User> search3(QueryVO vo);
登錄后復(fù)制

  • 在映射文件UserDao.xml里配置statement

<select id="search3" resultType="User">     <!--select * from user-->     <include refid="selUser"/>     <where>         <if test="ids != null and ids.length > 0">             <foreach collection="ids" open="and id in(" item="id" separator="," close=")">                 #{id}            </foreach>         </if>         <!--<if test="user != null">                 <if test="user.username != null and user.username.length() > 0">                     and username like "%"#{user.username}"%"                 </if>                 <if test="user.sex != null and user.sex.length() > 0">                     and sex = #{user.sex}                 </if>             </if>-->         <include refid="userCondition"/>     </where></select><!--     sql標(biāo)簽:用于定義一個(gè)sql片段     include標(biāo)簽:什么時(shí)候要引用某個(gè)SQL片段,就使用include標(biāo)簽     注意:引入SQL片段之后,最終的SQL語(yǔ)句必須要完全符合語(yǔ)法     --><sql id="selUser">select * from user</sql><sql id="userCondition">     <if test="user != null">         <if test="user.username != null and user.username.length() > 0">             and username like "%"#{user.username}"%"        </if>         <if test="user.sex != null and user.sex.length() > 0">             and sex = #{user.sex}        </if>     </if></sql>
登錄后復(fù)制

  • 在測(cè)試類里加測(cè)試方法

    @Test     public void testSearch3(){         QueryVO vo = new QueryVO();         vo.setIds(new Integer[]{41,42,43,44,45});          // User user = new User();         // user.setUsername("王");         // user.setSex("男");         // vo.setUser(user);          List<User> userList = userDao.search3(vo);         userList.forEach(System.out::println);     }
登錄后復(fù)制

推薦學(xué)習(xí):mysql視頻教程

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产探花在线观看视频| 蜜桃视频成人在线观看| 欧美深夜福利视频| 精品视频在线观看一区二区| 亚洲一区二区三区观看| 99蜜桃臀久久久欧美精品网站| wwwjizzjizzcom| 亚洲av首页在线| 久久久久久久久影视| 国产一级片91| 男人添女人下部高潮视频在观看| 国产精品一二三在线观看| 2021狠狠干| 高清欧美精品xxxxx| 国产成人无码a区在线观看视频| 女人被男人躁得好爽免费视频| 国产一区二区三区小说| 男女视频网站在线观看| 精品久久久久久中文字幕2017| 亚洲三级视频网站| 91香蕉国产线在线观看| 国产毛片久久久久久国产毛片| 日本一道在线观看| av动漫在线观看| 污视频网站观看| 蜜臀av性久久久久蜜臀av| 国产免费黄色一级片| av免费网站观看| 熟妇熟女乱妇乱女网站| 天堂…中文在线最新版在线| 日日碰狠狠添天天爽超碰97| 久热精品在线播放| 亚洲乱码日产精品bd在线观看| 日本网站免费在线观看| 99re精彩视频| 国产高清av在线播放| 激情 小说 亚洲 图片: 伦| 9l视频自拍9l视频自拍| 黄色国产精品视频| wwwjizzjizzcom| av免费网站观看| 成年在线观看视频| 91制片厂毛片| 日韩中文字幕在线视频观看| 波多野结衣激情| 91激情视频在线| 黄色一级视频在线播放| 在线播放免费视频| 成人一区二区三| 国产二区视频在线| 亚洲小说欧美另类激情| 欧洲熟妇精品视频| aa在线免费观看| 国产精品无码电影在线观看| 九色91popny| 久久网站免费视频| 久草视频这里只有精品| 男人天堂成人网| 日韩av加勒比| www.se五月| 一区二区三区四区毛片| 国产精品久久久毛片| 国产视频在线视频| 欧美一级黄色片视频| 日批视频在线免费看| 131美女爱做视频| 日韩亚洲欧美视频| 日本在线xxx| www..com日韩| 久久免费视频3| 欧美aⅴ在线观看| 欧美日韩中文在线视频| avav在线看| 欧美伦理片在线看| 一区二区在线免费看| 色18美女社区| 免费cad大片在线观看| 福利在线一区二区| 91成人在线观看喷潮教学| www..com日韩| 玩弄japan白嫩少妇hd| 国产九九在线视频| 午夜激情影院在线观看| 97在线免费视频观看| 成人黄色av片| 国产又大又黄又猛| 91香蕉视频免费看| 真人抽搐一进一出视频| 不卡影院一区二区| 国产成人在线综合| 69sex久久精品国产麻豆| 欧美日韩亚洲第一| 五月六月丁香婷婷| 免费看一级大黄情大片| 一级特黄性色生活片| 天堂在线精品视频| 极品美女扒开粉嫩小泬| 欧美婷婷精品激情| 欧美一级爱爱视频| 北条麻妃av高潮尖叫在线观看| 天堂av手机在线| 18禁网站免费无遮挡无码中文 | 亚洲欧美一二三| 一区二区传媒有限公司| 999热精品视频| 91视频最新入口| 美女在线免费视频| 欧美xxxxx在线视频| 国产高清不卡无码视频| 欧美黄色一级片视频| 中文字幕乱码免费| 免费大片在线观看| 男女猛烈激情xx00免费视频| 亚洲欧美自偷自拍另类| 18禁网站免费无遮挡无码中文 | 色一情一乱一乱一区91| 成年人视频在线免费| 国产成人永久免费视频| 久久精品一卡二卡| 亚洲第一中文av| 99精品在线免费视频| 2022中文字幕| 天天做天天爱天天高潮| 中文字幕免费高清在线| 尤蜜粉嫩av国产一区二区三区| 红桃一区二区三区| 99久re热视频精品98| 亚洲第一页在线视频| 色国产在线视频| 在线观看的毛片| 波多野结衣天堂| wwwwww.色| 亚洲精品视频导航| 日韩大片一区二区| 最新国产黄色网址| 粉色视频免费看| 亚洲色图欧美自拍| 婷婷视频在线播放| 桥本有菜av在线| 国产乱子伦精品视频| 岛国大片在线播放| 少妇av一区二区三区无码| 亚洲熟妇av一区二区三区漫画| 日韩国产欧美亚洲| 国产裸体舞一区二区三区| 亚洲色图38p| 国产成人在线综合| 91制片厂免费观看| 欧美这里只有精品| 中国丰满人妻videoshd | 26uuu成人| www.国产亚洲| av天堂永久资源网| 三上悠亚在线一区二区| 九九热视频免费| 国产精品一色哟哟| 欧美视频在线播放一区| 欧美一级特黄a| av电影一区二区三区| 国产中文字幕二区| 九九热精品国产| 国产妇女馒头高清泬20p多| 天天操天天爽天天射| 亚洲无在线观看| 国产在线播放观看| 91国内在线播放| 国产黄页在线观看| 亚洲精品视频三区| 日本三级免费网站| 成年人黄色在线观看| 国产成人在线免费看| 五月天国产视频| 国产第一页视频| 大地资源网在线观看免费官网| 日韩在线综合网| 日韩最新中文字幕| 免费黄色一级网站| 老太脱裤让老头玩ⅹxxxx| 日本精品一区在线| 亚洲第一中文av| 国产美女网站在线观看| 国产人妻互换一区二区| www.夜夜爽| 久久九九国产视频| 波多野结衣乳巨码无在线| 免费看av软件| 五月天视频在线观看| 青青草原av在线播放| 777av视频| 99er在线视频| 日本美女爱爱视频| 中文字幕综合在线观看| 天天影视色综合| www.se五月| 天堂av在线8| 亚洲va综合va国产va中文| 欧美黄色一级片视频| 虎白女粉嫩尤物福利视频| 91传媒久久久| 免费观看成人网|