Mybatis框架篇章八

举报
兰舟千帆 发表于 2022/07/21 18:11:29 2022/07/21
【摘要】 动态sql查询 多条件查询 用if标签之前我们的多条件查询是在给出所有条件的基础上对数据进行查询。但是如果用户不是输入全部的条件的话,或者只是根据几个数据来匹配一些数据,那么就需要灵活多变。我们可以用到if标签,我们先用if标签在sql映射文件中我们这样写<select id="selectByDynamicCondition" resultMap="brandResultMap"> ...

动态sql查询

多条件查询

用if标签

之前我们的多条件查询是在给出所有条件的基础上对数据进行查询。但是如果用户不是输入全部的条件的话,或者只是根据几个数据来匹配一些数据,那么就需要灵活多变。

我们可以用到if标签,我们先用if标签
在sql映射文件中我们这样写

<select id="selectByDynamicCondition" resultMap="brandResultMap">
        select *
        from tb_brand
            where
        <if test="status!=null">
            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>


    </select>

然后接口类中写入

  List<Brand> selectByDynamicCondition(Map map);

在测试类中写入

        int status = 1;
//        模糊查询
        String companyName = "华为";
        String brandName  = "华为";
//        处理参数

        companyName = "%"+companyName+"%";
        brandName= "%"+brandName+"%";
        //将参数封装对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);
////        //获取SqlSessionFactory
        Map map = new HashMap<>();
        map.put("status",status);
//        map.put("companyName",companyName);
        map.put("brandName",brandName);
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取Mapper接口代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands = brandMapper.selectByDynamicCondition(map);
        System.out.println(brands);

我们没有加入companyName,但是我们还是可以根据已有的条件得到结果。

在这里插入图片描述

我们最终在运行时自动拼接到的sql语句为

 select * from tb_brand where # where 1=1 status = ? and brand_name like ? 
 

但是需要注意的是,我们注意观察。如果我不添加status条件的话,是会出现问题。什么问题?现在我们不添加status条件然后运行一下,可以看看提示的信息。
在这里插入图片描述
截取下来就是

 Preparing: select * from tb_brand where  and brand_name like ? 

我们知道这样拼接后的结果就是一条错误的语句
所以我们不可能得到正确的结果。那么我们还有什么其他的方法解决这种问题

可以添加这么一句写成这样

   <select id="selectByDynamicCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where 1=1
        <if test="status!=null">
            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>


    </select>

然后运行

在这里插入图片描述
你看这样运行拼接的sql语句

 Preparing: select * from tb_brand where 1=1 and brand_name like ? 

对的这样可以解决,但是存在的问题就是如果我的status再次添加上了,这条语句还是会出现问题,所以这样是不太灵活的。我们·尝试下面的方式

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。