springMVC + oracle存儲過程 構建高性能靈活易維護的java web架構


本文為姜友瑤原創作品 非商業轉載請注明作譯者、出處,並保留本文的原始鏈接。否則追究法律責任!商業轉載請聯系作者!
更多作品請訪問我的個人網站 www.jyymatrix.cc

MVC讓簡單的業務也變得復雜

不知道你在使用MVC模式開發項目的時候是否覺得很麻煩,一個簡單的增刪改查動作卻要涉及到多個文件操作。

以一條數據增加為例說明。

假設我們使用hibernate並且dao層是已經封裝好的

從圖中可以看出如果我們在系統中寫一個增加功能需要自己動手寫的地方至少是 jsp , action , service,servicesImpl 四層。

如果是復雜的添加操作那么我們很可能還會自己定義dao層的接口和方法,那樣就是6層操作了。

如果使用mybatis 至少也是寫4層,常見的情況也是寫6層,因為我們需要自己寫一些sql語句,

這樣就要寫mapper.xml 和mapper.java 因此因為是6層。

一個簡單的動作寫4層或者6層我總覺得是那么麻煩的一件事情,而且容易出錯。

如果有一天這個新增動作需要添加一個字段,那么放在誰的目前都是一個蛋疼的動作了,添加一個字段足以讓你惡心半天了。

我們來看看要修改多少地方

1、數據庫

2、pojo

3、dao的配置文件

4、界面

可能還要修改action等其他地方。而且配置文件一動很容易出現bug。。。

哎總之我受夠了這樣的日子咯。。。。。 

 

 

兩層精簡架構

后來進入湖南比聯科技后再公司框架的啟發下我改造了一個使用springMvc 和 oracle存儲過程實現web架構的2層結構,從此福音到了

先看一個簡化的流程圖吧

 

我們把所有的業務邏輯通過oracle的過程來實現,然后只需要在頁面調用我們寫好的JavaScript庫就可以直接拿到過程處理的結果。

所以大部分的業務我們都只要2處理2個地方就可以了,先寫過程在寫界面調用。是不是很方便呢?而且過程處理的數據比mvc可是快很多哦,

至於界面顯示方面也是,html界面的讀取速度遠遠大於jsp頁面,所以性能方面是一個極大的提高。

還有我們這里沒有了pojo 所以如果修改字段,也不需要改動任何東西,改一下存儲過程和頁面就好了工作量比MVC中少了一倍。也就是說工作效率提高了2倍哦。

 

原理就是圖上所表示的下面用代碼來說明一下(以一個功能管理為例子):

 

數據庫表

 

-- Create table
create table EX_SYS_POWER
(
  ID            INTEGER not null,
  ICON_PATH     VARCHAR2(500),
  FUNCTION_PATH VARCHAR2(1000),
  MARK          VARCHAR2(4000),
  STATE         INTEGER,
  GRADE         INTEGER,
  PARENT_ID     INTEGER,
  YXBZ          INTEGER,
  NAME          VARCHAR2(500)
)

  

存儲過程

 

CREATE OR REPLACE PACKAGE BODY A_ES_POWER IS
  

  --=============根據id查詢
  PROCEDURE FIND_POWER_BYID(P_ID     INTEGER,
                            P_RESULT OUT PLAT_CONSTANT.RESULTSET) IS
  BEGIN
    OPEN P_RESULT FOR
      SELECT *
        FROM EX_SYS_POWER
       WHERE ID = P_ID
         AND YXBZ = 1;
  
  END;

END;

  

html界面

<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript" src="../../public/hui/lib/jquery/1.9.1/jquery.min.js" ></script>
<script type="text/javascript" src="../../public/exctscript/AjaxProxy.js" ></script>
<title>空白頁</title>
</head>
<body>
   	<a onclick="test()" href="javascript:void(0);" class='btn btn-success' >測試查詢</a>
   	<a onclick="test2()" href="javascript:void(0);" >字段測試</a>
<script type="text/javascript">
function test(){
	var loj=new AjaxProxy();
	loj.addParm(1, "1");
	loj.invoke("SCOTT.A_ES_POWER.FIND_POWER_BYID", function(result){
         alert(loj.getString("P_RESULT",1,"ICON_PATH"));
         alert(loj.getRowCount("P_RESULT")); }); 
}

 </script> 
</body>
</html>

  Ajaxprox.js 

/**
 * author :姜友瑤
 */

function getRootPath() {
	var curWwwPath = window.document.location.href;
	var pathName = window.document.location.pathname;
	return curWwwPath.substring(0, curWwwPath.indexOf(pathName))
			+ pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
}

var basePath = getRootPath();
document.write('<script type="text/javascript" src="' + basePath
		+ '/public/hui/lib/layer/1.9.3/layer.js"  ></script>');

function AjaxProxy(async) {

	if (async != null) {
		this.async = async;
	} else {
		this.async = true;
	}
	this.gs_parameter = {};
	this.STATE_SUCCESS = '1';
	this.STATE_ERR = '0';
	this.result = null;
}

AjaxProxy.prototype.invoke = function(procedure, callback) {
	var url = basePath + "/center.do?p_id=" + procedure;
	var $this = this;
	layer.msg('加載中', {
		icon : 16
	});
	if (this.async) {//異步
		$.ajax({
			type : "post",
			url : url,
			data : this.gs_parameter,
			async : true,
			success : function(callbackData) {
				var result = eval(callbackData);
				if (result.requestStatus == 0) {
					layer.closeAll('dialog');
					layer.msg(result.errMsg, {
						icon : 2
					});
					return;
				} else {
					$this.result = result;
					layer.closeAll('dialog');
					callback();
				}
			}
		});

	} else { //  同步
		$.ajax({
			type : "post",
			url : url,
			data : this.gs_parameter,
			async : false,
			success : function(callbackData) {
				var result = eval(callbackData);
				if (result.requestStatus == 0) {
					layer.closeAll('dialog');
					layer.msg(result.errMsg, {
						icon : 2
					});
					return;
				} else {
					$this.result = result;
					layer.closeAll('dialog');
					callback();
				}
			}
		});

	}

};

AjaxProxy.prototype.addParm = function(index, value) {
	if (value != null) {
		value += "";
		value = encodeURIComponent(value);
		this.gs_parameter["param_" + index] = value;
	}
};

AjaxProxy.prototype.getRowCount = function(mapName) {
	return eval("this.result." + mapName + "['row_count']");
};

AjaxProxy.prototype.getValue = function(key) {
	return eval("this.result." + key);
};

AjaxProxy.prototype.getString = function(mapName, index, key) {
	return eval("this.result." + mapName + ".row_value[" + index + "]['" + key
			+ "']");
};

這就是前台處理的部分了,后台部分就直接去我的百度雲下載吧

鏈接: http://pan.baidu.com/s/1eQuHwBK 密碼: jmpk

程序中都有注釋大家可以一起參考參考,有bug的地方可以告訴我啊,我在改進改進。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM