欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理方案

 更新時(shí)間:2024年01月11日 09:00:05   作者:云霄雨霽  
這篇文章主要介紹了MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理方案,分別介紹了兩種占位符的區(qū)別,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下

在Mapper層使@Select注解進(jìn)行SQL語(yǔ)句查詢時(shí),往往需要進(jìn)行參數(shù)傳入和拼接,一般情況下使用兩種占位符#{參數(shù)名}和${參數(shù)名},兩者的區(qū)別為:

一、兩種占位符的區(qū)別

1、參數(shù)傳入方式的區(qū)別

#{}是預(yù)編譯處理,后臺(tái)輸出的日志會(huì)將SQL語(yǔ)句中的#{}占位符輸出為?,將傳入的Parameter傳入SQL語(yǔ)句。

${}是字符串硬替換,會(huì)直接將傳入的參數(shù)直接替換${}占位符,不進(jìn)行預(yù)處理。有SQL注入的風(fēng)險(xiǎn)。

2、參數(shù)傳入后處理的區(qū)別

#{}傳入?yún)?shù)后,會(huì)自動(dòng)給參數(shù)加上' '(引號(hào)),例如:

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

在傳入id為1001之后,輸出的sql為:

select name from user where id ='1001'

${}傳入的參數(shù)會(huì)硬替換字符串,不會(huì)有其他處理,例如:

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

在傳入id為1001后輸出的sql是:

select name from user where id = 1001

參數(shù)會(huì)直接替換${}而不進(jìn)行其他處理,如果這里你需要給參數(shù)加上' ',則需要這么修改代碼:

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

這樣進(jìn)行替換后的sql就會(huì)變?yōu)閰?shù)加引號(hào)的sql語(yǔ)句。

二、常見報(bào)錯(cuò)處理

1、索引超出范圍

詳細(xì)報(bào)錯(cuò)為:
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

日志信息報(bào)錯(cuò)索引超出范圍,可能是因?yàn)檎Z(yǔ)句拼接后出現(xiàn)語(yǔ)法錯(cuò)誤,往往造成該錯(cuò)誤的是對(duì)語(yǔ)句中占位符處的引號(hào)處理問(wèn)題。例如:

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

如果這里使用#{}進(jìn)行占位符,那么組成的sql會(huì)變成 like ''%‘name’%'' and,參數(shù)會(huì)多一個(gè)' '進(jìn)行包裹,語(yǔ)法就會(huì)出錯(cuò)。所以不管是使用concat進(jìn)行拼接,還是直接進(jìn)行替換,使用兩種占位符時(shí)都要根據(jù)其使用特點(diǎn),注意包裹的' ',來(lái)達(dá)到符合自己SQL語(yǔ)法的使用。在出現(xiàn)“索引超出范圍”的報(bào)錯(cuò)時(shí),可以通過(guò)檢查自己sql的語(yǔ)法是否出錯(cuò),來(lái)看看是否可以解決問(wèn)題。

2、“@P0”附近有語(yǔ)法錯(cuò)誤

詳細(xì)報(bào)錯(cuò)為:
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”附近有語(yǔ)法錯(cuò)誤。

日志報(bào)這個(gè)錯(cuò)誤,可能是由于你的sql語(yǔ)句中,使用了不支持#{}占位符的函數(shù),例如Top和Order By等函數(shù),是不支持使用#{}占位符的,可以將#{}改為${},使用字符串替換可以解決問(wèn)題。但要注意#{}改為${}時(shí)引號(hào)包裹引起的語(yǔ)法問(wèn)題。

提醒:代碼中盡量使用#{}占位符,盡量避免使用${}占位符,因?yàn)?{}會(huì)更加安全。

到此這篇關(guān)于MyBatis中使用#{}和${}占位符傳遞參數(shù)的各種報(bào)錯(cuò)信息處理的文章就介紹到這了,更多相關(guān)MyBatis #{}和${}占位符傳遞參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)教程之組合(composition)

    Java基礎(chǔ)教程之組合(composition)

    這篇文章主要介紹了Java基礎(chǔ)教程之組合(composition),組合是在Java中實(shí)現(xiàn)程序復(fù)用(reusibility)的基本手段之一,需要的朋友可以參考下
    2014-08-08
  • Spring框架依賴注入方法示例

    Spring框架依賴注入方法示例

    這篇文章主要介紹了Spring框架依賴注入方法示例,分享了三種方法示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java 使用異常的好處總結(jié)

    java 使用異常的好處總結(jié)

    這篇文章主要介紹了java 使用異常的好處總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • MapReduce2框架的原理解析

    MapReduce2框架的原理解析

    這篇文章主要圍繞MapReduce2框架原理介紹的,文中有詳細(xì)的代碼示例,對(duì)學(xué)習(xí)有一定的幫助,需要的朋友可以借鑒參考
    2023-04-04
  • java?String拼接json的方式實(shí)現(xiàn)

    java?String拼接json的方式實(shí)現(xiàn)

    本文主要介紹了java?String拼接json的方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)

    Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)

    這篇文章主要介紹了Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù) ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Springmvc ViewResolver設(shè)計(jì)實(shí)現(xiàn)過(guò)程解析

    Springmvc ViewResolver設(shè)計(jì)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Springmvc ViewResolver設(shè)計(jì)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 詳解Struts2動(dòng)態(tài)方法調(diào)用

    詳解Struts2動(dòng)態(tài)方法調(diào)用

    這篇文章主要介紹了詳解Struts2動(dòng)態(tài)方法調(diào)用,涉及調(diào)用方法的代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • SpringCloud Gateway網(wǎng)關(guān)功能介紹與使用

    SpringCloud Gateway網(wǎng)關(guān)功能介紹與使用

    SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了SpringCloud Gateway網(wǎng)關(guān)作用,需要的朋友可以參考下
    2022-12-12
  • SpringBoot數(shù)據(jù)層測(cè)試事務(wù)回滾的實(shí)現(xiàn)流程

    SpringBoot數(shù)據(jù)層測(cè)試事務(wù)回滾的實(shí)現(xiàn)流程

    這篇文章主要介紹了SpringBoot數(shù)據(jù)層測(cè)試事務(wù)回滾的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10

最新評(píng)論