一、前言
在前面几节,我们已经创建好了数据库的表,已经定义好了页面以及接口地址,也进行了功能性的配置。
下面我们就可以进行功能性的开发了,主要涉及到:
序号 | 类型 | 名称 |
---|---|---|
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();
}
}