我們經(jīng)常會(huì)遇到如上圖所示的多條件查詢,將多條件查詢的結(jié)果展示在下方的數(shù)據(jù)列表中。而我們做這個(gè)功能需要分析最終的SQL語(yǔ)句應(yīng)該是什么樣,思考兩個(gè)問(wèn)題
- 條件表達(dá)式
- 如何連接
條件字段 企業(yè)名稱
和 品牌名稱
需要進(jìn)行模糊查詢,所以條件應(yīng)該是:
簡(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é)果如下:
但是它也存在問(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)簽文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-682862.html
- 作用:
- 替換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)!