Mybatis模糊查询的三种方法

电脑杂谈  发布时间:2020-04-10 18:29:34  来源:网络整理

c 语言模糊查询_2级c语言准考证查询_c语言函数查询

由于项目需要模糊查询,因此需要使用LIKE子句. LIKE子句需要使用%作为占位符,因此您需要将%与字段值连接在一起. 实现Mybatis的方法可能有以下几种: ①使用$占位符,②使用函数concat,③使用Mybatis动态sql标记,下面将简要介绍前两种用法和缺陷,然后重点介绍简介第三,如何使用以及存在的凹坑.

代码如下:

@Select({"<script>",
          " SELECT * FROM SSS WHERE STATUS=1 ",
           " <if test='keyWord != null'>",
           " AND `NAME` LIKE '%${keyWord}%'",
           " </if>",
           "<if test='roleId != null'>",
           " AND ROLE_ID = #{roleId} ",
           "</if>",
           "</script>"})
   List<SellerDo> querySellers(SellerQuery sellerQuery);

缺点: 使用$作为占位符会导致SQL注入问题,在生产环境中应避免使用

2级c语言准考证查询_c 语言模糊查询_c语言函数查询

使用函数concat

concat是一个函数,由MySQL和Oracle支持,用于字符串连接,并且#可用作占位符以防止SQL注入.

代码如下

@Select({"<script>",
           " SELECT * FROM SSS WHERE STATUS=1 ",
            " <if test='keyWord != null'>",
            " AND `NAME` LIKE concat('%', #{keyWord}, '%')",
            " </if>",
            "<if test='roleId != null'>",
            " AND ROLE_ID = #{roleId} ",
            "</if>",
            "</script>"})
    List<SellerDo> querySellers(SellerQuery sellerQuery);

c 语言模糊查询_c语言函数查询_2级c语言准考证查询

缺点: 一些公司不建议使用功能,因为它们可能会切换. 如果您切换到不支持concat功能的,那将很尴尬.

bind元素可以从OGNL表达式创建变量并将其绑定到上下文. 使用bind标签“封装”一个字段,例如,在上述keyWord字段的每一端添加一个百分号,如下所示:

<bind name="keyWord",value="'%'+keyWord+'%'"/>

可以使用优化模糊查询:

2级c语言准考证查询_c 语言模糊查询_c语言函数查询

@Select({ "<script>",
           " SELECT * FROM SSS WHERE STATUS=1 ",
            "<bind name='keyWord' value=\" '%' + keyWord + '%' \"/>",
            " <if test='keyWord != null'>",
                  " AND `NAME` LIKE #{keyWord}",
            "</if>",
            "<if test='roleId != null'>",
                  " AND ROLE_ID = #{roleId} ",
            "</if>",
            "</script>"})
    List<SellerDo> querySellers(SellerQuery sellerQuery);

此方法比使用$占位符更安全,因为#占位符由PreparedStatement预编译c 语言模糊查询,可以防止SQL注入,即使更改也没有问题. 这是目前最好的方法.

场景: 当映射器方法中只有一个参数并且它是对象类型时,可以在不使用@Param批注的情况下声明变量,否则必须使用@Param批注. 这里我也以上面的示例为例c 语言模糊查询,即使querySellers方法只有一个变量并且是Java Bean类型,我也可以使用@Param装饰,代码如下:

@Select({ "<script>",
           " SELECT * FROM SSS WHERE STATUS=1 ",
            "<bind name='query.keyWord' value=\" '%' + query.keyWord + '%' \"/>",
            " <if test='query.keyWord != null'>",
                  " AND `NAME` LIKE #{query.keyWord}",
            "</if>",
            "<if test='query.roleId != null'>",
                  " AND ROLE_ID = #{query.roleId} ",
            "</if>",
            "</script>"})
    List<SellerDo> querySellers(@Param("query") SellerQuery sellerQuery);

2级c语言准考证查询_c语言函数查询_c 语言模糊查询

通话代码和测试代码:

  @Service
public class SellerServiceImpl implements SellerService {
    @Autowired
    private SellerDoMapper sellerDoMapper;
    @Override
    public void querySellers(SellerQuery sellerQuery) {
        sellerDoMapper.querySellers(sellerQuery)
                .forEach(System.out::println);
    }
}
---------------------------------------------------------------------
@SpringBootTest
public class SellerServiceTest {
    @Autowired
    private SellerService sellerService;
    @Test
    public void querySellers() {
        SellerQuery sellerQuery = new SellerQuery();
        sellerQuery.setKeyWord("nihao");
        // roleId 有值,注意
        sellerQuery.setRoleId(4L);
        sellerService.querySellers(sellerQuery);
    }
}

执行测试代码,打印如下:

绑定标签坑图

这个问题困扰了我几个小时. 原因将在下一个主题中进行讨论,该主题将涉及Mybatis的底层. 解决方案是不添加@Param批注. 这是我目前的解决方案.

本文介绍了三种使用Mybatis开发模糊查询的方法,并分别介绍了它们的用法和缺点. 您可以根据自己的业务需求进行选择. 阅读后喜欢它.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-170883-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 张衡
        张衡

        马云个数学都考不及格的主儿随便说几句话那么就当回事来听

      热点图片
      拼命载入中...