0

0

如何直接在浏览器内运行SQL命令_MySQL

php中文网

php中文网

发布时间:2016-06-01 14:10:37

|

2717人浏览过

|

来源于php中文网

原创

     本文示范了如何用一个Java Servlet、一个JSP页面和一个静态Java类构造出一个SQL网关应用。利用这个应用,你可以直接在浏览器内执行SQL命令,浏览器将把SQL命令提交给远程服务器上的数据库系统,然后返回结果。

  如果你正在使用ISP(Internet Service Provider)提供的数据库,可能已经熟悉SQL网关应用的概念了。有的ISP会提供一个操作数据库的HTML页面,就象本文提供的网关应用一样。如果ISP没有提供这样的界面,你可以把本文的程序上载到服务器,以后要访问ISP服务器上的数据库就很方便了。

  SQL网关应用不仅可以用于开发过程,而且还可以直接提供给比较熟悉系统的最终用户使用。当然,允许最终用户直接在数据库上运行SQL命令会带来一些安全隐患,应当慎重考虑。

  本文要求读者具备一定的Java、Servlet、JSP和数据库的基础知识,如果要运行本文的程序,还要有一个Servlet/JSP服务器和数据库服务器。在下面的说明中,我们要使用的是Tomcat 4.0和MySQL,但它应该也能在其他JSP/Servlet容器中运行;如果你要改用MySQL之外的其他数据库,只要提供一个适当的驱动程序,然后修改数据库连接字符串就可以了。

  一、用户界面

  图1就是本文SQL网关的用户界面。在这个界面中,SQL网关已经执行了一条SQL命令并返回了结果。

如何直接在浏览器内运行SQL命令_MySQL

图1:SQL网关的用户界面


  从图1可以看出,页面底部的一条信息显示出最近执行的SQL命令影响的行数。如果SQL命令是一个SELECT语句,当SELECT语句执行成功,页面底部将用HTML表格显示出查询结果,如图二所示。

如何直接在浏览器内运行SQL命令_MySQL

图2:HTML表格显示出查询结果集


  当然,如果SQL命令执行失败,SQL网关将返回异常信息。

  二、设计JSP页面

  在JSP页面中,我们首先放入一个Scriptlet,它的功能是从session对象提取两个属性:

@@######@@


  第一个属性sqlStatement 表示SQL命令字符串,第二个属性message 是包含结果信息的字符串。如果这两个属性的值是null,则表示它们尚未被设置,我们把sqlStatement和message变量设置成空字符串。

  JSP页面还有一个HTML表单,HTML表单包含一个文本区域(TEXTAREA)和一个“执行”按钮。

@@######@@


  表单中的文本区域用来输入SQL命令。我们将sqlStatement变量的值作为文本区域的默认内容,文本区域的大小是宽60字符、高8行。当JSP页面第一次运行时,这个文本区域的内容为空。如果用户点击文本区域下面的“执行”按钮,JSP页面把表单内容提交给SQLGatewayServlet(稍后再详细介绍)。

  JSP页面底部的表格显示出message字符串的内容。如前所述,message的内容是运行SQL命令的结果。

@@######@@


  三、编写Servlet

  SQLGatewayServlet首先导入java.sql包以便使用JDBC类。另外,它还要声明一个Connection对象,以便Servlet之内的所有方法都可以使用数据库连接。

@@######@@


  当Servlet引擎开始运行这个Servlet,Servlet的init方法就打开一个数据库连接:

@@######@@


  在这个例子中,Servlet利用一个MysQL数据库的驱动程序打开murach数据库的连接,数据库和Servlet运行在同一个服务器上。此外,Servlet使用MySQL的默认用户名字root,密码为空。不过,你可以修改这里的代码,只要有适当的驱动程序,就可以让Servlet连接到任何服务器上的任何数据库(有关MySQL数据库的更多信息,请参见www.mysql.com)。

  Servlet引擎关闭Servlet之前,调用destroy方法关闭数据库连接,释放连接资源:

@@######@@


  前面介绍的JSP页面要调用Servlet的doPost方法,doPost方法调用doGet方法:

@@######@@


  在doGet方法之中,第一个语句首先获取用户在JSP页面中输入的SQL命令,第二个语句声明message变量:

@@######@@


  然后,在try块之内,第一个语句利用Connection对象创建Statement对象,接下来的两个语句利用String对象的trim方法和substring方法返回用户输入的SQL命令的前六个字符。

@@######@@


  如果SQL命令的前六个字符是“select”,则利用Statement的executeQuery方法执行SQL语句,获得一个ResultSet对象,把这个对象传递给SQLUtil类(稍后详细说明)的getHtmlRows方法,getHtmlRows方法将把记录集中的记录格式化成HTML表格并返回。

@@######@@


  如果SQL语句的前六个字符不是“select”,则我们调用Statement对象的executeUpdate方法,executeUpdate方法返回当前操作影响的行数――如果这个数字是0,则该SQL命令是一个DDL命令,例如DROP TABLE或CREATE TABLE等;否则,则表明SQL命令可能是DML命令,如INSERT、UPDATE或DELETE命令。无论是哪一种SQL命令,我们都把message变量设置成相应的消息。

@@######@@


  如果try块里面的任何一个语句抛出一个SQLException,catch块就设置message变量,使其包含有关该SQLException的信息。例如,如果在表单中输入的SQL命令语法错误,下面设置的message变量值将帮助你排解错误。

@@######@@


  在catch块之后,接下来的三个语句获得session对象,把sqlStatement和message变量设置为session的属性:

@@######@@


  接下来,最后两个语句创建一个RequestDispatcher,并转发request和response对象给前文介绍的JSP页面:

@@######@@


  四、编写工具类

  下面来看看工具类SQLUtil的代码:

@@######@@


  SQLUtil类包含一个getHtmlRows静态方法,前面的Servlet正是通过调用该方法将结果集格式化成HTML表格。getHtmlRows的输入参数是一个ResultSet对象,其返回值是一个String对象,这个String对象的内容是记录集的所有列表题和行的HTML代码。为了构造出这样一个String对象,getHtmlRows声明了一个名为htmlRows的StringBuffer对象,然后在方法执行过程中向这个StringBuffer对象追加数据。在getHtmlRows方法的末尾,我们用toString方法将StringBuffer的内容转换成String,最后将这个String返回给Servlet:

@@######@@


  为了获得记录集对象的列标题,getHtmlRows方法利用ResultSet的getMetaData方法来创建一个ResultSetMetaData对象,ResultSetMetaData对象包含了有关记录集的描述信息,例如列的数量、列的名称可以分别调用ResultSetMetaData的getColumnCount和getColumnName方法获得。

  为了提取记录集的数据,getHtmlRows方法利用一个嵌套的循环,即while循环里面嵌套的for循环,来提取每一个行里面每一个列的值。在循环之内,我们用记录集的getString方法来获取各个字段的值,不管字段值原来的类型是什么,getString方法都会将它转换成String。

  请注意这个方法的声明中带有synchronized关键词,这是为了避免两个或两个以上的Servlet线程同时执行该方法。

  下载本文的代码:SqlGateway_code.zip。

<% 
   String sqlStatement=(String)session.getAttribute("sqlStatement");
   if (sqlStatement == null)    sqlStatement = "";
   String message =  (String) session.getAttribute("message");
   if (message == null)  message = "";
%>
SQL命令:


SQL命令执行结果:
<%=message%>
package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class SQLGatewayServlet extends HttpServlet{

    private Connection connection;
public void init() throws ServletException{
    try{
        Class.forName("org.gjt.mm.mysql.Driver");
        String dbURL = "jdbc:mysql://localhost/murach";
        String username = "root";
        String password = "";
        connection = DriverManager.getConnection
	(dbURL, username, password);
    }
    catch(ClassNotFoundException e){
        System.out.println("找不到数据库驱动程序.");
    }
    catch(SQLException e){
        System.out.println("不能打开数据库连接: "
                           + e.getMessage());
    }
}
public void destroy() {
    try{
        connection.close();
    }
    catch(SQLException e){
        System.out.println("不能关闭数据库连接: " + e.getMessage());
    }
}
public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
                   throws IOException, ServletException{
     doGet(request, response);
 }
public void doGet(HttpServletRequest request,
                   HttpServletResponse response)
                   throws IOException, ServletException{

     String sqlStatement = request.getParameter("sqlStatement");
     String message = "";
try{
     Statement statement = connection.createStatement();
     sqlStatement = sqlStatement.trim();
     String sqlType = sqlStatement.substring(0, 6);
if  (sqlType.equalsIgnoreCase("select")){
     ResultSet resultSet = statement.executeQuery(sqlStatement);
     // 构造一个String,其中包含HTML表格形式的结果集数据
     message = SQLUtil.getHtmlRows(resultSet);
 }
else
     {
         int i = statement.executeUpdate(sqlStatement);
         if (i == 0) // 这是一个DDL命令
           message =
             "" +
               "命令执行成功." +
             "";
         else // 这是一个INSERT、UPDATE或DELETE命令
             message =
               "" +
                 "SQL命令执行成功。
" + "已更改" + i + " 行。" + ""; } statement.close(); }
catch(SQLException e){
    message = "执行SQL命令时遇到错误:
" + e.getMessage() + ""; }
HttpSession session = request.getSession();
 session.setAttribute("message", message);
 session.setAttribute("sqlStatement", sqlStatement);
RequestDispatcher dispatcher =
     getServletContext().getRequestDispatcher(
         "/sql/sql_gateway.jsp");
 dispatcher.forward(request, response);
package test;
import java.sql.*;
public class SQLUtil{
public static synchronized String getHtmlRows(ResultSet results)
throws SQLException{
    StringBuffer htmlRows = new StringBuffer();
    ResultSetMetaData metaData = results.getMetaData();
    int columnCount = metaData.getColumnCount();
    // 将记录集中列的名称作为HTML表格列的标题
    htmlRows.append("");
    for (int i = 1; i <= columnCount; i++)
        htmlRows.append("" + metaData.getColumnName(i) + "");
    htmlRows.append("");
    // 对于结果集中的每一行...
    while (results.next()){
        htmlRows.append("");
        // 将该行中的每一个列转换成一个表格单元
        for (int i = 1; i <= columnCount; i++)
            htmlRows.append("" + results.getString(i) + "");
    }
    htmlRows.append("");
    return htmlRows.toString();
}

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
AngularJS教程
AngularJS教程

共24课时 | 3.2万人学习

ECMAScript6 / ES6---十天技能课堂
ECMAScript6 / ES6---十天技能课堂

共25课时 | 2万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号