最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

#{}傳入?yún)?shù)后,會自動給參數(shù)加上' '(引號),例如:

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

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

select name from user where id ='1001'

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

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

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

select name from user where id = 1001

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

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

這樣進行替換后的sql就會變?yōu)閰?shù)加引號的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

日志信息報錯索引超出范圍,可能是因為語句拼接后出現(xià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);

如果這里使用#{}進行占位符,那么組成的sql會變成 like ''%‘name’%'' and,參數(shù)會多一個' '進行包裹,語法就會出錯。所以不管是使用concat進行拼接,還是直接進行替換,使用兩種占位符時都要根據(jù)其使用特點,注意包裹的' ',來達到符合自己SQL語法的使用。在出現(xiàn)“索引超出范圍”的報錯時,可以通過檢查自己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語句中,使用了不支持#{}占位符的函數(shù),例如Top和Order By等函數(shù),是不支持使用#{}占位符的,可以將#{}改為${},使用字符串替換可以解決問題。但要注意#{}改為${}時引號包裹引起的語法問題。

提醒:代碼中盡量使用#{}占位符,盡量避免使用${}占位符,因為#{}會更加安全。

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

相關(guān)文章

  • Maven及Springboot配置JDK版本,編碼,源碼打包等方式

    Maven及Springboot配置JDK版本,編碼,源碼打包等方式

    這篇文章主要介紹了Maven及Springboot配置JDK版本,編碼,源碼打包等方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解

    Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解

    這篇文章主要介紹了Spring mvc服務(wù)端數(shù)據(jù)校驗實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 學(xué)習(xí)Java之如何對時間進行格式化

    學(xué)習(xí)Java之如何對時間進行格式化

    當我們在默認情況下構(gòu)造出來的時間對象,它的時間格式并不適合我們閱讀,并且在開發(fā)時,pc端、Android端、iOS端等展示的時間格式可能也并不完全一樣,本文就從這幾個問題給大家介紹如何對時間進行格式化,感興趣的同學(xué)可以借鑒一下
    2023-05-05
  • Java八種基本變量作為類的成員變量的默認值操作

    Java八種基本變量作為類的成員變量的默認值操作

    這篇文章主要介紹了Java八種基本變量作為類的成員變量的默認值操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 關(guān)于Java中的可見性和有序性問題

    關(guān)于Java中的可見性和有序性問題

    這篇文章主要介紹了關(guān)于Java中的可見性和有序性問題,Java在誕生之初就支持多線程,自然也有針對這三者的技術(shù)方案,今天就學(xué)習(xí)一下Java如何解決其中的可見性和有序性導(dǎo)致的問題,需要的朋友可以參考下
    2023-08-08
  • 基于Spring Boot的Environment源碼理解實現(xiàn)分散配置詳解

    基于Spring Boot的Environment源碼理解實現(xiàn)分散配置詳解

    這篇文章主要給大家介紹了基于Spring Boot的Environment源碼理解實現(xiàn)分散配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Java學(xué)習(xí)之線程同步與線程間通信詳解

    Java學(xué)習(xí)之線程同步與線程間通信詳解

    這篇文章主要為大家詳細介紹了線程同步和線程之間的通信的相關(guān)知識,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-12-12
  • 一文搞懂如何實現(xiàn)Java,Spring動態(tài)啟停定時任務(wù)

    一文搞懂如何實現(xiàn)Java,Spring動態(tài)啟停定時任務(wù)

    定時任務(wù)的應(yīng)用場景十分廣泛,如定時清理文件、定時生成報表、定時數(shù)據(jù)同步備份等。本文將教你實現(xiàn)Java、Spring動態(tài)啟停定時任務(wù),感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • 超簡單的java獲取鼠標點擊位置坐標的實例(鼠標在Jframe上的坐標)

    超簡單的java獲取鼠標點擊位置坐標的實例(鼠標在Jframe上的坐標)

    在Java窗體Jframe上獲取鼠標點擊的坐標,其中使用了匿名內(nèi)部類,實例代碼非常簡單易懂,大家可以學(xué)習(xí)一下
    2018-03-03
  • Java中keytool的使用

    Java中keytool的使用

    Keytool 是一個JAVA環(huán)境下的安全鑰匙與證書的管理工具,Keytool將密鑰(key)和證書(certificates)存在一個稱為keystore 的文件(受密碼保護)中,本文重點給大家介紹keytool的使用,感興趣的朋友一起看看吧
    2022-02-02

最新評論

美姑县| 堆龙德庆县| 高邮市| 保康县| 海伦市| 那坡县| 威宁| 从化市| 尼玛县| 崇文区| 柏乡县| 利津县| 宝应县| 东丽区| 镇宁| 儋州市| 陆河县| 乌拉特中旗| 炉霍县| 福鼎市| 岫岩| 甘谷县| 汉源县| 南康市| 萨迦县| 巫山县| 龙井市| 偃师市| 延边| 邹城市| 灵石县| 吴忠市| 凤台县| 城固县| 黑龙江省| 阆中市| 东光县| 鄄城县| 河池市| 肃南| 阳原县|