Java中報(bào)錯(cuò)org.springframework.jdbc.UncategorizedSQLException的多種解決方法
如果你遇到的問(wèn)題不是我所遇到的問(wèn)題,可以使用最下面的方法解決你遇到的這個(gè)錯(cuò)誤。
1. 引出問(wèn)題
今天在寫“Mybatis-Plus 中分頁(yè)插件PaginationInterceptor, MybatisPlusInterceptor 在SpringBoot中的使用”的博文時(shí),遇到了如下問(wèn)題:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@498d7c57] will not be managed by Spring ==> Preparing: SELECT COUNT(*) AS total FROM user ==> Parameters: <== Columns: total <== Row: 24 <== Total: 1 ==> Preparing: select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,? Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6f5c4fa1] org.springframework.jdbc.UncategorizedSQLException: ### Error querying database. Cause: java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,? ### The error may exist in com/cloud/lowcode/mapper/UserMapper.java (best guess) ### The error may involve com.cloud.lowcode.mapper.UserMapper.findPageUsers ### The error occurred while executing a query ### SQL: select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,? ### Cause: java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,? ; uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?; nested exception is java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,? at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) at com.sun.proxy.$Proxy157.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy161.findPageUsers(Unknown Source) at com.cloud.lowcode.service.UserService.findPageUsers(UserService.java:52) at com.cloud.lowcode.service.UserService$$FastClassBySpringCGLIB$$dd31034.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.cloud.lowcode.service.UserService$$EnhancerBySpringCGLIB$$c454c3ba.findPageUsers(<generated>) at com.cloud.lowcode.controller.UserController.findPageUsers(UserController.java:71) at com.cloud.lowcode.controller.UserController$$FastClassBySpringCGLIB$$6a5c21dc.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) at com.cloud.lowcode.controller.UserController$$EnhancerBySpringCGLIB$$bf8624f6.findPageUsers(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ......
2. 分析問(wèn)題
通過(guò)報(bào)錯(cuò)信息sql injection violation
可知SQL
注入沖突,是哪里發(fā)生了沖突呢?別著急,繼續(xù)往下分析報(bào)錯(cuò)的SQL
語(yǔ)句:
select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?
原來(lái)SQL
語(yǔ)句出現(xiàn)了錯(cuò)誤,即在create_time desc
和LIMIT ?,?
出現(xiàn)了;
。
正因?yàn)檫@個(gè)分號(hào)導(dǎo)致SQL
執(zhí)行異常,然而,我的原SQL語(yǔ)句并沒(méi)寫LIMIT ?,?
,如下代碼所示:
@Select("select " + "username,nickname,user_type as userType " + "from " + "user " + "order by " + "create_time desc;" )
可以清晰地看到,我的SQL
語(yǔ)句加上了分號(hào)(;)
,但沒(méi)有LIMIT ?,?
。
通過(guò)查找資料可得:在使用PaginationInterceptor, MybatisPlusInterceptor
插件做分頁(yè)操作時(shí),編寫mapper.xml
中的SQL
語(yǔ)句時(shí),或者使用@select
注解編寫SQL
語(yǔ)句時(shí),語(yǔ)句末尾若使用 ;
結(jié)尾,則會(huì)導(dǎo)致出現(xiàn)SQL
語(yǔ)法錯(cuò)誤(SQLSyntaxErrorException
),原因是在做分頁(yè)的時(shí)候會(huì)在編寫的SQL
語(yǔ)句后面拼接上limit
語(yǔ)句。
3. 解決問(wèn)題
既然語(yǔ)句末尾不能加;
,則去掉分號(hào);
即可,如下代碼所示:
@Select("select " + "username,nickname,user_type as userType " + "from " + "user " + "order by " + "create_time desc" ) List<UserPageVo> findPageUsers(Page<UserPageVo> page);
重新運(yùn)行項(xiàng)目即可執(zhí)行成功,如下圖所示:
4. 解決該問(wèn)題的其他方法
如果你遇到的問(wèn)題不是我所遇到的問(wèn)題,可以使用如下方法解決你遇到的這個(gè)錯(cuò)誤。
4.1 方法1
檢查字段類型是否對(duì)得上。因?yàn)樽侄晤愋蛯?duì)應(yīng)不上,在數(shù)據(jù)庫(kù)的類型和實(shí)體中的類型不一致。
比如user_id
在數(shù)據(jù)庫(kù)中是varchar
類型,但在實(shí)體中是Integer
。
4.2 方法2
檢查字段名稱是否對(duì)得上,有可能在java實(shí)體
中的注解名稱在數(shù)據(jù)庫(kù)中不存在。
比如數(shù)據(jù)庫(kù)中的字段是user_type
,而注解中的字段是userType
,如下代碼所示:
@TableField(value = "userType") private String userType;
當(dāng)然,如果java實(shí)體
中不指定數(shù)據(jù)庫(kù)的字段名稱,則默認(rèn)以屬性名稱對(duì)應(yīng)數(shù)據(jù)庫(kù)的字段名稱,往往這種會(huì)出現(xiàn)這個(gè)錯(cuò)誤(UncategorizedSQLException
)。
4.3 方法3
檢查數(shù)據(jù)庫(kù)的表字段是否有限制。
例如是UNI(唯一)
、非空等限制都會(huì)導(dǎo)致出現(xiàn)此問(wèn)題。
4.4 方法4
檢查表字符集是否有問(wèn)題。
例如表字符集是utf8
,但提交的內(nèi)容有表情,改成utf8mb4
即可。
備注:如果上述方法都無(wú)法解決你的問(wèn)題,歡迎在評(píng)論區(qū)留言。
到此這篇關(guān)于Java中報(bào)錯(cuò)org.springframework.jdbc.UncategorizedSQLException的多種解決方法的文章就介紹到這了,更多相關(guān)org.springframework.jdbc.UncategorizedSQLException內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java:無(wú)法訪問(wèn)org.springframework.boot.SpringApplication的解決方法
- Java報(bào)錯(cuò):Error:java:?程序包org.springframework.boot不存在解決辦法
- 解決Error:(5,55)java:程序包org.springframework.cloud.netflix.eureka.server不存在問(wèn)題
- java:程序包org.springframework.boot不存在的完美解決方法
- java:無(wú)法訪問(wèn)org.springframework.boot.SpringApplication問(wèn)題
相關(guān)文章
Java Socket編程心跳包創(chuàng)建實(shí)例解析
這篇文章主要介紹了Java Socket編程心跳包創(chuàng)建實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12簡(jiǎn)單講解Android開(kāi)發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法
這篇文章主要介紹了Android開(kāi)發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法,包括事件偵聽(tīng)器等安卓開(kāi)發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下2015-12-12Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下2024-07-07使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志
這篇文章主要為大家介紹了使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Java抓包工具fiddler實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)
Fiddler是一個(gè)http協(xié)議調(diào)試代理工具,本文主要介紹了Java抓包工具fiddler實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-0495%的Java程序員人都用不好Synchronized詳解
這篇文章主要為大家介紹了95%的Java程序員人都用不好Synchronized詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Java?基于Hutool實(shí)現(xiàn)DES加解密示例詳解
這篇文章主要介紹了Java基于Hutool實(shí)現(xiàn)DES加解密,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Mybatis執(zhí)行SQL時(shí)多了一個(gè)limit的問(wèn)題及解決方法
這篇文章主要介紹了Mybatis執(zhí)行SQL時(shí)多了一個(gè)limit的問(wèn)題及解決方法,Mybatis攔截器方法識(shí)別到配置中參數(shù)supportMethodsArguments 為ture時(shí)會(huì)分頁(yè)處理,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-10-10