代码生成是对几个生成工具的使用说明介绍,旨在减少开发同学对重复,简单的CRUD模块能够快速开发。请仔细阅读学习下面的使用介绍。
通常我们在开发功能模块时,会先提供数据库表设计,开发人员对表设计进行检查没有什么疑问后,就开始:
- 写建表SQL
- 创建java package
- 编写实体类,服务类,接口类
- Mybatis XML文件
前提准备
- PDManer工具
- IDEA 安装 CLZY Application
- 数据库的PDManer设计文件
代码生成操作
1. 生成建表SQL
使用PDManer打开数据库设计文件,如下图所示,双击表,选择数据库代码
,选择Postgresql
即可获取到建表SQL:
![](/tech/assets/gensql-0333db4a.png)
当然,你可以根据需求,使用其他的SQL。之后则按照项目的SQL管理规范,新建建表版本的sql文件即可。
2. 生成mvc package
使用IDEA打开项目,选中需要创建包的上级包,如下图所示,右键,选择New
,选择Clzy MVC Package
,在弹出框中输入模块名,则会自动创建web,service,dao,entity子包。
![](/tech/assets/genpackage-693eb43c.png)
3. 生成实体类文件及代码
使用IDEA打开项目,选中需要创建类的包,如下图所示,右键,选择New
,选择Clzy Class Template
,在弹出框中输入模块名,并选择对应的PageEntity
或CrudEntity
类型,则会自动创建对应的文件。
![](/tech/assets/genclass-01afe8c5.png)
然后,打开PDManner,点击右侧代码生成器
,如下图所示,点击JavaMybatis
,然后选择后面的+
:
![](/tech/assets/addtpl-056f2b81.png)
然后输入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>