Panda_05_單表功能開發(三)_後端增刪改查介面開發
阿新 • • 發佈:2018-10-31
一、前言
在前面幾節,我們已經建立好了資料庫的表,已經定義好了頁面以及介面地址,也進行了功能性的配置。
下面我們就可以進行功能性的開發了,主要涉及到:
序號 | 型別 | 名稱 |
---|---|---|
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();
}
}