跳至主要內容

技术中心大约 5 分钟

代码生成是对几个生成工具的使用说明介绍,旨在减少开发同学对重复,简单的CRUD模块能够快速开发。请仔细阅读学习下面的使用介绍。

通常我们在开发功能模块时,会先提供数据库表设计,开发人员对表设计进行检查没有什么疑问后,就开始:

  1. 写建表SQL
  2. 创建java package
  3. 编写实体类,服务类,接口类
  4. Mybatis XML文件

前提准备

  • PDManer工具
  • IDEA 安装 CLZY Application
  • 数据库的PDManer设计文件

代码生成操作

1. 生成建表SQL

使用PDManer打开数据库设计文件,如下图所示,双击表,选择数据库代码,选择Postgresql即可获取到建表SQL:

当然,你可以根据需求,使用其他的SQL。之后则按照项目的SQL管理规范,新建建表版本的sql文件即可。

2. 生成mvc package

使用IDEA打开项目,选中需要创建包的上级包,如下图所示,右键,选择New,选择Clzy MVC Package,在弹出框中输入模块名,则会自动创建web,service,dao,entity子包。

3. 生成实体类文件及代码

使用IDEA打开项目,选中需要创建类的包,如下图所示,右键,选择New,选择Clzy Class Template,在弹出框中输入模块名,并选择对应的PageEntityCrudEntity类型,则会自动创建对应的文件。

然后,打开PDManner,点击右侧代码生成器,如下图所示,点击JavaMybatis,然后选择后面的+:

然后输入ClzyEntity,将下面的内容复制进去:

{{  var today=new Date();
    var fullYear=today.getFullYear();
    var month=today.getMonth() + 1;
    var days=today.getDate();
    
    var pkVarName = "undefinedId";
    var pkDataType = "String";
    it.entity.fields.forEach(function(field){
        if(field.primaryKey){
            pkVarName = it.func.camel(field.defKey,false);
            pkDataType = field["type"];
            return;
        }
    });
    
    var pkgName = it.entity.env.base.nameSpace;
    var beanClass = it.entity.env.base.codeRoot;
    var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);
    var serviceClass = beanClass+'Service';
    var serviceVarName= beanVarName+'Service';
    
}}package {{=pkgName}}.entity;
$blankline
import com.clzy.web.crud.persistence.PageEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
$blankline

 /**
 * {{=it.entity.defName}};{{=it.entity.comment}}
 * @author : clzy code gener
 * @date : {{=fullYear}}-{{=month}}-{{=days}}
 */
@Getter
@Setter
@ApiModel(value = "{{=it.entity.defName}}",description = "{{=it.entity.comment}}")
public class {{=beanClass}} extends PageEntity<{{=beanClass}}>{

    public {{=beanClass}}() {
    }

    public {{=beanClass}}(String id) {
        this.id = id;
    }

{{~it.entity.fields:field:index}}
    /** {{=it.func.join(field.defName,field.comment,';')}} */
    @ApiModelProperty(name = "{{=field.defName}}",notes = "{{=field.comment}}")
    private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;
{{~}}
$blankline
    @Override
    public void doPreInsert() {

    }

    @Override
    public void doPreUpdate() {

    }
$blankline
}

之后,切换回表,双击表,如下图步骤,选择程序代码,点击路径及变量,将nameSpace输入对应的包路径,然后点击确定。然后点击ClzyEntity,复制其代码到IDEA使用即可。

生成controller,service,dao代码

使用IDEA打开项目,选中需要创建类的包,如下图所示,右键,选择New,选择Clzy Class Template,在弹出框中输入模块名,并选择对应的class类型,则会自动创建对应的文件及代码。

注意:请按照 entity,dao,service,web的顺序创建类

4. 生成Dao XML文件

同生成Entity一样的步骤,先去添加模板,输入Dao.xml,然后将下面的内容复制进去。其次切换表,点击路径及变量,将nameSpace输入对应的包路径,然后点击确定。然后点击Dao.xml,复制其代码到IDEA,新建Mapper文件即可。

{{  var today=new Date();
    var fullYear=today.getFullYear();
    var month=today.getMonth() + 1;
    var days=today.getDate();
    
    var pkVarName = "undefinedId";
    var pkDataType = "String";
    var pkField = "UNDEFINED_ID";
    it.entity.fields.forEach(function(field){
        if(field.primaryKey){
            pkField = field.defKey;
            pkVarName = it.func.camel(field.defKey,false);
            pkDataType = field["type"];
            return;
        }
    });
    
    var pkgName = it.entity.env.base.nameSpace;
    var beanClass = it.entity.env.base.codeRoot;
    var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);
    var serviceClass = beanClass+'Service';
    var serviceVarName= beanVarName+'Service';
    
}}<?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="{{=pkgName}}.dao.{{=beanClass}}Dao">
    <sql id="{{=beanClass}}Columns">
    {{~it.entity.fields:field:index}}
        a.{{=field.defKey}} AS "{{=it.func.camel(field.defKey,false)}}",
    {{~}}
    </sql>
    $blankline
    <sql id="{{=beanClass}}Joins">
    </sql>
    $blankline
    <!-- 通过ID查询单条数据 -->
    <select id="get" resultType="{{=beanClass}}">
        SELECT
        <include refid="{{=beanClass}}Columns"/>
        FROM {{=it.entity.defKey}} a
        <include refid="{{=beanClass}}Joins"/>
        WHERE a.ID = #{id}
    </select>
    $blankline
    <!--查询列表-->
    <select id="findList" resultType="{{=beanClass}}">
        SELECT
        <include refid="{{=beanClass}}Columns"/>
        FROM {{=it.entity.defKey}} a
        <include refid="{{=beanClass}}Joins"/>
        <where>
            <!--// TODO 部分类型非字串类型字段不支持 != '', 请根据类型自身删除-->
        {{~it.entity.fields:field:index}}
            <if test="{{=it.func.camel(field.defKey,false)}} != null and {{=it.func.camel(field.defKey,false)}} != ''">
                and {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}}
            </if>
        {{~}}
            <if test="key != null and key != ''">
                <!--// TODO 添加支持关键字搜索的字段-->
            </if>
        </where>
        <choose>
            <when test="page !=null and page.orderBy != null and page.orderBy != ''">
                ORDER BY ${page.orderBy}
            </when>
            <otherwise>
                <!--// TODO 根据实际情况自行调整-->
                ORDER BY a.UPDATE_DATE DESC
            </otherwise>
        </choose>
    </select>
    $blankline
    <!--查询全部(无权限)-->
    <select id="findAllList" resultType="{{=beanClass}}">
        SELECT
        <include refid="{{=beanClass}}Columns"/>
        FROM {{=it.entity.defKey}} a
        <include refid="{{=beanClass}}Joins"/>
        <where>
            <!--// TODO 部分类型非字串类型字段不支持 != '', 请根据类型自身删除-->
        {{~it.entity.fields:field:index}}
            <if test="{{=it.func.camel(field.defKey,false)}} != null and {{=it.func.camel(field.defKey,false)}} != ''">
                and {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}}
            </if>
        {{~}}
            <if test="key != null and key != ''">
                <!--// TODO 添加支持关键字搜索的字段-->
            </if>
        </where>
        <choose>
            <when test="page !=null and page.orderBy != null and page.orderBy != ''">
                ORDER BY ${page.orderBy}
            </when>
            <otherwise>
                <!--// TODO 根据实际情况自行调整-->
                ORDER BY a.UPDATE_DATE DESC
            </otherwise>
        </choose>
    </select>
    $blankline
    <!--新增数据-->
    <insert id="insert" >
        insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',\n')}})
        values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',\n')}})
    </insert>
    $blankline
    <!-- 批量新增数据 -->
    <insert id="batchInsert" >
        insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',\n')}})
        values
        <foreach collection="list" item="item" separator=",">
            ({{=it.entity.fields.map(function(e,i){return '#{item.'+it.func.camel(e.defKey,false)+'}'}).join(',\n')}})
        </foreach>
    </insert>
    $blankline
    <!-- 更新数据 -->
    <update id="update">
        update {{=it.entity.defKey}}
        <set>
        {{~it.entity.fields:field:index}}
            <if test="{{=it.func.camel(field.defKey,false)}} != null and {{=it.func.camel(field.defKey,false)}} != ''">
                {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},
            </if>
        {{~}}
        </set>
        where {{=pkField}} = #{{{=pkVarName}}}
    </update>
    $blankline
    <!-- 批量更新数据 -->
    <insert id="batchUpdate" >
        <foreach collection="list" item="item" separator=";">
            update {{=it.entity.defKey}}
            <set>
            {{~it.entity.fields:field:index}}
                <if test="item.{{=it.func.camel(field.defKey,false)}} != null and item.{{=it.func.camel(field.defKey,false)}} != ''">
                    {{=field.defKey}} = #{item.{{=it.func.camel(field.defKey,false)}}},
                </if>
            {{~}}
            </set>
            where {{=pkField}} = #{item.{{=pkVarName}}}
        </foreach>
    </insert>
    $blankline
    <!--通过主键逻辑删除-->
    <update id="delete">
        update  {{=it.entity.defKey}} set is_deleted = #{deleted} where {{=pkField}} = #{{{=pkVarName}}}
    </update>
    $blankline
    <!--通过主键物理删除-->
    <delete id="forceDelete">
        delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}
    </delete>
    $blankline
    <!--通过主键批量逻辑删除-->
    <update id="batchDelete">
        <foreach collection="list" item="item" separator=";">
            update  {{=it.entity.defKey}} set is_deleted = #{item.deleted} where {{=pkField}} = #{item.{{=pkVarName}}}
        </foreach>
    </update>
    $blankline
    <!--通过主键批量物理删除-->
    <delete id="batchForceDelete">
        <foreach collection="list" item="item" separator=";">
        delete from {{=it.entity.defKey}} where {{=pkField}} = #{item}
        </foreach>
    </delete>
</mapper>