1. 程式人生 > >SpringMVC與Mybatis集合實現呼叫儲存過程、事務控制

SpringMVC與Mybatis集合實現呼叫儲存過程、事務控制

在SSM框架中經常會用到呼叫資料庫中的儲存過程、以及事務控制,下面以儲存某單據為例,介紹一下:

1、Oracle中儲存過程程式碼如下(主要邏輯將單據編碼自動加1,並將該單據編碼返回):

CREATE OR REPLACE PROCEDURE "UPDATE_DJBHZT" (p_GSID in varchar2, p_TBLNAME in varchar2,
                                   NewRecNo out Number) as
begin
    update BHDJ set BHDJ02 = BHDJ02+1 where GSXX01 = p_GSID and BHDJ01 = p_TBLNAME;
    if sql%rowcount = 0 then
       insert into BHDJ (GSXX01, BHDJ01,BHDJ02) values(p_GSID, p_TBLNAME,1);
    end if;
    select BHDJ02 into NewRecNo from BHDJ where GSXX01 = p_GSID and BHDJ01 = p_TBLNAME;
end;
2、Mybatis中程式碼如下:
<select id="update_djbhzt" parameterType="java.util.Map" statementType="CALLABLE">
<![CDATA[  
    {call UPDATE_DJBHZT(#{p_GSID,mode=IN,jdbcType=VARCHAR},#{p_TBLNAME,mode=IN,jdbcType=VARCHAR},#{NewRecNo,mode=OUT,jdbcType=BIGINT})}  
]]>
</select>
3、Dao層程式碼如下:
package com.pcmall.dao.sale.stock;

import java.util.List;
import java.util.Map;

import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.pcmall.dao.common.BaseMapper;
import com.pcmall.domain.sale.stock.Zcd;

public interface ZcdMapper extends BaseMapper<Zcd> {
    
    void update_djbhzt(Map<String,Object> map); 

}

4、Service層程式碼如下:

介面:

package com.pcmall.service.sale.stock;

import java.util.List;

import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.pcmall.domain.sale.order.HssnCmmx;
import com.pcmall.domain.sale.stock.Zcd;
import com.pcmall.domain.sale.stock.Zcditem;
import com.pcmall.domain.sale.user.User;
import com.pcmall.domain.vo.ResponseVO;
import com.pcmall.service.common.IBaseService;

public interface IZcdService extends IBaseService<Zcd> {

	Long getZcdNo(String gsxx01, String tablename);

	ResponseVO saveZcd(Zcd zcd, User user) throws Exception;
	
}


實現類:

package com.pcmall.service.sale.stock.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.axis.holders.SchemaHolder;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.google.common.collect.Collections2;
import com.pcmall.common.utils.DateUtils;
import com.pcmall.dao.sale.stock.ZcdMapper;
import com.pcmall.dao.sale.stock.ZcditemMapper;
import com.pcmall.domain.sale.order.HssnCmmx;
import com.pcmall.domain.sale.promotion.HsCxlx;
import com.pcmall.domain.sale.stock.Zcd;
import com.pcmall.domain.sale.stock.Zcditem;
import com.pcmall.domain.sale.stock.bo.CkspBO;
import com.pcmall.domain.sale.user.User;
import com.pcmall.domain.vo.ResponseVO;
import com.pcmall.service.common.AbstractServiceImpl;
import com.pcmall.service.sale.order.IOrderService;
import com.pcmall.service.sale.stock.IStockService;
import com.pcmall.service.sale.stock.IZcdService;

@Service
public class ZcdServiceImpl extends AbstractServiceImpl<Zcd> implements IZcdService {
	
	@Resource
	private ZcdMapper zcdMapper;
	
	@Resource
	private ZcditemMapper zcditemMapper;
	
	@Resource
	private IStockService stockServiceImpl;
	
	
	@Transactional(rollbackFor = Exception.class)
	@Override
	public ResponseVO saveZcd(Zcd zcd, User user) throws Exception {
		ResponseVO responseVO = new ResponseVO();
		Long zcd01 = getZcdNo(zcd.getGsxx01(), "ZCD");
		zcd.setZcd01(zcd01);
		zcd.setZcd05(user.getRyxx().getRyxx02());
		zcd.setZcd06(new Date());
		
		Date nowTime = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("hhmmssms");
		zcd.setTime01(sdf.format(nowTime));
		
		
		for(Zcditem zcditem : zcd.getZcditem()){
			zcditem.setZcd01(zcd01);
			zcditemMapper.insertSelective(zcditem);
		}
		
		zcdMapper.insertSelective(zcd);
		
		responseVO.setData(zcd);
		return responseVO;
	}


	@Override
	public Long getZcdNo(String gsxx01, String tablename) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("p_GSID", gsxx01);
		map.put("p_TBLNAME", tablename);

		zcdMapper.update_djbhzt(map);
		Long NewRecNo = (Long) map.get("NewRecNo");
		return NewRecNo;
	}
}


5、Control層程式碼如下:

package com.pcmall.controller.stock.zcd;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.pcmall.common.base.BaseController;
import com.pcmall.domain.sale.stock.Zcd;
import com.pcmall.domain.sale.stock.Zcditem;
import com.pcmall.domain.sale.stock.bo.CkspDetailBO;
import com.pcmall.domain.sale.stock.bo.ZcdBO;
import com.pcmall.domain.sale.system.Gzzqx;
import com.pcmall.domain.sale.system.GzzqxKey;
import com.pcmall.domain.sale.system.Ryxx;
import com.pcmall.domain.sale.user.Czy;
import com.pcmall.domain.sale.user.User;
import com.pcmall.domain.vo.ResponseVO;
import com.pcmall.service.sale.stock.IStockService;
import com.pcmall.service.sale.stock.IZcdService;
import com.pcmall.service.sale.system.IGzzqxService;

@Controller
@RequestMapping("/stock/zcd")
public class ZCDController extends BaseController {
	
	private static Logger logger=LoggerFactory.getLogger(ZCDController.class);
	
	@Resource
	private IZcdService zcdServiceImpl;
	
	
	@Resource 
	private IStockService stockServiceImpl;
	
	@Resource
	private IGzzqxService gzzqxServiceImpl;
	
	
	
	@RequestMapping("/saveZcd")
	@ResponseBody
	public ResponseVO saveZcd(HttpServletRequest request, @RequestBody Zcd zcd){
		ResponseVO responseVO = new ResponseVO();
		try{
			responseVO = zcdServiceImpl.saveZcd(zcd, getLoginUser());
			responseVO.setSuccess(true);
		}
		catch (Exception e) {
			logger.error("",e);
			responseVO.setSuccess(false);
			responseVO.setErrorMsg(!"".equals(e.getMessage()) ? e
					.getMessage() : "後臺異常");
		}
		return responseVO;
	}
	
}


6、前端js層程式碼如下:
function save() {
		$("#save").addClass("disabled");
		
		if ($("#selSHCK").val() == "") {
			layer.msg('請填寫收貨倉庫', {
				icon : 5
			});
			$("#save").removeClass("disabled");
			return;
		}
		
		if($("#selSHCK").val() == $("#selFHCK").val()){
			layer.msg('發貨倉庫與收貨倉庫不能一樣', {
				icon : 5
			});
			$("#save").removeClass("disabled");
			return;
		}
		
		

		var param = {};
		param.bm01 = $("#selBm").attr("valuea");
		param.zcd02 = $("#selFHCK").attr("valuea");
		param.zcd03 = $("#selSHCK").attr("valuea");
		param.zcd04 = $("#zcd04").val();
		param.gsxx01 = $("#gsxx01").val();

		var zcditemAry = [];
		var flag = 0;
		$("#tbody1").find("tr").each(function() {
			var zcditem = {};
			var arrtd = $(this).children();

			zcditem.spxx01 = $.trim(arrtd.eq(0).text());
			zcditem.wldw01 = $.trim(arrtd.eq(6).text());
			zcditem.zcdi01 = $.trim(arrtd.eq(7).text());
			
			if($.trim(arrtd.eq(2).children(".zcdi03").val()) == ""){
				/* layer.msg('請輸入轉倉數量', {
					icon : 5
				});
				$("#save").removeClass("disabled"); */
				
				flag = 1;
				return;
			}
			
			zcditem.zcdi02 = $.trim(arrtd.eq(2).children(".zcdi03").val());
			zcditem.zcdi03 = $.trim(arrtd.eq(2).children(".zcdi03").val());
			zcditem.zcdi05 = $.trim(arrtd.eq(8).text());
			zcditem.zcdi06 = $.trim(arrtd.eq(4).children(".zcdi06").val());
			zcditem.gsxx01 = $("#gsxx01").val();
			zcditem.zcdi07 = $.trim(arrtd.eq(9).text());
			zcditemAry.push(zcditem);
		})
		param.zcditem = zcditemAry;

		if(flag == 1){
			layer.msg('請輸入轉倉數量', {
				icon : 5
			});
			$("#save").removeClass("disabled");
			return;
		}
		
		if (zcditemAry.length == 0) {
			layer.msg('請輸入轉倉商品資訊', {
				icon : 5
			});
			$("#save").removeClass("disabled");
			return;
		}
	/* 	else{
			for(var i=0;i<zcditemAry;i++){
				if(zcditemAry[i].zcdi03 == ""){
					layer.msg('請輸入轉倉數量', {
						icon : 5
					});
					$("#save").removeClass("disabled");
					return;
				}
			}
		} */

		$.ajax({
			url : "${ctx }/stock/zcd/saveZcd",
			data : $.json.decode(param),
			contentType : "application/json",
			type : "POST",
			dataType : "json",
			success : function(data) {
				if (data.success) {
					$("#zcd01").val(data.data.zcd01);
					$("#zcd05").val(data.data.zcd05);
					$("#zcd06").val(data.data.zcd06);
					layer.msg('制定轉倉單成功', {
						icon : 6
					});
				} else {
					layer.msg('制定轉倉單失敗' + data.errorMsg, {
						icon : 5
					});
					$("#save").removeClass("disabled");
				}
			}
		});
	}

相關推薦

SpringMVCMybatis集合實現呼叫儲存過程事務控制

在SSM框架中經常會用到呼叫資料庫中的儲存過程、以及事務控制,下面以儲存某單據為例,介紹一下: 1、Oracle中儲存過程程式碼如下(主要邏輯將單據編碼自動加1,並將該單據編碼返回): CREATE OR REPLACE PROCEDURE "UPDATE_DJBHZT"

mybatis註解方式呼叫儲存過程

1.建立儲存過程: CREATE DEFINER=`root`@`%` PROCEDURE `p_dmk_fsyx`(v_month VARCHAR(6),v_type VARCHAR(2),OUT result INT(2)) BEGIN IF @v_type=1 THE

ASP中呼叫儲存過程語法寫法-sql server資料庫,return,output

ASP與儲存過程(Stored Procedures)的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜

資料庫儲存過程事務 jfinal中呼叫儲存過程事務

mysql DELIMITER $$ CREATE PROCEDURE `student`.`ceshi`(n INT,j CHAR(1)) BEGIN IF j = 'h' THEN SELECT * FROM blog

遊標例外儲存過程儲存函式java呼叫儲存過程觸發器(Oracle之二)

--遊標(游標) 一般用於多行資料 語法:cursor 遊標名稱 (引數名 引數型別 ..) is select語句 --操作遊標 open 遊標名; --開啟遊標 loop   fetch 遊標名

EF呼叫儲存過程函式

一.ef4.1 codeFirst 修改表結構 增加欄位等 EF code first需要重新生成庫導致資料丟失的問題 說這個問題前 首先先說下 我使用ef4.1 codefirst的目的. 是因為可以有更純淨的POCO 不再有EDMX這些東西  而不是真正的用 cod

spring+ibatis+junit呼叫儲存過程事務不提交(rolled back)

在用junit進行單元測試時,呼叫sql server庫的儲存過程,會報如下問題,即事務自動回滾:10:44:56.682 [main] WARN - Unable to proxy method [public final void org.springframewor

MySQL:檢視觸發器儲存過程事務

檢視: 檢視,虛擬表 建立虛擬表: # 語法: # create view 虛擬表名稱 as 虛擬表; create view course_and_teacher as select * from course inner join teacher on course.teacher_id =

SqlServer中檢視儲存過程事務的使用。

前言 熟悉SqlServer中檢視、儲存過程、事務的使用會在操作資料時帶來更大的方便。 正文 檢視-VIEW VIEW介紹 定義: 檢視(VIEW)虛擬表,一般是不儲存資料的,但是Sqlserver的索引檢視例外(儲存資料)

mysql筆記三-----sql儲存過程事務的隔離級別和sql各查詢的區別防黑

儲存過程 ※※儲存過程※※※ 定義: create procedure 過程名(引數) begin 多條sql語句 end 呼叫: call 過程名(實參) 例項1--無參的儲存過程: △小細節:要把預設的語句結束“;”號改成其它如“$$”,

mybatisibatis呼叫儲存過程的方式

呼叫儲存過程的兩種方式: <!-- 呼叫儲存過程進行的操作 --> <parameterMap class="java.util.HashMap" id="bailRefundResultList"><parameter property="

藉助一個數據庫表來維護主鍵(mybatis呼叫儲存過程)

###建立主鍵表 CREATE TABLE c_table_key ( table_name varchar(50) NOT NULL COMMENT ‘需要建立主鍵的表名’, last_key bigint(20) NOT NULL COMMENT ‘最後一次使用的主鍵,新的主鍵將在此

springMVC呼叫儲存過程,entity檔案寫法

<!--廣告任務申請,被稽核通過--> <select id="approveAdTask" statementType="CALLABLE" parameterType="java.util.Map"> {call approveAdTask( #{sn,mod

asp.net core 2.1 dotnet(五)EF.core Dbfirst 生成 檢視呼叫儲存過程

1 檢視,可以直接在 Model中寫 檢視的模型 執行方式如找到一個,還沒有試過:     有關 .net core EF 的問題有一個地址: https://github.com/aspnet/EntityFra

mybatis 呼叫儲存過程報錯 org.apache.ibatis.mapping.ParameterMode.IN

“` org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error resolving ParameterMode.

儲存過程呼叫儲存過程

--建立儲存過程的語法 if exists(select * from sysobjects where name='sp_selectStudent')  drop procedure sp_selectStudent go create procedure sp_selectStud

ztreespringmvc+spring+mybatis整合實現增刪改查

 在springmvc+spring+mybatis裡整合ztree實現增刪改查,上一篇已經寫了demo,下面就只貼出各層實現功能的程式碼: Jsp頁面實現功能的js程式碼如下: <script> //用於捕獲分類編輯按鈕的 click 事件

Mybatis 呼叫儲存過程 並返回單/多結果集的情況

 返回單結果集的情況: 引用: https://blog.csdn.net/a9529lty/article/details/24401423 儲存過程示例:  create or replace procedure Fsp_Plan_CheckPrj(v

java中使用mybatis呼叫儲存過程,拿到返回值(單引數返回值)

service業務層呼叫dao層 注意:返回值直接從物件裡獲取 不需要拿物件接收再獲取 dao.uspGetUser(userPO);//物件封裝了儲存過程的入參和出參 count = userPO.getCount(); //count 是儲存過程的返回值 dao層介面 pu

mybatis 呼叫儲存過程

mapper.xml <select id="callPWfSubmit" parameterType="java.util.Map" resultType="java.util.Map" statementType="CALLABLE" > {CA