Mybatis中Like的三种使用解读

 更新时间:2023年09月28日 09:19:49   作者:weixin_43831204  
这篇文章主要介绍了Mybatis中Like的三种使用解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

方式一

在Mybatis中的第一种写法:

 <!--有sql注入问题-->
 <select id="findUserByLikeName1" parameterType="java.lang.String" resultMap="user">
      select * from t_user where name like '%${name}%'
  </select>

这种会有sql注入的问题,需要明白在 Mybatis中 $ # 使用的区别。这种写法也不能加 jdbcType=VARCHAR ,否则也会报错。

做了个简单的测试:

@Test
public void findUserByLikeName1(){
    List<User> test = userMapper.findUserByLikeName1("Cloud");
    //select * from t_user where name like '%Cloud%'
    System.out.println(test.size());// 查出一条
    List<User> 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中的第二种写法:

 <!--直接在代码中拼接%, 不存在sql注入-->
 <select id="findUserByLikeName2" parameterType="java.lang.String" resultMap="user">
      select * from t_user where name like #{name,jdbcType=VARCHAR}
  </select>

在代码中加上 %

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

这种方式在一些项目中也会看到。

如果没有使用如Mybatis等ORM框架,直接写sql查询就这样拼接了。

方式三

在Mybatis中的第三种写法:

 <!--concat Mysql和 Oracle区别 ,不存在sql注入-->
  <select id="findUserByLikeName3" parameterType="java.lang.String" resultMap="user">
      select * from t_user where name like concat('%',#{name,jdbcType=VARCHAR},'%')
  </select>

测试:

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

在实际开发中推荐使用这种方式。

小注意:

当使用方式三的时候,如果查询的关键字就是 % ,那情况会是什么? 初始化数据中 name 有9条数据中包含 %

查询的sql如下:

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

查出来全部的数据,并不是只包含了 % 的数据,如果查询 _ 也是一样的。

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

①在代码中进行转义

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

②使用 ESCAPE

<select id="findUserByLikeName4" parameterType="java.lang.String" resultMap="user">
select * from t_user where name like concat('%',#{name,jdbcType=VARCHAR},'%') ESCAPE '/'
</select>

测试:

@Test
public void findUserByLikeName4(){
    // replaceAll("%", "/%").replaceAll("_", "/_")
    String name = "%";
    List<User> test = userMapper.findUserByLikeName4(name);
    System.out.println(test.size());// 查到全部
    List<User> test1 = userMapper.findUserByLikeName4("/" +name);
    System.out.println(test1.size());//查到匹配%的记录
}

这两种本质都是对查询的关键字进行了处理,这种处理在代码中可以使用拦截器或者AOP等技术统一处理。

总结

推荐使用第三种方式进行模糊查询。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java组件javabean用户登录实例详解

    Java组件javabean用户登录实例详解

    这篇文章主要为大家详细介绍了Java组件javabean用户登录实例,内容有用户登录,注册和退出等,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • java设计模式(实战)-责任链模式

    java设计模式(实战)-责任链模式

    这篇文章主要介绍了java设计模式(实战)-责任链模式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringBoot如何使用Fastjson解析Json数据

    SpringBoot如何使用Fastjson解析Json数据

    这篇文章主要介绍了SpringBoot如何使用Fastjson解析Json数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java构造函数的相互调用代码示例

    Java构造函数的相互调用代码示例

    这篇文章主要介绍了Java构造函数的相互调用代码示例,分享了两段代码示例,通过this关键字实现对的构造函数的调用,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java常用类之System类的使用指南

    Java常用类之System类的使用指南

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。本文将通过示例为大家详细讲讲System类的使用,需要的可以参考一下
    2022-07-07
  • Java中的自动拆装箱、基本类型的转换、包装类的缓存详解

    Java中的自动拆装箱、基本类型的转换、包装类的缓存详解

    文章详细介绍了Java中数据类型的拆装箱、自动拆箱和装箱,以及包装类的缓存机制,包括基本数据类型的容量大小、转换规则和自动类型转换等
    2024-12-12
  • java nio基础使用示例

    java nio基础使用示例

    传统的io技术为阻塞的,java新nio是非阻塞的,注册一个op_read事件,注册到selector对象上,当有数据到来时候,selector回通知之前注册事件的对象,进行read处理,看面我看看它是如何使用的
    2013-11-11
  • Spring Boot中数据库操作Druid和HikariDataSource的详细过程

    Spring Boot中数据库操作Druid和HikariDataSource的详细过程

    这篇文章主要介绍了Spring Boot中数据库操作Druid和HikariDataSource的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • SharedWorkerGlobalScope属性数据共享示例解析

    SharedWorkerGlobalScope属性数据共享示例解析

    这篇文章主要为大家介绍了SharedWorkerGlobalScope属性数据共享示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    这篇文章主要介绍了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论