如何从MySQL发送和接收原始字符串

时间:2018-06-30 22:25:53

标签: mysql jdbc server

我正在研究类似SQL Developer的应用程序,其中用户输入一些SQL命令,服务器的结果显示在网页上的<div>中。

问题是用户可以输入ANY字符串,无论是否输入有效的SQL,例如,如果用户发送select * from employees;我想接收并显示在 <div>文本完全如下:

+---------+----------+---------------+----------+
| user_id | username | full_name     | password |
+---------+----------+---------------+----------+
|       1 | john     | John Doe      | admin    |

当他输入错误的SQL字符串时,<div>消息应该是标准的MySQL错误字符串,例如:

mysql> select * from usrsss;
ERROR 1146 (42S02): Table 'mydb.usrsss' doesn't exist

我知道安全风险,目前我不在乎。

能做到这一点,因为我无法控制用户发送的SQL字符串语法吗?

2 个答案:

答案 0 :(得分:1)

首先,您在mysql>处看到的提示代表 MySQL Shell 。这不是SQL或JDBC,而是MySQL提供的命令行界面。

此MySQL Shell允许您执行:

  • SQL语句。
  • 不属于SQL的各种其他语句。

要使用的JDBC API将允许您运行第一组语句-SQL语句。不幸的是,它不允许您运行第二个程序,因此您对此不走运。

此外,对于第一组,JDBC API将提供与使用MySQL Shell时看到的错误代码和错误消息不完全相同的消息。

最重要的是,您可以模拟其中一些命令,但是体验可能并不完全相同。

但是...这是一个很大的问题,为什么首先要这样做?我的一位开发人员问我是否可以这样做,因为这并不难实现。这样,我们可以轻松地从网页上运行任何SQL命令。大?好吧这是巨大的安全风险。如果有人入侵您的网页,您将暴露整个数据库。

换句话说,不要将此代码部署到生产环境中。

答案 1 :(得分:1)

如果您使用的是java.sql.Connection

  • 首先使用.createStatement()创建一条语句。
  • 使用.executeQuery()进行搜索
  • .executeUpdate()用于插入,更新和删除

搜索时,确定要创建表的列数。

ResultSet rs = statement.executeQuery(String sql);
ResultSetMetaData metaData = rs.getMetaData();

ResultSetMetaData中,

  • .getColumnCount()将为您提供列数。
  • 在for循环中创建列,而创建.getColumnName(int index)将为您提供列名。

创建表后,迭代ResultSet

while (rs.next()) {
    rs.getString(int columnIndex);
}

使用上述方法获取值,然后向表中添加行。

别忘了用

包围代码块
try{

} catch(Exception e){
     e.getMessage();
}

因此,如果出现任何问题,可以抛出SQLException。这将包括一条消息,指出错误的可能原因。

努力出路,尽情享受吧!