mybatis像JAVA一样,也有条件表达式,例如if, foreach choose when等,使用条件表达式,可以根据不同的条件动态生成SQL语句,可以根据指定的条件进行查询,更新,删除操作。下面的例子我们演示根据商品编码和商品名称进行查询,如果商品编码不为空,我们根据商品编码进行查询。
1. if条件表达式
<!-- 根据SKU名称和编码进行查询 -->
<select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s where 1=1
<if test="SkuName!=null and SkuName!=''">
and SkuName like #{SkuName}
</if>
<if test="SkuCode!='' and SkuCode!=null">
and SkuCode=#{SkuCode}
</if>
</select>
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s WHERE s.SkuCode='00002'
@RequestMapping(value="getSkuByCondition")
public String getSkuByCondition()
{
String resource = "/conf.xml";
//加载mybatis的配置文件
InputStream inputstream =this.getClass().getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
SqlSession session = sessionFactory.openSession();
String statesql= "mapping.skusMapper.getSkuByCondition";//在skusMapper.xml中有命名空间+方法名
skus sku=new skus();
sku.setSkuCode("00002");//根据商品编码查询
java.util.List<skus> listResult= session.selectList(statesql,sku);
session.close();
for(dto.skus item:listResult)
{
System.out.println(item.getId()+"--"+item.getSkuCode()+"--"+item.getSkuName());
}
return "index";
}
此时生成的sql语句为
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s WHERE s.SkuCode='00002'
上面的例子通过where 1=1保证SQL语句能正常执行,如果我们不加
where 1=1,在根据商品编码进行查询的时候,SQL就会报错。在没有where 1=1的情况下,我们可以通过where 关键字来解决问题,如下
2. Where关键字
<!-- 根据SKU名称和编码进行查询 -->
<select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s
<where>
<if test="SkuName!=null and SkuName!=''">
and SkuName like #{SkuName}
</if>
<if test="SkuCode!='' and SkuCode!=null">
and SkuCode=#{SkuCode}
</if>
</where>
</select>
当然,我们也可以使用trim关键字达到同样的效果,
3. Trim关键字
trim 关键字有以下四个重要属性
prefix 前缀关键字 ,prefixOverrides前缀关键字判断条件
suffix 后缀关键字 suffixOverrides后缀关键字判断条件
<!-- 根据SKU名称和编码进行查询 -->
<select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s
<trim prefix="WHERE" prefixOverrides="AND |OR " >
<if test="SkuName!=null and SkuName!=''">
and SkuName like #{SkuName}
</if>
<if test="SkuCode!='' and SkuCode!=null">
and SkuCode=#{SkuCode}
</if>
</trim>
</select>
上面的配置表示前缀关键字是where ,但是条件中必须有AND或者OR的时候才添加
mybatis中还有另一种条件表达式。
4. choose、when、otherwise
<!-- 根据SKU名称和编码进行查询 -->
<select id="getSkuByCondition" parameterType='dto.skus' resultType='dto.skus'>
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s
<trim prefix="WHERE" prefixOverrides="AND |OR " >
<choose>
<when test="SkuName!=null and SkuName!=''">
and SkuName like #{SkuName}
</when>
<when test="SkuCode!='' and SkuCode!=null">
and SkuCode=#{SkuCode}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</trim>
</select>
5. set关键字
set关键字主要用来进行更新操作。
<update id="updateConditon" parameterType='dto.skus'>
UPDATE skus
<set>
skuname=#{SkuName}
</set>
where skucode=#{SkuCode}
</update>
@RequestMapping(value="updateConditon")
public String updateConditon()
{
String resource = "/conf.xml";
//加载mybatis的配置文件
InputStream inputstream =this.getClass().getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
SqlSession session = sessionFactory.openSession();
String statesql= "mapping.skusMapper.updateConditon";//在skusMapper.xml中有命名空间+方法名
skus sku=new skus();
sku.setSkuName("黑色手表男士款式,经典系列限量版本");
sku.setSkuCode("00002");
int result = session.update(statesql, sku);
session.commit();
session.close();
System.out.println(result);
return "index";
}
6.foreach关键字
foreach主要用于循环动态生成SQL,有以下几个属性
collection:循环的集合
index:索引
item:集合元素
open:开始符号
close:结束符号
separator:分隔符
<!-- 根据SKU名称和编码进行查询 -->
<select id="getSkuByCondition" resultType='dto.skus'>
SELECT s.Id,s.SkuName,s.SkuCode FROM skus s where s.id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
${item}
</foreach>
</select>
@RequestMapping(value="getSkuByCondition")
public String getSkuByCondition()
{
String resource = "/conf.xml";
//加载mybatis的配置文件
InputStream inputstream =this.getClass().getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
SqlSession session = sessionFactory.openSession();
String statesql= "mapping.skusMapper.getSkuByCondition";//在skusMapper.xml中有命名空间+方法名
/*skus sku=new skus();
sku.setSkuCode("00002");//根据商品编码查询
*/
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
java.util.List<skus> listResult= session.selectList(statesql,list);
session.close();
for(dto.skus item:listResult)
{
System.out.println(item.getId()+"--"+item.getSkuCode()+"--"+item.getSkuName());
}
return "index";
}
下载 http://download.csdn.net/detail/zx13525079024/9546053