jDaoMySQL
jDaoMySQL 用于生成 dao 层和 Vo,即 Entity、Repository、Manager 和 Vo
Q&A
- 为什么要将 Vo 也一同生成?
在实际项目实施中发现,一般 Controller 的 Qo 是一个接口对应一个,但是 Vo 还是要整合一下,以便于未来新增字段时,我们可以通过设置通用的 Vo,确保全部的接口都添加上字段,例如 SysUserBaseVo 增加了 gender 字段,那么全部引用该 Vo 的接口就都会增加上该字段
Entity 里面的枚举值应该通过 enums 统一管理,然后生成的 Vo 的字段也应该保持住枚举值,而不是 String,但是现在由于 Entity 和 Vo 一起生成,所以没办法处理掉该问题,所以请小伙伴手动再处理下 Vo,主要是枚举值的处理
- 为什么生成三个 Vo?
目前系统自动生成了三个 Vo,分别为:
- BaseVo:基础的 Vo,例如只有用户名、头像、手机号,属于基础 Vo,可以放在订单中
- ListVo:列表型的 Vo,根据业务需求,一般范围比 BaseVo 大
- Vo:常规 Vo,一般与 Entity 的属性对应
在实际项目中,可能还需要 DetailVo 等,那么就需要自己封装了
jDaoMySQL-v3.groovy 的使用
前置条件
idea 结合 Groovy 脚本来快速生成代码,那么要求首先要安装 Groovy,Groovy 的安装请自行百度
C:\Users\Lenovo>groovy -version
Groovy Version: 3.0.9 JVM: 1.8.0_291 Vendor: Oracle Corporation OS: Windows 10
C:\Users\Lenovo>
配置脚本
脚本配置文件在项目根目录下的jCoder.json
中,主要定义如下:
{
"workModuleFolder": "developer-user", //工作目录
"workModulePackage": "com.qrqy.developer.user", //应用包名
"sdkModuleFolder": "developer-user", //Module的目录
"sdkModulePackage": "com.qrqy.developer.user" //module的包名
}
使用 jDaoMySQL.groovy
第一步,idea 连接数据库
idea 要连上开发数据库
第二步,放置 groovy 脚本
将 groovy 脚本 copy 到数据库扩展脚本目录下
第三步,点击库表,生成代码
右键表,执行 groovy 脚本,生成代码
注意哪些事情
一般情况,枚举值需要手动创建一下,枚举值统一放在 enums 包下,Entity 的引用为
/**
* 员工类别,USER:用户;ADMIN:管理员
*/
@Column(name = "type")
@Enumerated(EnumType.STRING)
private UserTypeEnum type;
自己家里一下相应的包,摆摆目录
都生成了哪些文件
├─main
│ ├─java
│ │ └─com
│ │ └─qrqy
│ │ └─developer
│ │ └─user
│ │ ├─config
│ │ ├─controller
│ │ │ └─user
│ │ ├─dao //生成了dao
│ │ │ ├─entity
│ │ │ └─repository
│ │ ├─data
│ │ │ ├─role
│ │ │ └─user
│ │ ├─enums
│ │ │ ├─role
│ │ │ └─user
│ │ ├─manager //生成了Manager
│ │ ├─model //生成了Vo
│ │ │ └─vo
│ │ ├─service
│ │ └─utils
如何跨表关联
JPA 适合处理业务逻辑,通过 ORM 的方式,我们不再编写 Mapper,只关注业务,但是JPA 的查询不友好,JPA 通过该@OneToMany 和@OneToOne 等方式查询,本质上是通过 sql 在数据库中单次查询再补入数据...效率比较低
那么,目前一个基本的方案是:对于部分通用的跨表关联业务,形成视图,通过视图查询,补充数据
该方案适合于紧密关联的数据,例如碧桂园小程序用户表中有个 community_id(社区 id),100%的场景都需要在查询用户的时候把其所属的社区关联出来,那么就可以建设一个 user_community_view 的视图,未来通过视图进行关联
如何获取随机数
orderby 中,输入rand()
即可完成搜索条件的随机获取
orderBy("rand()", null)
Specification query = new BaseSqlQuery(qo)
.append("questionIdNotIn", questionIdNotIn)
.orderBy("rand()", null);
建立视图
/**
社区管理员表进行关联
*/
CREATE VIEW community_user_view AS
(
SELECT community_user.*,
USER.real_name AS real_name,
USER.avatar AS avatar,
USER.phone_number AS phone_number,
community.community_name,
community.community_address,
community.province AS community_province,
community.city AS communtiy_city,
community.area AS community_area
FROM biz_community_user AS community_user
LEFT JOIN biz_community AS community ON community_user.community_id = community.community_id
LEFT JOIN sys_user AS USER
ON community_user.user_id = USER.user_id
)
建立 Entity、Repository、Manager
package com.isart.bgy.dao.entity.view;
import com.isart.bgy.enums.community.user.CommunityUserTypeEnum;
import com.isart.bgy.enums.user.AuditStatusTypeEnum;
import com.qrqy.developer.common.entity.CommonEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author TerryQi
* @since 2022/7/24 12:23
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "community_user_view")
@EntityListeners(AuditingEntityListener.class)
public class CommunityUserView extends CommonEntity implements Serializable {
private static final long serialVersionUID = 4831922156324491124L;
/**
* PK
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "community_user_id")
private Integer communityUserId;
/**
* 物业人员id
*/
@Column(name = "user_id")
private Integer userId;
/**
* 园区id
*/
@Column(name = "community_id")
private Integer communityId;
/**
* 工号
*/
@Column(name = "employee_no")
private String employeeNo;
/**
* 人员类型,ADMIN:社区管理员;MANAGER:物业人员
*/
@Column(name = "type")
@Enumerated(EnumType.STRING)
private CommunityUserTypeEnum type;
/**
* 审核状态,WAITING:待审核;APPROVED:审核通过;REJECTED:审核驳回
*/
@Column(name = "audit_status")
@Enumerated(EnumType.STRING)
private AuditStatusTypeEnum auditStatus;
/**
* 手机号
*/
@Column(name = "phone_number")
private String phoneNumber;
/**
* 真实名称
*/
@Column(name = "real_name")
private String realName;
/**
* 头像图片
*/
@Column(name = "avatar")
private String avatar;
/**
* 园区名称
*/
@Column(name = "community_name")
private String communityName;
/**
* 园区地址
*/
@Column(name = "community_address")
private String communityAddress;
/**
* 园区省份
*/
@Column(name = "community_province")
private String communityProvince;
/**
* 园区城市
*/
@Column(name = "community_city")
private String communityCity;
/**
* 园区行政区
*/
@Column(name = "community_area")
private String communityArea;
}
基本要求
下载 jDaoMySQL
框架下面的 jDaoMySQL 是准确的,建议下载框架,copy 里面的 jDaoMySQL,这里可以下载学习