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");
        }
      }
    });
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

  • Spring Boot MyBatis 连接数据库配置示例

    最近比较忙,没来得及抽时间把MyBatis的集成发出来,其实mybatis官网在2015年11月底就已经发布了对SpringBoot集成的Release版本,示例代码:spring-boot_jb51.rar 前面对JPA和JDBC连接数据库做了说明,本文也是参考官方的代码做个总结. 先说个题外话,SpringBoot默认使用 org.apache.tomcat.jdbc.pool.DataSource 现在有个叫 HikariCP 的JDBC连接池组件,据说其性能比常用的 c3p0.tomca

  • 详解Spring Boot整合Mybatis实现 Druid多数据源配置

    一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分: 1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系. 2. DruidDataSource 高效可管理的数据库连接池 3. SQLParser 当业务数据量达

  • MyBatis无缝对接Spring的方法

    1.为什么会出现MyBatis-Spring Spring框架与MyBatis框架是Java互联网技术的主流框架.但是如何将MyBatis无缝整合到Spring框架中呢?这时候就诞生了MyBatis-Spring.使用这个类库中得类,Spring将会加载必要的MyBatis工厂类和session类. Spring3.0也仅仅支持ibatis2.0.本来将MyBatis3的支持添加到Spring3.0中.而不幸,Spring3.0的开发在MyBatis3.0官方发布前就结束了.因为Spring开发

  • springboot + mybatis配置多数据源示例

    在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法 3)DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用Da

  • SpringMvc+Mybatis+Pagehelper分页详解

    最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现PageHelper比较合适 故写一篇从零开始的PageHelper使用的教程,也记录下忙活一天的东西 1.首先需要在项目中添加PageHelper的依赖,这里我用的Maven添加 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>

  • 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 w

  • Spring如何基于aop实现事务控制

    spring的事务控制本质上是通过aop实现的. 在springboot中使用时,可以通过注解@Transactional进行类或者方法级别的事务控制,也可以自己通过spring提供的事务管理器手动控制事务 一. @Transactional注解进行进行类或者方法级别的事务控制 不需要进行特别的设置,按照正常的配置整合spring和mybatis后,在需要进行事务控制的类上或者方法上加上 @Transactional注解,即可对其进行事务控制. 二.手动控制事务 当需要在一个方法的内部进行事务控

  • Springboot通过aop实现事务控制过程解析

    spring的事务控制本质上是通过aop实现的. 在springboot中使用时,可以通过注解@Transactional进行类或者方法级别的事务控制,也可以自己通过spring提供的事务管理器手动控制事务 一. @Transactional注解进行进行类或者方法级别的事务控制 不需要进行特别的设置,按照正常的配置整合spring和mybatis后,在需要进行事务控制的类上或者方法上加上 @Transactional注解,即可对其进行事务控制. 二.手动控制事务 当需要在一个方法的内部进行事务控

  • mybatis调用存储过程的实例代码

    一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_increment, name varchar(10), sex char(2) ); insert into p_user(name,sex) values('A',"男"); insert into p_user(name,sex) values('B',"女"); ins

  • MyBatis学习教程(六)-调用存储过程

    一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_increment, name varchar(), sex char() ); insert into p_user(name,sex) values('A',"男"); insert into p_user(name,sex) values('B',"女"); insert

  • MyBatis如何调用存储过程与存储函数

    目录 1.MyBatis调用存储过程 2.MyBatis调用存储函数 1.MyBatis调用存储过程 MyBatis支持使用存储过程的配置.当使用存储过程时,需要设置一个参数"mode",其值有IN(输入参数).OUT(输出参数)和INOUT(输入/输出参数). MyBatis定义存储过程如下: <!-- 存储过程 --> <select id="selectSomeThing" statementType="CALLABLE"

  • Springmvc调用存储过程,并返回存储过程返还的数据方式

    目录 Springmvc调用存储过程,并返回存储过程返还的数据 实现如下 这里要重点说明一下 Springmvc调用存储过程,entity文件写法 Springmvc调用存储过程,并返回存储过程返还的数据 java后端很多时候都需要和数据库进行交互,并返回业务数据.一般情况下都会采用执行SQL的方式来进行交互,但有些特别的场景时,也可以直接利用存储过程返回数据. 存储过程返回数据的好处是只需要一个调用,即可根据不同的参数返回不同的业务数据,这些业务数据有可能列名完全不一样. 实现如下 首先要先定

  • 关于mybatis调用存储过程获取返回值问题

    总体思路:map传值 controller: Map<String,Object> m=new HashMap<String,Object>(); m.put("name", 'zs'); m.put("password", '55555'); cardservice.bindCard(m); JSONObject json=new JSONObject(); //获得返回值 json.put("msg", m.get(&

  • SpringMVC整合mybatis实例代码

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

  • 详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 本文代码中注释写的比较清楚不在单独说明,希望能帮助到大家, 实例代码: public List<Map<String , Object>> doCallProcedure(String procedureString,String[] parameters) throws PersistentDataOperationException { if (!isReady ()) { throw new PersistentDataOperatio

随机推荐