Mybatis + Mysql 找不到表异常【已解决】

758 阅读2分钟

报错

今天引入 mybatis-plus ,在查表时出现如下错误,表找不到,但是库里是存在这张表的。

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'ebook.category' doesn't exist
### The error may exist in cc/wanghl/ebook/mapper/CategoryMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT COUNT( * ) AS total FROM category      WHERE id=?
### Cause: java.sql.SQLSyntaxErrorException: Table 'ebook.category' doesn't exist
; bad SQL grammar []
	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:243) ~[spring-jdbc-6.0.11.jar:6.0.11]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) ~[spring-jdbc-6.0.11.jar:6.0.11]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-2.1.1.jar:2.1.1]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-2.1.1.jar:2.1.1]
	at jdk.proxy2/jdk.proxy2.$Proxy67.selectOne(Unknown Source) ~[na:na]

原因

可能的原因有很多,比如表名写错了、jdbc 链接中没有写数据库(如下图)

image.png 不过我的原因是,我的库里表名是大写的,mybatis-plus 发出的 sql 表名是小定的。

Mysql 我用的是官方的 docker 镜像 mysql:8.1.0 ,linux 版本的 mysql 默认是大小写敏感的。

用下面的命令可以查看你的 Mysql 关于大小写是否敏感的设置信息:

show global variables like '%lower_case%';

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | ON    |
| lower_case_table_names | 0     |
+------------------------+-------+

lower_case_file_system,代表当前系统文件是否大小写敏感,只读参数,无法修改。ON 大小写不敏感,OFF 大小写敏感。

lower_case_table_names,代表表名是否大小写敏感,可以修改,参数有0、1、2三种。

  • 0 大小写敏感。(Unix,Linux默认) 创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm文件,SQL语句也会原样解析。
  • 1 大小写不敏感。(Windows默认) 创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。 SQL语句同样会将库表名转换成小写。 如需要查询以前创建的Testtable(生成Testtable.frm文件),即便执行select * from Testtable,也会被转换成select * from testtable,致使报错表不存在。
  • 2 大小写不敏感(OS X默认) 创建的库表将原样保存在磁盘上, 但SQL语句将库表名转换成小写。

解决

  1. lower_case_table_names 是可以改的,Linux 中 Mysql 的配置文件在/etc/my.cnf/etc/mysql/conf.d/*.cnf

  2. [mysqld] 类目下加一行lower_case_table_names = 1

  3. 这个方法在 Mysql8 版本会启动报错 Different lower_case_table_names settings for server ('1') and data dictionary ('0').

  4. 具体见网友的解决办法,需要实始化库,

    mysql8默认是区分大小写的,如果不需要区分大小写则需要设置lower-case-table-names MySQL8启动报Different lower_case_table_names settings for server ('1') and data dictionary ('0'). 需要删除mysql的库重新初始化: mysqld --initialize --lower-case-table-names=1

    并且修改/etc/my.cnf

    在[mysqld]下面添加

    lower-case-table-names=1

    然后启动mysqld就可以了

  5. 懒得解决就把表名全改成小写吧。

参考文章:

www.jianshu.com/p/f2eabcef6…

www.jianshu.com/p/ba599f51f…