> 当然可使用代码生成器极速生成如下代码,以下为具体讲解各步骤注意事项
## 编写`entity`
* 每一个`entity`类即为一个实体类,对应数据库中的一个具体表。
* 名称=`表具体名称`,表名中`_`替换为驼峰命名法,首字母大写。如:`Student`对应表为`t_student`。
* 创建在 项目模块 的`xxx.entity.[模块名称]`包下。如:`xxx.entity.Student`
### 属性规范
* 所有属性均为`private`属性。
* 每一个属性需要生成对应的`getter`和`setter`方法。
* 字段名称应根据驼峰命名规则从数据库列名转换过来。例如:数据库列名为`USER_NAME`,则字段名为`UserName`,特殊字段名称,可以在字段在添加`@Column(name = "xxx")`注解,指定数据库列名。
* 每个属性需加上Swagger注解,相当于注释,且前端代码生成器会用到该注释。
* 建议可添加`Long`类型属性`objectVersionNumber`,用以更新数据时的版本控制。
### 属性的的类型与字段的`type`对应
* 不使用基本类型,全部使用基本类型的包装类,如`Long`对应数据库中的`INTEGER`,而不是使用`long`。
* 数字类型主键统一采用`Long`。
* 金额、数量 等精度严格浮点类型采用`BigDecimal`
> 注意:BigDecimal 在计算、比较方面的特殊性
### 所有的主键字段都需要用`@Id`标注
* 对于自增长、序列(SEQUENCE)类型的主键,需要添加注解`@GeneratedValue`。
* 序列命名规范:`表名_S`。例如:表`SYS_USER`对应的序列为`SYS_USER_S`。
### 非数据库字段
* 需要用`@Transient`标注`javax.persistence.Transient`
### `entity`类相关注解
- `@Data`,Lombok自动生成get和set方法
- `@Entity`,JPA声明实体类,并且使用默认的ORM规则,即类名即数据库表中表名
- `@Table`,JPA改变类名与数据库中表名的默认ORM映射规则
- `@TableName`,Mybatis-Plus注解
- `@ApiModel`,Swagger实体类注解
- `@ApiModelProperty`,Swagger实体类字段注解
### `Student.java`代码
~~~java
// 省略 import
/**
* @author Exrick
*/
@Data
@Entity
@Table(name = "t_student")
@TableName("t_student")
@ApiModel(value = "测试")
public class Student extends XbootBaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户名")
private String username;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "版本")
private Long objectVersionNumber;
}
~~~
> 分层领域模型规约
* `DO`(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
* `DTO`(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
* `BO`(Business Object):业务对象,可以由 Service 层输出的封装业务逻辑的对象。
* `Query`:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类 来传输。
* `VO`(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
## 编写Dao
### `Dao`接口类
* `Dao`接口类定义了数据操作的一系列接口,并不提供实现,具体实现需要通过`Dao`实现层提供。创建在项目模块的`xxx.dao`包下。
* 每一个`Dao`对应一个`entity`,所以命名为`entity`类名尾缀替换为`Dao`。如:`StudentDao`对应`Student`。
### `StudentDao.java`代码
~~~java
// 省略 import
/**
* 测试数据处理层
* @author Exrick
*/
public interface StudentDao extends XbootBaseDao<Student,String> {
}
~~~
## 编写应用层`Service`
`service`调用领域对象或服务来解决问题,应用层Service主要有以下特性:
1. 负责事务处理,所以事务的注解可以在这一层的`service`中使用。
2. 只处理非业务逻辑,重点是调度业务处理流程。业务逻辑处理一定要放在领域层处理。
3. 不做单元测试,只做验收测试。
4. 可能会有比较多的依赖组件(领域实体数据层)。
## `Service`接口类
* `Service`接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在项目模块的`xxx.service`包下。
### `StudentService.java`代码
~~~java
// 省略 import
/**
* 测试接口
* @author Exrick
*/
public interface StudentService extends XbootBaseService<Student,String> {
/**
* 多条件分页获取
* @param student
* @param searchVo
* @param pageable
* @return
*/
Page<Student> findByCondition(Student student, SearchVo searchVo, Pageable pageable);
}
~~~
## `Service`实现类
* `Service`接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在项目模块的`xxx.serviceimpl`包下。
* 实现类,需要用`@Service`标注
### `StudentServiceImpl.java`代码
~~~java
// 省略 import
@Slf4j
@Service
@Transactional
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public StudentDao getRepository() {
return studentDao;
}
}
~~~
## 编写`Controller`
* `Controller`负责对`Model`和`View`的处理,创建在项目模块的`xxx.api.controller.v1`包下。如`xxx.api.controller.v1`。
* 每一个`Controller`是对一个具体的`DTO`或`VO`资源进行处理的,所以命名为`dto`或`vo`类名尾缀替换为`Controler`。如:`StudentController`对应`StudentDTO`或`StudentVO`类。
* 需要通过`@Controller`指定该类为一个`Controller`类。
### `Controller`类相关注解
* `@PreAuthorize`,设置API访问权限,Spring Security官方推荐该权限管理方式,更多表达式规则详见[官方文档](https://docs.spring.io/spring-security/site/docs/5.4.1/reference/html5/#el-common-built-in),当然你可以在XBoot权限菜单中动态配置,更佳灵活,如
* @PreAuthorize("isAuthenticated()")
* @PreAuthorize("hasAuthority('read')")
* @PreAuthorize("hasAnyAuthority('read', 'write')")
* @PreAuthorize("hasRole('ADMIN')")
* @PreAuthorize("hasAnyRole('ADMIN', 'USER')")
* @PreAuthorize("hasRole('ADMIN') and hasRole('USER')")
* @PreAuthorize("hasRole('ADMIN') or hasRole('USER')")
``` java
@PreAuthorize("authentication.name == #username")
public User find(String username) {
return null;
}
```
- 更多详见 [官方文档](https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#method-security-expressions)
* `@ApiOperation`,显示在Swagger上的接口注释
* `@GetMapping`,是一个组合注解,是`@RequestMapping(mathod = RequestMethod.GET)`的缩写,`@PostMapping`等同理。建议使用**组合注解**。
### `StudentController.java`代码
~~~java
// 省略 import
/**
* @author Exrick
*/
@Slf4j
@RestController
@Api(description = "测试管理接口")
@RequestMapping("/xboot/student")
@Transactional
public class StudentController extends XbootBaseController<Student, String> {
@Autowired
private StudentService studentService;
@Override
public StudentService getService() {
return studentService;
}
}
~~~
- 前言&版本说明
- 概念
- XBoot 是什么?
- 系统架构
- 主要使用的开源组件
- 角色控制访问权限(RBAC)
- 用户手册
- 系统配置
- 工作流使用配置
- 定时任务调度
- 智能助手客服机器人
- 项目本地运行
- 后端运行
- 前端运行
- 项目结构说明
- 附:使用Oracle等数据库
- 模块化版本
- 后端开发指南
- 基本开发指南
- 前后端数据交互标准
- 工具类及数据权限
- 代码生成器-30秒搞定CRUD
- 增删改查CRUD
- 日志类型注解扩展
- 逻辑删除
- 各验证码使用及配置
- 接口文档使用及认证
- 前端开发指南
- 基本开发指南
- 主题/Logo/首页等配置
- 路由菜单配置
- 多语言国际化配置
- 自定义图标icon
- 工具类及数据获取
- 其他说明
- 完整版开发指南
- 前端Vue代码生成器
- Activiti工作流
- 单点登录配置
- 智能助手/客服机器人
- MinIO对象存储服务搭建
- 第三方社交账号配置
- 短信开发/站内消息/邮件
- Vaptcha验证码
- 禁用词使用
- 前端移除CDN
- 其他说明
- 开放平台及单点登录
- 开放平台使用指南
- Web接入开发流程
- 单点登录开发指南
- 微信小程序端开发指南
- 项目导入与开发必读
- 业务组件
- 产品组件(小)
- 产品组件(大)
- 优惠券组件
- 评论列表组件
- 红包组件
- 推荐商品组件
- 页面设计
- 商品详情页及SKU设计
- 通用方法工具类说明
- 开发经验与踩坑分享
- Uniapp端开发指南
- APP后端开发指南
- Uniapp前端开发指南
- 开发新功能示例
- 后端开发新模块
- 前端开发新页面
- 测试
- SonarQube代码质量管理
- TestNG单元测试
- ExtentReports测试报告
- Selenuim自动化Web测试
- Appuim自动化App测试
- JMeter压测性能测试
- 部署
- Spring Boot配置
- 快速部署
- 后端部署
- 前端部署
- 前端部署优化
- Docker容器化部署
- 服务器配置
- 持续集成
- GitLab
- GitLab CI
- XBoot 脚本参考
- Jenkins
- Jenkins安装
- XBoot CI参考
- DevOps环境搭建
- 组件安装列表
- 开发设计规范
- 分支管理
- 数据库设计规范
- Redis使用规范
- Java基础开发规范
- Rest API规范
- 项目结构规范
- 前端开发规范
- 前端设计规范
- 项目搭建分享
- 后端相关
- SpringBoot 2.x区别总结
- Spring Security整合JWT
- Spring Security动态权限管理
- Spring Boot 2.x整合Quartz
- Spring Boot 2.x整合Websocket
- Spring Boot 2.x整合Activiti工作流以及模型设计器
- Spring Boot + Security全局跨域配置
- 前端相关
- axios请求封装 统一异常处理
- 动态路由菜单加载
- 多维度控制权限至按钮显示
- 发送消息图标红点实时显示
- 动态组件单页操作
- XBoot助你【告别996】
- 业务开发踩坑
- 你会用开发神器IDEA吗
- Lombok你知道多少
- 你还在手动校验参数吗
- 你真的会用JPA吗
- Lamda表达式
- Stream流式API
- 告别资源关闭
- Optional避免null
- 谷歌Guava工具包
- 线程池
- 其他小经验技巧
- 更新日志及步骤
- 常见问题