JSP 界面sql语句执行

jsp 专栏收录该内容
10 篇文章 0 订阅
	在工作中,博主是外包,项目上生产之后,甲方会以各种理由不让你轻易改动数据库(包括查询),虽然大家会理解这种行为,毕竟为了稳定,但一旦生产报错,问题的排查也会很艰难,这时,如果给自己的项目留一个能查询sql的功能,会变得异常实用。下面就是我的内容:
  1. JSP页面
<div id="ac">
	<div>
		<textarea id="sqlText" style="width:90%; padding:30px;" rows="20"></textarea>
		<input type="button" value="确定" onclick="showData(this)"/>
	</div>
	<br/>
	<br/>
	<br/>
	&nbsp;&nbsp;&nbsp;Result:
	<br/>
	<br/>
	<div id="csrNodeTemp">
		<table>
			<tr style="background-color:#E0F2FE;">
				<td>&nbsp;1</td>
				<td></td>
			</tr>
			<tr>
				<td></td>
				<td></td>
			</tr>
		</table>
	</div>
</div>
<!-- 获得项目路径 -->
<c:set var="ctx" value="${pageContext.request.contextPath}" />
<script type="text/javascript">
	//刷新节点数据
	function showData(obj){
		var sData = $("#sqlText").val();
		var randomnumber = Math.floor(Math.random()*100000);
		$.ajax({
			type:"get",
			data:{
				randomnumber:randomnumber,
				sqlStr:sData
			},
			url:"${ctx}/common/querySyn/querySqlInfo",
			async:true,
			dataType:"text",
			succsess:function(data){
				$("#csrNodeTemp").html(data);
			}
		});
	}
</script>
页面比较Low,仅仅是一个输入sql语句的textarea以及显示结果的table,输入sql语句后,点击确定按钮,执行sql(注意:sql语句末尾不用加";")。
  1. Controller
package cn.com.git.mar.intf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.thinkee.common.web.controller.BaseController;

import org.apache.commons.lang3.StringUtils;

@Controller
@RequestMapping(value="common/querySyn")
public class SynQueryController extends BaseController{

	@Autowired
	private IQueryDataService queryDataService;
	
	@RequestMapping(method=RequestMethod.GET,value="querySqlInfo")
	@ResponseBody
	public Object querySqlInfo(String sqlStr) throws Exception{
		String result = "";
		
		if(StringUtils.isNotEmpty(sqlStr)){
			try{
				result = queryDataService.querySQLHTMLResult(sqlStr);
			}catch(Exception e){
				result = e.getMessage();
			}
		}
		
		return result;
	}
	
	@RequestMapping(method=RequestMethod.GET,value="showPage")
	public ModelAndView showPage(){
		ModelAndView m = new ModelAndView();
		m.setViewName("report/report_query");
		return m;
	}
}
  1. Service
package cn.com.git.mar.intf;

public interface IQueryDataService {
	
	public String querySQLHTMLResult(String sql) throws Exception;
}
package cn.com.git.mar.intf;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class IQueryDataServiceImpl implements IQueryDataService {

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	private static String PREFIX = "<table>";
	
	private static String POSTFIX = "</table>";
	
	@Override
	public String querySQLHTMLResult(String sql) throws Exception {
		Connection conn = null;
		PreparedStatement ps = null;
		try{
			conn = jdbcTemplate.getDataSource().getConnection();
			if(sql.toUpperCase().startsWith("SELECT")){
				sql = checkQuerySql(sql);
				ps = conn.prepareStatement(sql);
				ResultSet rs = ps.executeQuery();
				ResultSetMetaData metaData = rs.getMetaData();
				int colNum = metaData.getColumnCount();
				//填充表头
				StringBuffer strTitle = new StringBuffer();
				strTitle.append("<tr align=\"center\" style=\"background-color:#E0F2FE;\"><td></td>");
				for(int i=1;i<=colNum;i++){
					strTitle.append("<td>");
					strTitle.append(metaData.getColumnClassName(i));
					strTitle.append("</td>");
				}
				strTitle.append("</tr>");
				//填充数据
				int dataCount = 0;
				StringBuffer strData = new StringBuffer();
				while(rs.next()){
					dataCount++;
					strData.append("<tr align=\"center\">");
					strData.append("<td>" + dataCount + "</td>");
					for(int i=1;i<=colNum;i++){
						if(rs.getObject(i)==null){
							strData.append("<td></td>");
						}else{
							//标题名不超过40个字符
							String data = rs.getObject(i).toString();
							if(data.length() > 40){
								data = data.substring(0,39);
							}else{
								data = data.toString();
							}
							strData.append("<td><label title='" + rs.getObject(i) + "'>" + data + "<label></td>");
						}
					}
					strData.append("</tr>");
				}
				return PREFIX + strTitle.toString() + strData.toString() + POSTFIX;
			}else{
				ps = conn.prepareStatement(sql);
				int s = ps.executeUpdate();
				return PREFIX + "<tr><td>执行成功,共影响行数:" + s + "</td></tr>" + POSTFIX;
			}
		}catch(Exception e){
			throw e;
		}
	}

	private String checkQuerySql(String sql) {
		if(sql.toUpperCase().indexOf("ROWNUM")<0){
			String sqlStr = "SELECT * FROM (" + sql + ") C WHERE ROWNUM<60";
			return sqlStr;
		}else{
			return sql;
		}
	}

}

  1. 总结
    代码都比较简单,但博主的代码在自己的项目里仅支持查询,一旦使用update等增删改类语句,虽然返回的结果是已修改,但数据库中并没有变动,且涉及到的表均被锁住,如果有阅读过的朋友知道如何修改请告知博主,博主将感激不尽

有兴趣的话可以看看我的私人博客,也可以关注我的公众号,说不定会有意外的惊喜。

在这里插入图片描述

  • 1
    点赞
  • 2
    评论
  • 5
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

death05

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值