> 當然可使用代碼生成器極速生成如下代碼,以下為具體講解各步驟注意事項
## 編寫`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工具包
- 線程池
- 其他小經驗技巧
- 更新日志及步驟
- 常見問題