MyBatis中使用#{}和${}占位符传递参数的各种报错信息处理方案

 更新时间:2024年01月11日 09:00:05   作者:云霄雨霁  
这篇文章主要介绍了MyBatis中使用#{}和${}占位符传递参数的各种报错信息处理方案,分别介绍了两种占位符的区别,本文给大家介绍的非常详细,需要的朋友可以参考下

在Mapper层使@Select注解进行SQL语句查询时,往往需要进行参数传入和拼接,一般情况下使用两种占位符#{参数名}和${参数名},两者的区别为:

一、两种占位符的区别

1、参数传入方式的区别

#{}是预编译处理,后台输出的日志会将SQL语句中的#{}占位符输出为?,将传入的Parameter传入SQL语句。

${}是字符串硬替换,会直接将传入的参数直接替换${}占位符,不进行预处理。有SQL注入的风险。

2、参数传入后处理的区别

#{}传入参数后,会自动给参数加上' '(引号),例如:

@Select("select name from user where id = #{id}")
String queryNameById(String id);

在传入id为1001之后,输出的sql为:

select name from user where id ='1001'

${}传入的参数会硬替换字符串,不会有其他处理,例如:

@Select("select name from user where id = ${id}")
String queryNameById(String id);

在传入id为1001后输出的sql是:

select name from user where id = 1001

参数会直接替换${}而不进行其他处理,如果这里你需要给参数加上' ',则需要这么修改代码:

@Select("select name from user where id = '${id}'")
String queryNameById(String id);

这样进行替换后的sql就会变为参数加引号的sql语句。

二、常见报错处理

1、索引超出范围

详细报错为:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='name', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围。] with root cause

日志信息报错索引超出范围,可能是因为语句拼接后出现语法错误,往往造成该错误的是对语句中占位符处的引号处理问题。例如:

@Select("select  kunnr,name1 from openquery(hana2,'select top 10 * from SAPHANADB.kna1 where name1 like ''%${name}%'' and name1 not like ''冻结''')")
List<Biz> queryBizListByName(String name);

如果这里使用#{}进行占位符,那么组成的sql会变成 like ''%‘name’%'' and,参数会多一个' '进行包裹,语法就会出错。所以不管是使用concat进行拼接,还是直接进行替换,使用两种占位符时都要根据其使用特点,注意包裹的' ',来达到符合自己SQL语法的使用。在出现“索引超出范围”的报错时,可以通过检查自己sql的语法是否出错,来看看是否可以解决问题。

2、“@P0”附近有语法错误

详细报错为:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: “@P0”附近有语法错误。

日志报这个错误,可能是由于你的sql语句中,使用了不支持#{}占位符的函数,例如Top和Order By等函数,是不支持使用#{}占位符的,可以将#{}改为${},使用字符串替换可以解决问题。但要注意#{}改为${}时引号包裹引起的语法问题。

提醒:代码中尽量使用#{}占位符,尽量避免使用${}占位符,因为#{}会更加安全。

到此这篇关于MyBatis中使用#{}和${}占位符传递参数的各种报错信息处理的文章就介绍到这了,更多相关MyBatis #{}和${}占位符传递参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 实现迷宫回溯算法示例详解

    java 实现迷宫回溯算法示例详解

    这篇文章主要介绍了java 实现迷宫回溯算法示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java修改JFrame默认字体方式

    java修改JFrame默认字体方式

    这篇文章主要介绍了java修改JFrame默认字体方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring中的NamespaceHandler与BeanDefinitionParser详解

    Spring中的NamespaceHandler与BeanDefinitionParser详解

    这篇文章主要介绍了Spring中的NamespaceHandler与BeanDefinitionParser详解,由Spring启动过程之obtainFreshBeanFactory() ,可以看到NamespaceHandler、BeanDefinitionParser为解析配置文件中的Element起重要作用,那么它本身是如何被加载的呢,需要的朋友可以参考下
    2023-12-12
  • Java在制作jar包时引用第三方jar包的方法

    Java在制作jar包时引用第三方jar包的方法

    这篇文章主要介绍了Java在制作jar包时引用第三方jar包的方法的相关资料,需要的朋友可以参考下
    2016-01-01
  • 在MyBatisPlus中使用@TableField完成字段自动填充的操作

    在MyBatisPlus中使用@TableField完成字段自动填充的操作

    这篇文章主要介绍了在MyBatisPlus中使用@TableField完成字段自动填充的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springCloud项目搭建流程步骤分解

    springCloud项目搭建流程步骤分解

    SpringCloud 作为当下最为流行的微服务框架,也越来越多的人去学习和使用这个框架。下面,我将带大家简单地认识一下 SpringCloud 框架,以及如何来搭建一个 SpringCloud 项目环境的教程
    2022-05-05
  • 史上最全MybatisPlus从入门到精通

    史上最全MybatisPlus从入门到精通

    MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页等)、主键策略(如雪花算法、UUID)及分页插件配置,实现灵活的数据操作与数据库交互,需要的朋友跟随小编一起看看吧
    2025-08-08
  • java实现文本框和文本区的输入输出

    java实现文本框和文本区的输入输出

    这篇文章主要介绍了java实现文本框和文本区的输入输出的方法和具体示例,有需要的小伙伴可以参考下。
    2015-06-06
  • 详解如何使用SpringBoot封装Excel生成器

    详解如何使用SpringBoot封装Excel生成器

    在软件开发过程中,经常需要生成Excel文件来导出数据或者生成报表,为了简化开发流程和提高代码的可维护性,我们可以使用Spring Boot封装Excel生成器,本文将介绍如何使用Spring Boot封装Excel生成器,并提供一些示例代码来说明其用法和功能
    2023-06-06
  • Java中classpath讲解及使用方式

    Java中classpath讲解及使用方式

    本文详细讲解了Java中classpath讲解及使用方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论