国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Mybatis1.4 多條件查詢

這篇具有很好參考價(jià)值的文章主要介紹了Mybatis1.4 多條件查詢。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Mybatis1.4 多條件查詢,java自學(xué)筆記,mybatis,java,數(shù)據(jù)庫(kù)

我們經(jīng)常會(huì)遇到如上圖所示的多條件查詢,將多條件查詢的結(jié)果展示在下方的數(shù)據(jù)列表中。而我們做這個(gè)功能需要分析最終的SQL語(yǔ)句應(yīng)該是什么樣,思考兩個(gè)問(wèn)題

  • 條件表達(dá)式
  • 如何連接

條件字段 企業(yè)名稱品牌名稱 需要進(jìn)行模糊查詢,所以條件應(yīng)該是:

Mybatis1.4 多條件查詢,java自學(xué)筆記,mybatis,java,數(shù)據(jù)庫(kù)

簡(jiǎn)單的分析后,我們來(lái)看功能實(shí)現(xiàn)的步驟:

  • 編寫(xiě)接口方法

    • 參數(shù):所有查詢條件
    • 結(jié)果:List
  • 在映射配置文件中編寫(xiě)SQL語(yǔ)句

  • 編寫(xiě)測(cè)試方法并執(zhí)行

1.4.1 編寫(xiě)接口方法

BrandMapper 接口中定義多條件查詢的方法。

而該功能有三個(gè)參數(shù),我們就需要考慮定義接口時(shí),參數(shù)應(yīng)該如何定義。Mybatis針對(duì)多參數(shù)有多種實(shí)現(xiàn)

  • 使用 @Param("參數(shù)名稱") 標(biāo)記每一個(gè)參數(shù),在映射配置文件中就需要使用 #{參數(shù)名稱} 進(jìn)行占位

    List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName,@Param("brandName") String brandName);
    
  • 將多個(gè)參數(shù)封裝成一個(gè) 實(shí)體對(duì)象 ,將該實(shí)體對(duì)象作為接口的方法參數(shù)。該方式要求在映射配置文件的SQL中使用 #{內(nèi)容} 時(shí),里面的內(nèi)容必須和實(shí)體類屬性名保持一致。

    List<Brand> selectByCondition(Brand brand);
    
  • 將多個(gè)參數(shù)封裝到map集合中,將map集合作為接口的方法參數(shù)。該方式要求在映射配置文件的SQL中使用 #{內(nèi)容} 時(shí),里面的內(nèi)容必須和map集合中鍵的名稱一致。

    List<Brand> selectByCondition(Map map);
    
1.4.2 編寫(xiě)SQL語(yǔ)句

BrandMapper.xml 映射配置文件中編寫(xiě) statement,使用 resultMap 而不是使用 resultType

<select id="selectByCondition" resultMap="brandResultMap">
    select *
    from tb_brand
    where status = #{status}
    and company_name like #{companyName}
    and brand_name like #{brandName}
</select>
1.4.3 編寫(xiě)測(cè)試方法

test/java 下的 com.itheima.mapper 包下的 MybatisTest類中 定義測(cè)試方法

@Test
public void testSelectByCondition() throws IOException {
    //接收參數(shù)
    int status = 1;
    String companyName = "華為";
    String brandName = "華為";

    // 處理參數(shù)
    companyName = "%" + companyName + "%";
    brandName = "%" + brandName + "%";

    //1. 獲取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2. 獲取SqlSession對(duì)象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //3. 獲取Mapper接口的代理對(duì)象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

    //4. 執(zhí)行方法
	//方式一 :接口方法參數(shù)使用 @Param 方式調(diào)用的方法
    //List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
    //方式二 :接口方法參數(shù)是 實(shí)體類對(duì)象 方式調(diào)用的方法
     //封裝對(duì)象
    /* Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setBrandName(brandName);*/
    
    //List<Brand> brands = brandMapper.selectByCondition(brand);
    
    //方式三 :接口方法參數(shù)是 map集合對(duì)象 方式調(diào)用的方法
    Map map = new HashMap();
    map.put("status" , status);
    map.put("companyName", companyName);
    map.put("brandName" , brandName);
    List<Brand> brands = brandMapper.selectByCondition(map);
    System.out.println(brands);

    //5. 釋放資源
    sqlSession.close();
}
1.4.4 動(dòng)態(tài)SQL

上述功能實(shí)現(xiàn)存在很大的問(wèn)題。用戶在輸入條件時(shí),肯定不會(huì)所有的條件都填寫(xiě),這個(gè)時(shí)候我們的SQL語(yǔ)句就不能那樣寫(xiě)的

例如用戶只輸入 當(dāng)前狀態(tài) 時(shí),SQL語(yǔ)句就是

select * from tb_brand where status = #{status}

而用戶如果只輸入企業(yè)名稱時(shí),SQL語(yǔ)句就是

select * from tb_brand where company_name like #{companName}

而用戶如果輸入了 當(dāng)前狀態(tài)企業(yè)名稱 時(shí),SQL語(yǔ)句又不一樣

select * from tb_brand where status = #{status} and company_name like #{companName}

針對(duì)上述的需要,Mybatis對(duì)動(dòng)態(tài)SQL有很強(qiáng)大的支撐:

  • if

  • choose (when, otherwise)

  • trim (where, set)

  • foreach

我們先學(xué)習(xí) if 標(biāo)簽和 where 標(biāo)簽:

  • if 標(biāo)簽:條件判斷

    • test 屬性:邏輯表達(dá)式
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="companyName != null and companyName != '' ">
                and company_name like #{companyName}
            </if>
            <if test="brandName != null and brandName != '' ">
                and brand_name like #{brandName}
            </if>
    </select>
    

    如上的這種SQL語(yǔ)句就會(huì)根據(jù)傳遞的參數(shù)值進(jìn)行動(dòng)態(tài)的拼接。如果此時(shí)status和companyName有值那么就會(huì)值拼接這兩個(gè)條件。

    執(zhí)行結(jié)果如下:
    Mybatis1.4 多條件查詢,java自學(xué)筆記,mybatis,java,數(shù)據(jù)庫(kù)

    但是它也存在問(wèn)題,如果此時(shí)給的參數(shù)值是

    Map map = new HashMap();
    // map.put("status" , status);
    map.put("companyName", companyName);
    map.put("brandName" , brandName);
    

    拼接的SQL語(yǔ)句就變成了

    select * from tb_brand where and company_name like ? and brand_name like ?
    

    而上面的語(yǔ)句中 where 關(guān)鍵后直接跟 and 關(guān)鍵字,這就是一條錯(cuò)誤的SQL語(yǔ)句。這個(gè)就可以使用 where 標(biāo)簽解決

  • where 標(biāo)簽

    • 作用:
      • 替換where關(guān)鍵字
      • 會(huì)動(dòng)態(tài)的去掉第一個(gè)條件前的 and
      • 如果所有的參數(shù)沒(méi)有值則不加where關(guān)鍵字
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="companyName != null and companyName != '' ">
                and company_name like #{companyName}
            </if>
            <if test="brandName != null and brandName != '' ">
                and brand_name like #{brandName}
            </if>
        </where>
    </select>
    

    注意:需要給每個(gè)條件前都加上 and 關(guān)鍵字。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-682862.html

到了這里,關(guān)于Mybatis1.4 多條件查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Mybatis1.6 添加數(shù)據(jù)

    Mybatis1.6 添加數(shù)據(jù)

    如上圖是我們平時(shí)在添加數(shù)據(jù)時(shí)展示的頁(yè)面,而我們?cè)谠擁?yè)面輸入想要的數(shù)據(jù)后添加 提交 按鈕,就會(huì)將這些數(shù)據(jù)添加到數(shù)據(jù)庫(kù)中。接下來(lái)我們就來(lái)實(shí)現(xiàn)添加數(shù)據(jù)的操作。 編寫(xiě)接口方法 參數(shù):除了id之外的所有的數(shù)據(jù)。id對(duì)應(yīng)的是表中主鍵值,而主鍵我們是 自動(dòng)增長(zhǎng) 生成的。

    2024年02月10日
    瀏覽(11)
  • 【Java】Mybatis查詢數(shù)據(jù)庫(kù)返回JSON格式的字段映射到實(shí)體類屬性

    今天遇到了一個(gè)bug,大概就是數(shù)據(jù)庫(kù)(Mysql)中有一個(gè) type 類型字段,數(shù)據(jù)類型為json,大概是這樣的:[“蘋(píng)果”,“香蕉”,“葡萄”]的數(shù)據(jù)格式,這個(gè)bug的問(wèn)題所在呢就是查詢后這個(gè)json格式的數(shù)據(jù)無(wú)法映射到我們實(shí)體類的屬性上,解決方案如下: 實(shí)體類的配置: @TableField

    2024年02月15日
    瀏覽(23)
  • Mybatis1.8 刪除一行數(shù)據(jù)

    Mybatis1.8 刪除一行數(shù)據(jù)

    如上圖所示,每行數(shù)據(jù)后面都有一個(gè) 刪除 按鈕,當(dāng)用戶點(diǎn)擊了該按鈕,就會(huì)將改行數(shù)據(jù)刪除掉。那我們就需要思考,這種刪除是根據(jù)什么進(jìn)行刪除呢?是通過(guò)主鍵id刪除,因?yàn)閕d是表中數(shù)據(jù)的唯一標(biāo)識(shí)。 接下來(lái)就來(lái)實(shí)現(xiàn)該功能。 1.8.1 編寫(xiě)接口方法 在 BrandMapper 接口中定義根據(jù)

    2024年02月11日
    瀏覽(11)
  • Mybatis-puls——條件查詢的三種格式+條件查詢null判定+查詢投影

    Mybatis-puls——條件查詢的三種格式+條件查詢null判定+查詢投影

    在mybatis_plus的封裝中的WrapperT接口參數(shù)就是用于封裝查詢條件? ?在測(cè)試類中啟動(dòng)如上一個(gè)簡(jiǎn)單的查詢,然后控制臺(tái)運(yùn)行會(huì)輸出一大堆無(wú)關(guān)日志,這里先把這些日志關(guān)閉 先新建一個(gè)XML配置文件? ?然后變成如下,這里configuration標(biāo)簽里面什么都沒(méi)有配置就是取消所有日志文件了

    2024年01月18日
    瀏覽(27)
  • MyBatis-Plus條件查詢問(wèn)題解決

    MyBatis-Plus條件查詢問(wèn)題解決

    問(wèn)題描述 系統(tǒng)中有用戶注冊(cè)的功能,但是會(huì)出現(xiàn)重復(fù)注冊(cè)的現(xiàn)象,代碼中有做過(guò)重復(fù)校驗(yàn),但是沒(méi)有生效。 問(wèn)題解決 首先排查數(shù)據(jù)生成時(shí)間點(diǎn)不同,相差時(shí)間有長(zhǎng)有短,不是用戶同時(shí)多次點(diǎn)擊的原因,應(yīng)該是用戶這邊不同時(shí)間重復(fù)多次注冊(cè)導(dǎo)致的,但是程序中防止重復(fù)校驗(yàn)

    2024年02月16日
    瀏覽(27)
  • MyBatis-Plus(三.Wrapper條件查詢)

    MyBatis-Plus(三.Wrapper條件查詢)

    Wrapper是Mybatis-plus中特有的 條件封裝接口 也就是把 查詢的條件 封裝到Wrapper實(shí)現(xiàn)類中 它的各個(gè)實(shí)現(xiàn)類有什么作用呢, 我覺(jué)得直接 顧名思義 吧? QueryWrapper(刪,查) 因?yàn)閰?shù)一般都從前端傳來(lái)的數(shù)據(jù)中得到, 所以必須用條件封裝的第一個(gè)參數(shù)確認(rèn)它不為null UpdateWrapper(改) LambdaQuer

    2024年02月04日
    瀏覽(23)
  • Mybatis Plus之DQL(條件查詢方式、查詢投影、查詢條件設(shè)定、字段映射與表名映射)

    Mybatis Plus之DQL(條件查詢方式、查詢投影、查詢條件設(shè)定、字段映射與表名映射)

    增刪改查四個(gè)操作中,查詢是非常重要的也是非常復(fù)雜的操作,這塊需要我們重點(diǎn)學(xué)習(xí)下,這節(jié)我們主要學(xué)習(xí)的內(nèi)容有: 條件查詢方式 查詢投影 查詢條件設(shè)定 字段映射與表名映射 1.1 條件查詢的類 MyBatisPlus將書(shū)寫(xiě)復(fù)雜的SQL查詢條件進(jìn)行了封裝,使用編程的形式完成查詢條件的

    2024年02月05日
    瀏覽(23)
  • Java企業(yè)級(jí)開(kāi)發(fā)學(xué)習(xí)筆記(2.1)MyBatis實(shí)現(xiàn)簡(jiǎn)單查詢

    零、創(chuàng)建數(shù)據(jù)庫(kù)與表 在Navicat里創(chuàng)建MySQL數(shù)據(jù)庫(kù)testdb 創(chuàng)建用戶表 - t_user CREATE TABLE t_user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) DEFAULT NULL, age int(11) DEFAULT NULL, address varchar(255) DEFAULT NULL, PRIMARY KEY ( id ) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 執(zhí)行SQL語(yǔ)句來(lái)創(chuàng)建用戶表 INSERT IN

    2024年02月09日
    瀏覽(26)
  • Mybatis-plus動(dòng)態(tài)條件查詢QueryWrapper的使用

    Mybatis-plus動(dòng)態(tài)條件查詢QueryWrapper的使用

    queryWrapper是mybatis plus中實(shí)現(xiàn)查詢的對(duì)象封裝操作類,可以封裝sql對(duì)象,包括where條件,order by排序,select哪些字段等等,他的層級(jí)關(guān)系如下圖: 2.1-案例一:根據(jù)name模糊查看未刪除的用戶列表信息 過(guò)濾條件: queryWrapper實(shí)現(xiàn): 2.2-案例二:查看姓李的并且郵箱不為空的用戶列表

    2024年02月14日
    瀏覽(22)
  • Mybatis xml中排序(order by)條件用#{}查詢失敗

    問(wèn)題描述: 處理簡(jiǎn)單分頁(yè)時(shí),發(fā)現(xiàn)從外部傳入的排序條件無(wú)法生效,但程序無(wú)報(bào)錯(cuò),正常返回列表,只是排序條件不對(duì); 原因: #{}表示一個(gè)占位符,當(dāng)#{}傳入的數(shù)據(jù)是一個(gè)字符串時(shí),會(huì)自動(dòng)將傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。 解決方法: 使用${}將傳入的數(shù)據(jù)直接顯示生成在sql中

    2024年01月17日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包