jq给标签动态添加id_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);
        }
    }

测试结果:

e77e62dcc38fc9a07b8d5084e1ef334e.png

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,但是查询结果完全一样,如下:

fdb93bdc74c324a4f5deee01e84555d6.png
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页