这里写了一个带条件的动态模糊查询,大家首先联想的是不是当这个查询为空得判断是否为空?用if标签来判断
select a.id,
a.billcode,
a.productname,
a.totalprice,
a.ispayment,
a.creationdate,
b.proname
from smbms_bill a
inner join smbms_provider b on a.providerid = b.id
where 1=1
and a.productname like '%${qname}%'
and b.proname=#{qid}
and a.ispayment=#{ispay}
if标签表示判断,如果符合条件,则执行条件内容
这里的qname,qid,ispay是通过接口中的方法用Hashmap集合存的
HashMap
我们只知道键是String类型,并不知道值是什么类型。所以定义一个Object
然后servlet中存的map.put("qname", "%"+queryProductName+"%");
//map.put("qname", queryProductName);
map.put("qid", queryProviderId);
map.put("ispay",queryIsPayment );
然后用where+if标签代替
and a.productname like #{qname} 注意这里的两个%%在servlet已经完成拼接
and b.proname=#{qid}
and a.ispayment=#{ispay}
where标签,表示条件的连接符.如果判断条件都不成立的时候,自动把where关键字去掉
如果成立的时候,会自动的把where 关键字后面的and连接符去掉
然后在利用trim标签代替
trim表示去掉多余的指定的字符,prefix表示前缀,suffix表示后缀,suffixOverrides去除字段之后的指定字符
prefixOverrides去除字段之前的指定字符
set标签 ,选择性修改。
update smbms_bill
billcode=#{billcode},
productname=#{productname},
productunit=#{productunit},
productcount=#{productcount},
totalprice=#{totalprice},
ispayment=#{ispayment}
Foreach标签,适用于批量查询和批量删除 (查询与删除同理)
注意:使用foreach,接口的参数类型有两种,第一种是list集合,第二种是数组array类型。
这里使用的是第二种数组List
然后在使用另一种list集合
//批量查询
public List selectProdcutByForeach(List pList);
<select id="selectProdcutByForeach" parameterType="java.util.List" resultType="product"> select <include refid="basesql"/> from product <where> id in <foreach collection="list" open="(" item="aid" separator="," close=")"> #{aid} foreach> where> select> |
Choose标签(不建议使用)
Choose+when+otherwise联合使用
当有一个when条件成立的时候则执行,那么之后的when条件不管成立与否均不在执行
当所有的when条件都不成立的时候,则执行otherwise条件
<select id="selectProductBySearchdong" parameterType="product" resultType="product">
select
<include refid="basesql"/>
from product
<where>
<choose>
<when test="price>0">
and price=#{price}
when>
<when test="name!=null">
or name like '%${name}%'
when>
<otherwise>
and description=#{description}
otherwise>
choose>
where>
select>