页面有个功能 为 根据 品牌名进行 关键字查询,对应到数据库的是brand表的name字段的模糊查询

如果用的是SSM框架,在mybatis中我们需要自己写sql语句,涉及到like的模糊查询,mybatis中我们通常会使用#{}或${}来获取pojo对象的变量值。

这两个区别为   #{} 会在 变量外侧 加上 单引号  如   select * from brand where name='牌1'

${} 并不会 加单引号   如 select * from brand where name=牌1  显然这样会有问题。所有通常我们用${}需自己加上单引号 如 '${name}' 。

但我们应尽量避免使用 ${} ,因为这个最终会将参数拼接到 sql语句上,存在sql注入的问题。但#{}不会,#{}类似于 hibernate中的    select * from brand where name=:name     然后再通过 query.setParameter('参数名',参数值)这种方式。

但是在 模糊查询中 会出现一个问题, 模糊查询通常都是 与 % 配合使用,  所以我们最终想要的结果是如下这种

select * from brand where name like '%牌%' , 也就是说 我们需要将 两个百分号 与 ‘牌’ 这个字进行字符串拼接。

有人会 想到 用   '%${name}%'  用这种方式,但是这种方式并不好,上面说了,有sql注入的风险。

我们可以采用 and name like concat('%',#{name},'%') 这种方式来进行字符串拼接。

还有一个要说的是,我们在 mybatis 维护sql的 配置文件中。 肯定会判断 <if test="name!=null">   即 name这个变量是否为空。 但是如果这个对象 为 空字符串 就会大大影响我们查询的效率。

如下所示

可以看到,我们依旧可以将数据查询出来,但是加了一个模糊查询的条件,这样就降低了查询的效率。

这种情况往往出现在 用户 没有输入 关键字就点击了搜索按钮,这样传到后端的就是一个 空字符串,这里需要注意,当第一次进入这个页面的时候 传到后端的 参数为null。如下图所示

还有一个要说的是,我们在 mybatis 维护sql的 配置文件中。 肯定会判断 <if test="name!=null">   即 name这个变量是否为空。 但是如果这个对象 为 空字符串 就会大大影响我们查询的效率。

如下所示

可以看到,我们依旧可以将数据查询出来,但是加了一个模糊查询的条件,这样就降低了查询的效率。

这种情况往往出现在 用户 没有输入 关键字就点击了搜索按钮,这样传到后端的就是一个 空字符串,这里需要注意,当第一次进入这个页面的时候 传到后端的 参数为null。如下图所示

所以为了不影响  数据库的查询效率,我们需要 在 controller层 对 空字符串做一下处理。

如果 为空字符串 我们将其设置 为null

StringUtils 是一个 工具包,如果你也想使用 可以在maven中 添加 如下jar包

        <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
 

mybatis中模糊查询的使用以及一些细节问题的注意事项的更多相关文章

  1. MyBatis中模糊查询

    接口 // 模糊查询 List<User> getUserLike(String value); Mapper.xml文件 <!-- 模糊查询 --> <select i ...

  2. mybatis中模糊查询的方式

    <!--Mapper.xml中如何进行模糊查询--> <sql id="brand_columns"> id, name, firstChar,brandN ...

  3. Mybatis中模糊查询的各种写法

    1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} ...

  4. 【mybaits】Mybatis中模糊查询的各种写法

    工作中用到,写三种用法吧,第四种为大小写匹配查询 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{t ...

  5. Mybatis中模糊查询的各种写法(转)

    . sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%');或者 <if test ...

  6. 在mybatis中模糊查询有三种写法

    <select id="selectStudentsByName" resultType="Student"> <!--第一种-->  ...

  7. MyBatis实现模糊查询的几种方式

    在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: ...

  8. Mybatis的模糊查询以及自动映射

    Mybatis的模糊查询 1.  参数中直接加入%% ? 1 2 3 4 5 6 7 8 9 param.setUsername("%CD%");       param.setP ...

  9. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

随机推荐

  1. MySQL 查询优化简记

    今天尝试对一张MySQL表做查询优化, 500W数据 但是发现加了索引比不加索引使用全表扫描还慢, 上网查, 据说是因为需要回表, 因为没有用到 using index(覆盖索引), 而回表查询是随机 ...

  2. SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务

    原文地址:https://www.cnblogs.com/allalongx/p/8477368.html 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduli ...

  3. iOS开发-类簇(Class Cluster)

    类簇(Class  Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也可以称之为类簇的公共类,每个具体类的接口有公共类的接口抽象化,并隐藏在簇的内部.这些类一般不能够直 ...

  4. RxJava【变换】操作符 map flatMap concatMap buffer MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 【Spark】SparkStreaming-foreachrdd foreachpartition

    SparkStreaming-foreachrdd foreachpartition foreachrdd foreachpartition_百度搜索 SparkStreaming之foreachRD ...

  6. unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题

    最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏 ...

  7. 【math】梯度下降法(梯度下降法,牛顿法,高斯牛顿法,Levenberg-Marquardt算法)

    原文:http://blog.csdn.net/dsbatigol/article/details/12448627 何为梯度? 一般解释: f(x)在x0的梯度:就是f(x)变化最快的方向 举个例子 ...

  8. 将iPhone投影到Mac上

    将iPhone投影到Mac上 有时候, 出于演示须要, 又或者嫌弃iPhone屏幕太小了, 我想把画面弄到mac上. 这时候, 就须要将iPhone投影到Mac上. 至于怎样做呢? 这就是本文要说明的 ...

  9. Linux网络编程:基于UDP的程序开发回顾篇

    基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下:   对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了 ...

  10. TOJ 3365 ZOJ 3232 It's not Floyd Algorithm / 强连通分量

    It's not Floyd Algorithm 时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte   描述 When a directed grap ...