Java中报错org.springframework.jdbc.UncategorizedSQLException的多种解决方法

 更新时间:2023年06月21日 15:13:54   作者:互联网全栈开发实战  
本文主要介绍了Java中报错org.springframework.jdbc.UncategorizedSQLException的多种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

如果你遇到的问题不是我所遇到的问题,可以使用最下面的方法解决你遇到的这个错误。

1. 引出问题

今天在写“Mybatis-Plus 中分页插件PaginationInterceptor, MybatisPlusInterceptor 在SpringBoot中的使用”的博文时,遇到了如下问题:

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. 分析问题

通过报错信息sql injection violation可知SQL注入冲突,是哪里发生了冲突呢?别着急,继续往下分析报错的SQL语句:

select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?

原来SQL语句出现了错误,即在create_time descLIMIT ?,?出现了;

正因为这个分号导致SQL执行异常,然而,我的原SQL语句并没写LIMIT ?,?,如下代码所示:

@Select("select " +
            "username,nickname,user_type as userType " +
          "from " +
            "user " +
          "order by " +
            "create_time desc;"
  )

可以清晰地看到,我的SQL语句加上了分号(;),但没有LIMIT ?,?

通过查找资料可得:在使用PaginationInterceptor, MybatisPlusInterceptor插件做分页操作时,编写mapper.xml中的SQL语句时,或者使用@select注解编写SQL语句时,语句末尾若使用 ; 结尾,则会导致出现SQL语法错误(SQLSyntaxErrorException),原因是在做分页的时候会在编写的SQL语句后面拼接上limit语句。

3. 解决问题

既然语句末尾不能加;,则去掉分号;即可,如下代码所示:

@Select("select " +
            "username,nickname,user_type as userType " +
          "from " +
            "user " +
          "order by " +
            "create_time desc"
  )
  List<UserPageVo> findPageUsers(Page<UserPageVo> page);

重新运行项目即可执行成功,如下图所示:

4. 解决该问题的其他方法

如果你遇到的问题不是我所遇到的问题,可以使用如下方法解决你遇到的这个错误。

4.1 方法1

检查字段类型是否对得上。因为字段类型对应不上,在数据库的类型和实体中的类型不一致。

比如user_id在数据库中是varchar类型,但在实体中是Integer

4.2 方法2

检查字段名称是否对得上,有可能在java实体中的注解名称在数据库中不存在。

比如数据库中的字段是user_type,而注解中的字段是userType,如下代码所示:

@TableField(value = "userType")
private String userType;

当然,如果java实体中不指定数据库的字段名称,则默认以属性名称对应数据库的字段名称,往往这种会出现这个错误(UncategorizedSQLException)。

4.3 方法3

检查数据库的表字段是否有限制。

例如是UNI(唯一)、非空等限制都会导致出现此问题。

4.4 方法4

检查表字符集是否有问题。

例如表字符集是utf8,但提交的内容有表情,改成utf8mb4即可。

备注:如果上述方法都无法解决你的问题,欢迎在评论区留言。

到此这篇关于Java中报错org.springframework.jdbc.UncategorizedSQLException的多种解决方法的文章就介绍到这了,更多相关org.springframework.jdbc.UncategorizedSQLException内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Java中的ArrayList类常用方法和遍历

    Java中的ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的ArrayList类常用方法和遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现

    AC自动机算法常被认为是Trie树+KMP算法的结合体,它是一个多模式匹配算法,在模式匹配领域被广泛应用。本文将详细为大家介绍AC自动机的原理与实现方法,感兴趣的可以了解一下
    2022-12-12
  • Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?今天小编通过本教程给大家介绍下
    2016-12-12
  • logback StatusListener的定义方法源码解读

    logback StatusListener的定义方法源码解读

    这篇文章主要为大家介绍了logback StatusListener的定义方法源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Springboot+Poi导入Excel表格实现过程详解

    Springboot+Poi导入Excel表格实现过程详解

    这篇文章主要介绍了Springboot+Poi导入Excel表格实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • MyBatis属性名和字段名不一致的问题解决方法

    MyBatis属性名和字段名不一致的问题解决方法

    这篇文章给大家详细介绍了MyBatis属性名和字段名不一致的问题解决,文中有详细的代码示例和图文展示供大家参考,对大家的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-12-12
  • ssm mybatis如何配置多个mapper目录

    ssm mybatis如何配置多个mapper目录

    这篇文章主要介绍了ssm mybatis如何配置多个mapper目录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • 关于kafka发送消息的三种方式总结

    关于kafka发送消息的三种方式总结

    这篇文章主要介绍了关于kafka发送消息的三种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java mysql特殊形式的查询语句详解

    Java mysql特殊形式的查询语句详解

    这篇文章主要介绍了Java mysql特殊形式的查询,包括子查询和联合查询、自身连接查询问题,本文通过sql语句给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • SpringBoot使用统一异常处理详解

    SpringBoot使用统一异常处理详解

    这篇文章主要为大家详细介绍了SpringBoot使用统一异常处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05

最新评论