FAQ(72):### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

博客记录了一次数据库异常问题的解决过程。日志显示因数据库表不存在某字段而出现异常,与管理数据库的同事沟通后,发现是未提供最新数据表,更新表后问题解决。同时给出经验,遇到配置或数据库表问题要及时反馈交流,别只在代码里找问题。

2018年8月31日15:44:47

1、日志

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'roleId' in 'field list'
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'roleId' in 'field list'
	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:233)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
	at com.sun.proxy.$Proxy7.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:195)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:124)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
	at com.sun.proxy.$Proxy13.selectByExample(Unknown Source)
	at com.xs.fun.admin.sql.dao.RechargeOrderDao.getByBetweenTimeOrInPackageIdsOrInChannelIds(RechargeOrderDao.java:154)
	at com.xs.fun.admin.action.RechargeAction.getRechargeList(RechargeAction.java:159)
	... 29 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'roleId' in 'field list'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
	at com.mysql.jdbc.Util.getInstance(Util.java:382)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:56)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)
	at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355)
	... 37 more

2、解决方法

如log所示,这是由于数据库表不存在该字段,所以出现异常;后来跟管理数据库的同事沟通,确实是他那边没提供最新的数据表,更新表后,问题解决。

 

3、经验

对于可能出现的配置的问题或者数据库表的问题,千万及时反馈,和同事交流;切勿一根筋在代码上面找问题。

 

 

 

 

### 解决 `com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database` 错误 当遇到此错误时,明应用程序尝试访问一个不存在于 MySQL 数据库服务器上的数据库。以下是几种可能的原因及解决方案: #### 验证数据库名称拼写 确认所提供的数据库名是否正确无误,注意大小写的敏感性以及任何多余的字符或斜杠的存在[^1]。 ```sql SHOW DATABASES; ``` 该命令用于显示所有可用的数据库列,以此验证目标数据库确实存在并可被当前用户访问。 #### 检查 URL 连接字符串配置 确保 JDBC 连接 URL 中指定的目标数据库路径准确无误。对于某些框架,默认情况下可能会自动添加前导斜线 `/` 到数据库名字串之前;然而,在标准的 MySQL 协议里这并不是必需的部分,并可能导致上述提到的问题发生。因此建议移除不必要的开头斜杆以防止潜在冲突[^4]。 正确的URL格式应类似于如下所示: ```plaintext jdbc:mysql://hostname:port/databaseName?useSSL=false&serverTimezone=UTC ``` #### 用户权限设置审查 即使数据库存在于服务器上,如果没有授予适当的操作许可给执行查询指令的身份认证账户,则同样会触发类似的语法异常提示。可以通过运行下面 SQL 来查看特定用户的授权情况: ```sql SELECT * FROM information_schema.SCHEMA_PRIVILEGES WHERE GRANTEE LIKE '%username%'; ``` 必要时赋予足够的读取/修改权利以便正常操作所需资源单数据记录项等内容[^3]。 #### 测试连接独立性 利用简单的 Java 应用程序片段测试单独建立至所期望使用的具体实例之间的链路状况良好与否。这样可以排除其他环境因素干扰诊断过程中的准确性判断依据。 ```java import java.sql.Connection; import java.sql.DriverManager; public class TestConnection { public static void main(String[] args){ String url = "jdbc:mysql://localhost:3306/test"; // 替换成实际地址 try{ Connection conn = DriverManager.getConnection(url,"root","password"); System.out.println("成功建立了与数据库 'test' 的连接!"); conn.close(); }catch(Exception e){ System.err.println(e.getMessage()); } } } ``` 通过以上方法排查定位问题根源所在之后再采取相应措施加以修正即可有效处理此类异常情形。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值