Java自学之mybatis:动态SQL之if标签
学习目的:学会使用if标签,以及理解其作用和好处。
Part 1
在Product.xml中新增两条select:
<select id="listAllProduct" resultType="Product">
select * from product_
</select>
<select id="listProductByName" resultType="Product">
select * from product_ where name like concat('%',#{name},'%')
</select>
listAllProduct可以查询出product_表中的所有数据;listProductByName利用传入的name进行模糊查询。
Part 2
测试代码块:
/**
* 查询所有的Product
* @param session
*/
public static void listAllProduct(SqlSession session){
List<Product> products = session.selectList("listAllProduct");
System.out.println("查询所有的");
for (Product p :
products) {
System.out.println(p);
}
}
/**
* 模糊查找
* @param session
*/
public static void listProductByName(SqlSession session){
Map<String,Object> map = new HashMap<>();
map.put("name","a");
List<Product> products = session.selectList("listProductByName",map);
System.out.println("模糊查找");
for (Product p :
products) {
System.out.println(p);
}
}
测试结果:
Part 3
由于product_表的字段比较少,一旦字段名很多,以不同的字段进行查询就要配置很多的select,不便于维护,这个时候使用mybatis动态SQL里的if标签就可以很好解决这个问题。
如果没有传参数name,那么就执行查询所有,否则就进行模糊查询,此时只需要调用同一个select就可以实现。
Product.xml配置如下(加粗部分):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybaits.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.vaefun.pojo">
<resultMap id="productBean" type="Product">
<id column="pid" property="id"/>
<result column="pname" property="name"/>
<result column="price" property="price"/>
<!-- 多对一的关系-->
<!-- property:属性名称-->
<!-- javatype:属性的类型-->
<association property="category" javaType="Category">
<id column="cid" property="id"/>
<result column="cname" property="name"/>
</association>
</resultMap>
<select id="listProduct" resultMap="productBean">
select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname'
from category_ c
left join product_ p on c.id = p.cid
</select>
<select id="getProduct" resultMap="productBean">
select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname'
from category_ c
left join product_ p on c.id = p.cid
where p.id = #{id}
</select>
<select id="listAllProduct" resultType="Product">
select * from product_
<if test="name!=numm">
where name like concat('%',#{name},'%')
</if>
</select>
<!-- <select id="listProductByName" resultType="Product">-->
<!-- select * from product_ where name like concat('%',#{name},'%')-->
<!-- </select>-->
</mapper>
未来所需要查询的字段增加,可以继续添加if标签(在Java自学之mybatis:动态SQL的where、set、trim标签一文中会说具体应该怎么添加)。
Part 4
测试代码块:
/**
* 查询所有的Product
* @param session
*/
public static void listAllProduct(SqlSession session){
List<Product> products = session.selectList("listAllProduct");
System.out.println("查询所有的");
for (Product p :
products) {
System.out.println(p);
}
}
/**
* 模糊查找
* @param session
*/
public static void listProductByName(SqlSession session){
Map<String,Object> map = new HashMap<>();
map.put("name","a");
List<Product> products = session.selectList("listAllProduct",map);
System.out.println("模糊查找");
for (Product p :
products) {
System.out.println(p);
}
}
可见上面的代码块和part 2中的代码块只是 List<Product> products = session.selectList("listAllProduct",map);中调用的select不同而已。尽管本次使用的同一个select,但是查询结果完全一样,如下:

浙公网安备 33010602011771号