登陆

Mybaits中Like 的运用方法以及一些留意点

admin 2020-02-14 299人围观 ,发现0个评论

做一个活跃的人

编码、改bug、提高自己

我有一个乐土,面向编程,春暖花开!

含糊查询在项目中仍是常常运用的,本文就简略收拾Mybatis中运用Like进行含糊查询的几种写法以及一些常见的问题。

运用Springboot简略装备一下Mybatis,然后进行阐明。Springboot集成Mybatis这儿就不做介绍了。

初始数据

方法一

在Mybatis中的第一种写法:

 

这种会有sql注入的问题,需求理解在 Mybatis中 $ 和 # 运用的差异。这种写法也不能加jdbcType=VARCHAR,不然也会报错。

做了个简略的测验:

@Test
public void findUserByLikeName1(){
List test = userMapper.findUserByLikeName1("Cloud");
//select * from t_user where name like '%Cloud%'
System.out.println(test.size());// 查出一条
List test1 = userMapper.findUserByLikeName1("' or '1=1");
//select * from t_user where name like '%' or '1=1%'
// 剖析: '1=1%' 建立
System.out.println(test1.size());// 查出了悉数数据
}

留意:排序的字段也简单呈现这个问题,在运用的时分也必定要留意。

order by ${orderBy}

第一种方法在实践开发过程中千万要留意,不要写成这样了。

方法二

在Mybatis中的第二种写法:

 

在代码中加上%。

@Test
public void findUserByLikeName2(){
String name = "Cloud";
List test = userMapper.findUserByLikeName2("%" +name+"%");
// select * from t_user where name like ?
// %Cloud%(String)
System.out.println(test.size());
}

这种方法在一些项目中也会看到。假如没有运用如Mybatis等ORM结构,直接写sql查询就这样拼接了。

方法三

在Mybatis中的第三种写法:

 

测验:

@Test
public void findUserByLikeName3(){
String name = "Cloud";
List test = userMapper.findUserByLikeName3(name);
// select * from t_user where name like concat('%',?,'%')
// Cloud(String)
System.out.println(test.size());
}

在实践开发中引荐运用这种方法。

小留意

当运用方法三的时分,假如查询的关键字便是% ,那状况会是什么? 初Mybaits中Like 的运用方法以及一些留意点始化数据中name有9条数据中包括%。

查询的sql如下:

select * from t_user where name like concat('%','%','%')

查出来悉数的数据,并不是只包括了%的数据,假如查询_也是相同的。

那这种状况肯定是不满足查询需求的,则需求调整。

①在代码中进行转义

@Test
public void findUserByLikeName3(){
String name = "%";
name = name.replaceAll("_", "\\\\_");
name = name.replaceAll("%", "\\\\%");
List test = userMapper.findUserByLikeName3(name);
System.out.println(test.size());
}

②运用ESCAPE


测验:

@Test
public void findUserByLikeName4(){
// replaceAll("%", "/%").replaceAll("_", "/_")
String name = "%";
List test = userMapper.findUserByLik谭元生落马eName4(name);
System.out.println(test.size());// 查到悉数
List test1 = userMapper.findUserByLikeName4("/" +name);
System.out.println(test1.size());//查到匹配%的记载
}

这两种实质都是对查询的关键字进行了处理,这种处理在代码中能够运用拦截器或许AOP等技能一致处理。

小总结

1、不要写方法1的这种含糊查询,简单发生sql注入!

主张运用第三种方法进行含糊查询

2、上面这三种含糊查询,都是运用%关键字%,这种方法是不会走索引的,大数据量时分有查询功率问题

看状况,能够运用全文索引;或许运用ES进行

阐明:网上有一些优化like的查询的,可是亲测后没啥用

3、留意关键词中有%、_这些特别字符怎么处理。

1、事务上不允许输入这些字符,直接过滤(前台、后Mybaits中Like 的运用方法以及一些留意点台过滤)

2、运用上面的ESCAPE或许转义

补白: 因为自己才能有限,文中若有过错之处,欢迎纠正。

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP