1. 程式人生 > >Panda_05_單表功能開發(三)_後端增刪改查介面開發

Panda_05_單表功能開發(三)_後端增刪改查介面開發

一、前言

在前面幾節,我們已經建立好了資料庫的表,已經定義好了頁面以及介面地址,也進行了功能性的配置。

下面我們就可以進行功能性的開發了,主要涉及到:

序號 型別 名稱
1 DTO FndBusinessRuleTest
2 Mapper FndBusinessRuleTestMapper
3 Mapper.xml FndBusinessRuleTestMapper.xml
4 Service IFndBusinessRuleTestService
5 ServiceImpl FndBusinessRuleTestServiceImpl
6 Controller FndBusinessRuleTestController

二、編寫DTO

1.類

  • 每個DTO都對應資料庫中的一張表,需要繼承 BaseCloudDTO
    BaseCloudDTO 中封裝了 who欄位 以及 擴充套件欄位
  • 名稱與表名稱相同,表名中 _ 替換為駝峰命名法,首字母大寫,且忽略字首。如:UserRole 對應表為 sys_user_role。

類註解:

	@MultiLanguage                        : 多語言註解
    @ExtensionAttribute(disable=true)     : 擴充套件欄位註解
    @Table(name = "fnd_business_rule_b")  : 對映資料庫表

2.靜態屬性欄位

每一個欄位都需要新增其對應的靜態屬性欄位

3.欄位

(1)主鍵
主鍵欄位需要加註解:

@Id : 主鍵註解

@GeneratedValue : 主鍵自增長註解。 對於自增長、序列(SEQUENCE)型別的主鍵,需要添加註解@GeneratedValue

(2)多語言欄位
多語言欄位需要新增多語言欄位註解

 @MultiLanguageField   : 多語言欄位註解(3

(3)非資料庫欄位
非資料庫欄位需要新增@Transient

javax.persistence.Transient

(4)欄位型別

  • 不使用基本型別,全部使用基本型別的包裝類,如 Long 對應資料庫中的INTEGER,而不是使用 long
  • 數字型別主鍵統一採用 Long
  • 金額、數量 等精度嚴格浮點型別採用 BigDecimal。注意 BigDecimal 在計算、比較方面的特殊性

4.完整示例

package com.hand.hec.panda.fnd.dto;

/**Auto Generated By Hap Code Generator**/
import com.hand.hap.core.annotation.MultiLanguage;
import com.hand.hap.core.annotation.MultiLanguageField;
import com.hand.hap.mybatis.annotation.ExtensionAttribute;
import com.hand.hap.system.dto.BaseCloudDTO;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 一、類
 * 1. 每個DTO都對應資料庫中的一張表,需要繼承 BaseCloudDTO
 *  BaseCloudDTO 中封裝了 who欄位 以及 擴充套件欄位
 *
 * 2.DTO類上需要加三個註解
 *      @MultiLanguage  : 多語言註解
 *      @ExtensionAttribute(disable=true)    : 擴充套件欄位註解
 *      @Table(name = "fnd_business_rule_b") : 對映資料庫表
 *
 * 二、靜態屬性欄位
 *   每一個欄位都需要新增其對應的靜態屬性欄位
 *
 * 三、欄位
 * 1.主鍵
 *    主鍵欄位需要加註解:
 * 		@Id              : 主鍵註解
 *
 *      @GeneratedValue  : 主鍵自增長註解。
 *                          對於自增長、序列(SEQUENCE)型別的主鍵,需要添加註解@GeneratedValue
 * 2.多語言欄位
 * 多語言欄位需要新增多語言欄位註解
 *        @MultiLanguageField   : 多語言欄位註解
 *
 * 3.非資料庫欄位
 * 非資料庫欄位需要新增@Transient
 *      javax.persistence.Transient
 *      
 * 4.欄位型別
 * >- 不使用基本型別,全部使用基本型別的`包裝類`,如 Long 對應資料庫中的INTEGER,而不是使用 long
 * >- 數字型別主鍵統一採用 Long
 * >- 金額、數量 等精度嚴格浮點型別採用 BigDecimal。注意 BigDecimal 在計算、比較方面的特殊性
 *
 *
 */
@MultiLanguage
@ExtensionAttribute(disable=true)
@Table(name = "fnd_business_rule_b")
public class FndBusinessRule extends BaseCloudDTO {

     public static final String FIELD_BUSINESS_RULE_ID = "businessRuleId";
     public static final String FIELD_BUSINESS_RULE_CODE = "businessRuleCode";
     public static final String FIELD_BUSINESS_NAME = "businessName";
     public static final String FIELD_DOC_CATEGORY = "docCategory";
     public static final String FIELD_ENABLED_FLAG = "enabledFlag";
     public static final String FIELD_DELETED_FLAG = "deletedFlag";
     public static final String FIELD_CLIENT_ID = "clientId";


     @Id
     @GeneratedValue
     private Long businessRuleId; //許可權規則ID

     @NotEmpty
     @Length(max = 30)
     private String businessRuleCode; //許可權規則程式碼

     @Length(max = 240)
     @MultiLanguageField
     private String businessName; //許可權規則名稱

     @NotEmpty
     @Length(max = 30)
     private String docCategory; //單據類別

     @Length(max = 1)
     private String enabledFlag; //啟用標誌

     @Length(max = 1)
     private String deletedFlag; //刪除標誌

     private Long clientId; //租戶ID


     public void setBusinessRuleId(Long businessRuleId){
         this.businessRuleId = businessRuleId;
     }

     public Long getBusinessRuleId(){
         return businessRuleId;
     }

     public void setBusinessRuleCode(String businessRuleCode){
         this.businessRuleCode = businessRuleCode;
     }

     public String getBusinessRuleCode(){
         return businessRuleCode;
     }

     public void setBusinessName(String businessName){
         this.businessName = businessName;
     }

     public String getBusinessName(){
         return businessName;
     }

     public void setDocCategory(String docCategory){
         this.docCategory = docCategory;
     }

     public String getDocCategory(){
         return docCategory;
     }

     public void setEnabledFlag(String enabledFlag){
         this.enabledFlag = enabledFlag;
     }

     public String getEnabledFlag(){
         return enabledFlag;
     }


     }

三、編寫Mapper

1.繼承Mapper介面

繼承了通用Mapper介面之後,就具備了一些單表的增刪改查操作。

package com.hand.hec.panda.fnd.mapper;

import com.hand.hap.mybatis.common.Mapper;
import com.hand.hec.panda.fnd.dto.FndBusinessRule;

public interface FndBusinessRuleMapper extends Mapper<FndBusinessRule>{

}

2.Mapper.xml

對應的Mapper.xml實現如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hand.hec.panda.fnd.mapper.FndBusinessRuleMapper">
      <resultMap id="BaseResultMap" type="com.hand.hec.panda.fnd.dto.FndBusinessRule" extends="com.hand.hap.mapper.CloudStdMapper.CloudSTD">
        <result column="business_rule_id" property="businessRuleId" jdbcType="DECIMAL" />
        <result column="business_rule_code" property="businessRuleCode" jdbcType="VARCHAR" />
        <result column="business_name" property="businessName" jdbcType="VARCHAR" />
        <result column="doc_category" property="docCategory" jdbcType="VARCHAR" />
        <result column="enabled_flag" property="enabledFlag" jdbcType="VARCHAR" />
        <result column="deleted_flag" property="deletedFlag" jdbcType="VARCHAR" />
        <result column="client_id" property="clientId" jdbcType="DECIMAL" />
    </resultMap>


</mapper>

3.多表

若有涉及到多表操作,則先定義Mapper介面方法,然後通過 Mapper.xml 去寫多表sql來實現一下即可。

四、Service

1.Service 介面

service 介面 需要繼承IBaseServcie 和 ProxySelf 這兩個介面。
IBaseServcie 提供了基本的增刪改查介面。

package com.hand.hec.panda.fnd.service;

import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.service.IBaseService;
import com.hand.hec.panda.fnd.dto.FndBusinessRule;

public interface IFndBusinessRuleService extends IBaseService<FndBusinessRule>, ProxySelf<IFndBusinessRuleService>{

}

2.ServiceImpl

(1)兩個註解
類上需要加兩個註解

@Service : 宣告Bean
@Transactional(rollbackFor = Exception.class) : 開啟Spring宣告式事務,有異常時會回滾。

(2)繼承與實現
需要繼承 BaseServiceImpl 介面,這樣就具有了單表的增刪改查操作。
需要實現 IFndBusinessRuleService ,去實現處單表增刪改查之外的其他操作。

package com.hand.hec.panda.fnd.service.impl;

import com.hand.hap.system.service.impl.BaseServiceImpl;
import org.springframework.stereotype.Service;
import com.hand.hec.panda.fnd.dto.FndBusinessRule;
import com.hand.hec.panda.fnd.service.IFndBusinessRuleService;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(rollbackFor = Exception.class)
public class FndBusinessRuleServiceImpl extends BaseServiceImpl<FndBusinessRule> implements IFndBusinessRuleService {

}

五、Controller

1.類

加註解

類上需要加 @Controller

繼承類:

需要繼承 BaseController ,這樣就有了一些通用方法,請求引數驗證、異常處理

2.查詢介面示例

	@RequestMapping(value = "/fnd/businessRule/query")
	@ResponseBody
	public ResponseData query(FndBusinessRule dto, @RequestParam(defaultValue = DEFAULT_PAGE) int page,
			@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) int pageSize, HttpServletRequest request) {
		IRequest requestContext = createRequestContext(request);
		return new ResponseData(service.select(requestContext,dto,page,pageSize));
	}

3.提交介面示例

提交包括新增和修改

@RequestMapping(value = "/fnd/businessRule/submit")
	@ResponseBody
	public ResponseData update(@RequestBody List<FndBusinessRule> dto, BindingResult result, HttpServletRequest request){
	    //dto的驗證。主要是對dto中的註解進行驗證。
		getValidator().validate(dto, result);
		
		if (result.hasErrors()) {
			ResponseData responseData = new ResponseData(false);
			responseData.setMessage(getErrorMessage(result, request));
			return responseData;
		}
		IRequest requestCtx = createRequestContext(request);
		
		//批量更新或新增
		return new ResponseData(service.batchUpdate(requestCtx, dto));
	}

4.刪除介面示例

	@RequestMapping(value = "/fnd/businessRule/remove")
	@ResponseBody
	public ResponseData delete(HttpServletRequest request,@RequestBody List<FndBusinessRule> dto){
	    //批量刪除
		service.batchDelete(dto);
		return new ResponseData();
	}

5.完整示例

package com.hand.hec.panda.fnd.controllers;

import com.hand.hap.core.IRequest;
import com.hand.hap.system.controllers.BaseController;
import com.hand.hap.system.dto.ResponseData;
import com.hand.hec.panda.fnd.dto.FndBusinessRule;
import com.hand.hec.panda.fnd.service.IFndBusinessRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
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 javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
public class FndBusinessRuleController extends BaseController{

	@Autowired
	private IFndBusinessRuleService service;


	@RequestMapping(value = "/fnd/businessRule/query")
	@ResponseBody
	public ResponseData query(FndBusinessRule dto, @RequestParam(defaultValue = DEFAULT_PAGE) int page,
			@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) int pageSize, HttpServletRequest request) {
		IRequest requestContext = createRequestContext(request);
		return new ResponseData(service.select(requestContext,dto,page,pageSize));
	}

	@RequestMapping(value = "/fnd/businessRule/submit")
	@ResponseBody
	public ResponseData update(@RequestBody List<FndBusinessRule> dto, BindingResult result, HttpServletRequest request){
		getValidator().validate(dto, result);
		if (result.hasErrors()) {
			ResponseData responseData = new ResponseData(false);
			responseData.setMessage(getErrorMessage(result, request));
			return responseData;
		}
		IRequest requestCtx = createRequestContext(request);
		return new ResponseData(service.batchUpdate(requestCtx, dto));
	}

	@RequestMapping(value = "/fnd/businessRule/remove")
	@ResponseBody
	public ResponseData delete(HttpServletRequest request,@RequestBody List<FndBusinessRule> dto){
		service.batchDelete(dto);
		return new ResponseData();
	}
}

六、介面測試