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,这里可以下载学习