浅谈mybatis mapper.xml文件中$和#的区别

 更新时间:2020年11月27日 12:34:29   作者:xingxinghann  
这篇文章主要介绍了浅谈mybatis mapper.xml文件中$和#的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

#{}表示一个占位符即?,可以有效防止sql注入。在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。

#{}可以接收简单类型值或pojo属性值,如果传入简单类型值,#{}括号中可以是任意名称。

<!-- 根据名称模糊查询用户信息 -->
 <select id="findUserById" parameterType="String" resultType="user">
  select * from user where username like CONCAT(CONCAT('%', #{name}), '%')
 </select>

${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换。

${}可以接收简单类型值或pojo属性值,如果传入简单类型值,${}括号中名称只能是value。

<!-- 根据名称模糊查询用户信息 -->
 <select id="selectUserByName" parameterType="string" resultType="user">
  select * from user where username like '%${value}%'
 </select>

对于order by排序,使用#{}将无法实现功能,应该写成如下形式:

ORDER BY ${columnName}

另外,对于mybatis逆向工程生成的代码中,进行模糊查询调用andXxxLike()方法时,需要手动加%,如下:

CustomerExample customerExample=new CustomerExample();

customerExample.or().andNameLike("%"+name+"%");

补充知识:Mybatis条件if test使用枚举值

1 正确

package com.weather.weatherexpert.common.utils; 
 
/**
 * <p>Title: </p>
 * <p>Description: </p>
 *
 * @Author 
 * @CreateTime 
 */
public enum City {
 
  XINZHOU(100002,"忻州"),
  DATONG(100003,"大同"),
  TAIYUAN(100001,"太原");
 
  private final Integer code;
  private final String name;
 
 
  City(Integer value, String desc) {
    this.code = value;
    this.name = desc;
  }
 
  public Integer getCode() {
    return code;
  }
 
  public String getName() {
    return name;
  }
}

xml:

<!--<if test="cityName == @com.weather.weatherexpert.common.utils.City.XINZHOU@getName">&lt;!&ndash;wrong,java.lang.ClassNotFoundException: Unable to resolve class: com.weather.weatherexpert.common.utils.City.XINZHOU&ndash;&gt;-->
<!--<if test="cityName == @com.weather.weatherexpert.common.utils.City@XINZHOU@getName">&lt;!&ndash;wrong,[org.apache.ibatis.ognl.ParseException: Encountered " "@" "@ "" at line 1, column 65.&ndash;&gt;-->
<if test="cityName == @com.weather.weatherexpert.common.utils.City@XINZHOU.getName"><!--right-->
 area_table
</if> 
 
where 1=1
<if test="cityName == @com.weather.weatherexpert.common.utils.City@XINZHOU.getName"><!--right-->
 and city_name=#{cityName}
</if> 

2 错误

package com.weather.weatherexpert.common.utils;
 
/**
 * <p>Title: </p>
 * <p>Description: </p>
 *
 * @Author
 * @CreateTime
 */
public class CityClass {
 
  public static enum CityEnum {
 
    XINZHOU(100002, "忻州"),
    DATONG(100003, "大同"),
    TAIYUAN(100001, "太原");
 
    private final Integer code;
    private final String name; 
 
    CityEnum(Integer value, String desc) {
      this.code = value;
      this.name = desc;
    }
 
    public Integer getCode() {
      return code;
    }
 
    public String getName() {
      return name;
    }
  }
}

xml:

/*   Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression
    'cityName == @com.weather.weatherexpert.common.utils.CityClass@CityEnum.XINZHOU.getName'. Cause: org.apache.ibatis.ognl.OgnlException:
    Could not get static field CityEnum from class com.weather.weatherexpert.common.utils.CityClass [java.lang.NoSuchFieldException: CityEnum]*/
    <if test="cityName == @com.weather.weatherexpert.common.utils.CityClass@CityEnum.XINZHOU.getName"><!--wrong-->
      area_table
    </if>

可见,直接定义的枚举类可以正常使用,在类中定义的枚举类这样使用会报错,可能方法还没有找到。

以上这篇浅谈mybatis mapper.xml文件中$和#的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java设计模式之浅谈适配器模式

    java设计模式之浅谈适配器模式

    我们现实生活中的适配器不少.例如,我们使用存储卡适配器连接存储卡和一个计算机,因为计算机仅支持一种类型的存储卡和我们的卡不与计算机兼容,适配器是两种不相容的实体之间的转换器,适配器模式是一种结构模式.本文就带大家了解一下java适配器模式,需要的朋友可以参考下
    2021-06-06
  • Java设计模式以虹猫蓝兔的故事讲解代理模式

    Java设计模式以虹猫蓝兔的故事讲解代理模式

    代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象
    2022-04-04
  • Spring与Spring boot的区别介绍

    Spring与Spring boot的区别介绍

    Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。接下来通过本文给大家介绍Spring与Spring boot的区别介绍,非常不错,需要的朋友参考下吧
    2017-04-04
  • spring security自定义登录页面

    spring security自定义登录页面

    在项目中我们肯定不能使用Spring自己生成的登录页面,而要用我们自己的登录页面,下面通过本文给大家分享spring security自定义登录页面的实现方法,一起看看吧
    2017-09-09
  • SpringBoot解决yml明文密码问题的方法

    SpringBoot解决yml明文密码问题的方法

    在现代的软件开发中,安全性是一个重要的考量因素,对于使用SpringBoot框架开发的应用程序而言,敏感信息如数据库密码、API密钥等通常存储在YAML配置文件中,而这些文件往往是明文存储,存在安全隐患,所以本文介绍了SpringBoot解决yml明文密码问题的方法
    2024-07-07
  • Java面试题冲刺第九天--MyBatis

    Java面试题冲刺第九天--MyBatis

    这篇文章主要为大家分享了最有价值的三道MyBatis框架面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • maven下载依赖失败问题及解决

    maven下载依赖失败问题及解决

    这篇文章主要介绍了maven下载依赖失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot3集成Kafka的方法详解

    SpringBoot3集成Kafka的方法详解

    Kafka是一个开源的分布式事件流平台,常被用于高性能数据管道、流分析、数据集成和关键任务应用,下面我们就来看看SpringBoot3是如何集成Kafka的吧
    2023-08-08
  • IDEA连接MySQL提示serverTimezone的问题及解决方法

    IDEA连接MySQL提示serverTimezone的问题及解决方法

    很多朋友私聊小编,使用IDEA软件连接MySQL数据库时总是提示Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.的错误,小编就不一一回复大家了,下面小编把我的解决方法分享到脚本之家平台,需要的朋友参考下吧
    2021-05-05
  • Springmvc处理ajax请求并返回json数据

    Springmvc处理ajax请求并返回json数据

    这篇文章主要介绍了Springmvc处理ajax请求并返回json数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论