
由于项目需要模糊查询,因此需要使用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注入问题,在生产环境中应避免使用

使用函数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);

缺点: 一些公司不建议使用功能,因为它们可能会切换. 如果您切换到不支持concat功能的,那将很尴尬.
bind元素可以从OGNL表达式创建变量并将其绑定到上下文. 使用bind标签“封装”一个字段,例如,在上述keyWord字段的每一端添加一个百分号,如下所示:
<bind name="keyWord",value="'%'+keyWord+'%'"/>
可以使用

@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);

通话代码和测试代码:
@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
马云个数学都考不及格的主儿随便说几句话那么就当回事来听