20220629_MyBatis_数据库增删改查练习(二)

本篇为动态sql查询
当用户输入的信息只提供一个条件时,使用动态sql查询
在映射文件里,直接使用if和where标签实现动态

    <select id="selByCond" resultMap="brand_resultMap">
        select *
        from 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>

执行代码中用map集合,只传入中间一个条件

 @Test
    public void selByCond() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqs = sqlSessionFactory.openSession();

        BrandMapper mapper = sqs.getMapper(BrandMapper.class);
        /**
         * 本次将参数提前写在前面
         * 因为条件有like模糊查询,所以参数也要模糊处理
         */
        int status = 1;
        String companyName = "huawei";
        String brandName = "huawei";
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        /**
         * 封装成对象或map集合的方式传入参数
         */
        Brand br = new Brand();
        br.setStatus(status);
        br.setCompanyName(companyName);
        br.setBrandName(brandName);

        Map ma = new HashMap<>();
//        ma.put("status",status);
        ma.put("companyName",companyName);
//        ma.put("brandName",brandName);

        /**三种方法都可以*/
//        List<Brand> rs = mapper.selByCond(status, companyName, brandName);
//        List<Brand> rs = mapper.selByCond(br);
        List<Brand> rs = mapper.selByCond(ma);

        for (Brand r : rs) {
            System.out.println(r);
        }

        System.out.println();

        sqs.close();

    }

结果中看到预编译语句语法正确,mybatis的标签有自动修正语法的功能
请添加图片描述
接下来做单条件的动态sql查询
先在代理接口里添加方法

List<Brand> selBySingleCond(Brand brand);

在sql映射文件里添加单条件查询的动态sql语句
本例可用otherwise标签,或where标签包裹,解决一个参数中一个条件都不传入的问题

    </select>
    <select id="selBySingleCond" resultMap="brand_resultMap">
        select *
        from brand
        <where>
            <choose>
                <when test="status != null">
                    status = #{status}
                </when>
                <when test="companyName != null and companyName != ''">
                    company_name like #{companyName}
                </when>
                <when test="brandName != null and brandName != ''">
                    brand_name like #{brandName}
                </when>
                <!--<otherwise>
                    where 1 = 1
                </otherwise>-->
            </choose>
        </where>

    </select>

执行代码

    @Test
    public void selBySingleCond() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqs = sqlSessionFactory.openSession();

        BrandMapper mapper = sqs.getMapper(BrandMapper.class);

        int status = 1;
        String companyName = "huawei";
        String brandName = "huawei";
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        Brand br = new Brand();
//        br.setStatus(status);
//        br.setCompanyName(companyName);
//        br.setBrandName(brandName);

        List<Brand> rs = mapper.selBySingleCond(br);

        for (Brand r : rs) {
            System.out.println(r);
        }

        System.out.println();

        sqs.close();

    }

在运行结果中观察预编译的sql语句,看otherwise和where标签的效果,略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值