#java #mysql #jdbc
#java #mysql #jdbc
Вопрос:
Я только начал связываться с JDBC и столкнулся с некоторой проблемой, связанной с CallableStatement, вот мой код:
Connection connection=null;
CallableStatement statement=null;
try {
connection = DriverManager.getConnection(DBTools.getDbUrl(), DBTools.getUSER(),DBTools.getPASSWD());
String getNameSQL="{call getName (?,?)}";
statement=connection.prepareCall(getNameSQL);
int empID=103;
String empName;
statement.setInt(1,empID);
statement.registerOutParameter(2, Types.VARCHAR);
System.out.println("Execute: " statement.execute());
empName=statement.getString(2);
System.out.println("Emp Name with ID:" empID " is " empName);
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
Его вывод на консоль является:
java.sql.SQLException: The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1020)
at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.executeMetadataQuery(DatabaseMetaDataUsingInfoSchema.java:70)
at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.getProcedureColumns(DatabaseMetaDataUsingInfoSchema.java:769)
at com.mysql.cj.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:790)
at com.mysql.cj.jdbc.CallableStatement.<init>(CallableStatement.java:585)
at com.mysql.cj.jdbc.CallableStatement.getInstance(CallableStatement.java:484)
at com.mysql.cj.jdbc.ConnectionImpl.parseCallableStatement(ConnectionImpl.java:1523)
at com.mysql.cj.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:1548)
at com.mysql.cj.jdbc.ConnectionImpl.prepareCall(ConnectionImpl.java:1539)
at main.JDBCCallableStatement.main(JDBCCallableStatement.java:13)
Строка 13 выглядит так: оператор=соединение.prepareCall(getNameSQL);
Я уверен, что функция mysql getName() была создана и работает хорошо, похоже, проблема в подключении, но я не знаю, как это исправить, надеюсь, вы можете дать мне несколько предложений.
Комментарии:
1. Кстати, код <connection = DriverManager.getConnection(DBTools.getDbUrl(), DBTools.getUser(), DBTools.getPASSWD()); > хорошо работает в моем другом проекте, использующем Statement и PreparedStatement , возможно, мой способ использования CallableStatement неверен.
2. где вы установили второй параметр ?
3. частная статическая конечная строка DB_URL = «jdbc: mysql://localhost:3306/test_db»; частная статическая конечная строка USER = «root»;