IDEA 插件 EasyCode 生成代码
EasyCode 官方地址
EasyCode 官方地址
有中文官网,安装使用文档一应俱全。就不多废话了。
简单看下生成代码的界面
idea》database》 找到数据库表
(支持多选)
右键》EeayCode》Generate Code
插件设置
全局配置 Global Config
- 定义
- 引入和使用
解决字段名与关键字冲突
给所有字段名加上反引号
`$column.obj.name`
自定义模板 (Velocity)
- 其它的文件里主要是把
Dao
的命名改成Mapper
mapper.xml
中添加上时间条件{datetiem}Begin、{datetiem}End
- 添加了方法
queryListByParam
/**
* 按条件查询列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
@Override
public List<$!{tableInfo.name}> queryListByParam(Map<String, Object> paramMap)
entity.java
未改动
dto.java
##引入宏定义
$!define
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "DTO"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/dto"))
##使用宏定义设置包后缀
#setPackageSuffix("dto")
##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonAlias;
##使用宏定义实现类注释信息
#tableComment("DTO 数据传输对象")
public class $!{tableInfo.name}DTO implements Serializable {
private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})/**
* ${column.comment}
*/#end
@JsonAlias("$!{column.name.toLowerCase()}")
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end
}
controller.java
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表控制层
*
* @author $!author
* @since $!time.currTime()
*/
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} {
/**
* 服务对象
*/
@Resource
private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("get/{id}")
public $!{tableInfo.name} selectOne(@PathVariable $!pk.shortType id) {
return this.$!{tool.firstLowerCase($tableInfo.name)}Service.queryById(id);
}
/**
* 按条件查询
*
* @param paramMap = $!{tableInfo.name} + datetiemBegin、datetiemEnd
* @return 对象列表
*/
@GetMapping("list")
public List<$!{tableInfo.name}> selectListByParam(@RequestParam Map<String, Object> paramMap) {
return this.$!{tool.firstLowerCase($tableInfo.name)}Service.queryListByParam(paramMap);
}
/**
* 创建对象
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 参数$!{tableInfo.name}实体
* @return 新对象主键
*/
@PostMapping
public $!pk.shortType insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
$!{tableInfo.name} obj = this.$!{tool.firstLowerCase($tableInfo.name)}Service.insert($!tool.firstLowerCase($!{tableInfo.name}));
return obj.get$!tool.firstUpperCase($!pk.name)();
}
/**
* 更新对象
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 参数$!{tableInfo.name}实体
* @return 更新后的对象
*/
@PutMapping
public $!{tableInfo.name} update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
return this.$!{tool.firstLowerCase($tableInfo.name)}Service.update($!tool.firstLowerCase($!{tableInfo.name}));
}
/**
* 删除对象
*
* @param id 主键
* @return 是否成功 bool
*/
@DeleteMapping
public boolean deleteById($!pk.shortType id) {
return this.$!{tool.firstLowerCase($tableInfo.name)}Service.deleteById(id);
}
}
mapper.java
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
@Mapper
public interface $!{tableName} {
/**
* 通过ID查询单条数据
*
* @param $!pk.name 主键
* @return 实例对象
*/
$!{tableInfo.name} queryById($!pk.shortType $!pk.name);
/**
* 查询指定行数据
*
* @param offset 查询起始位置
* @param limit 查询条数
* @return 对象列表
*/
List<$!{tableInfo.name}> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);
/**
* 通过实体作为筛选条件查询
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 对象列表
*/
List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 按条件【统计】列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
Integer countListByParam(Map<String, Object> paramMap);
/**
* 按条件【查询】列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
List<$!{tableInfo.name}> queryListByParam(Map<String, Object> paramMap);
/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 影响行数
*/
int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 影响行数
*/
int update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 通过主键删除数据
*
* @param $!pk.name 主键
* @return 影响行数
*/
int deleteById($!pk.shortType $!pk.name);
}
mapper.xml
这里要说明一下,原来的模板中sql语句带上了数据库名$!{tableInfo.obj.parent.name}
,这个我去掉了。
##引入mybatis支持
$!mybatisSupport
##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
<?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="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper">
<resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">
#foreach($column in $tableInfo.fullColumn)
<result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
</resultMap>
<!--查询单个-->
<select id="queryById" resultMap="$!{tableInfo.name}Map">
select
#allSqlColumn()
from $!tableInfo.obj.name
where $!pk.obj.name = #{$!pk.name}
</select>
<!--查询指定行数据-->
<select id="queryAllByLimit" resultMap="$!{tableInfo.name}Map">
select
#allSqlColumn()
from $!tableInfo.obj.name
limit #{offset}, #{limit}
</select>
<!--通过实体作为筛选条件查询-->
<select id="queryAll" resultMap="$!{tableInfo.name}Map">
select
#allSqlColumn()
from $!tableInfo.obj.name
<where>
#foreach($column in $tableInfo.fullColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
and $!column.obj.name = #{$!column.name}
</if>
#end
</where>
</select>
<!--多条件列表【统计】 支持 datetiemBegin、datetiemEnd -->
<select id="countListByParam" resultType="java.lang.Integer">
select count(0)
<include refid="listByParamSQL"></include>
</select>
<!--多条件列表【查寻】 支持 datetiemBegin、datetiemEnd -->
<select id="queryListByParam" resultMap="$!{tableInfo.name}Map">
select
#allSqlColumn()
<include refid="listByParamSQL"></include>
</select>
<!--多条件列表查寻 支持 datetiemBegin、datetiemEnd -->
<sql id="listByParamSQL">
from $!tableInfo.obj.name
<trim prefix="WHERE" prefixOverrides="AND |OR ">
#foreach($column in $tableInfo.pkColumn)
<if test="ids != null">
<foreach item="item" index="index" collection="ids" open=" ( " separator=" or " close=" ) ">
$column.obj.name = #{item}
</foreach>
</if>
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
AND $!column.obj.name = #{$!column.name}
</if>
#end
#foreach($column in $tableInfo.otherColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
AND $!column.obj.name = #{$!column.name}
</if>
#if($column.type.equals("java.util.Date"))
<if test="$!{column.name}Begin !=null and $!{column.name}Begin !=''">
<![CDATA[
AND $!column.obj.name >= #{$!{column.name}Begin}
]]>
</if>
<if test="$!{column.name}End !=null and $!{column.name}End !=''">
<![CDATA[
AND $!column.obj.name <= #{$!{column.name}End}
]]>
</if>
#end
#end
</trim>
</sql>
<!--新增所有列-->
<insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">
## 如果主键类型为String则用UUID,Mybatis动态判断id为空时填充。
#if($pk.type == "java.lang.String")
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
select replace(uuid(),'-','') from dual
</selectKey>
#end
insert into $!{tableInfo.obj.name}(#if($pk.type == "java.lang.String")$pk.name,#end #foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
values (#if($pk.type == "java.lang.String")#{$pk.name},#end #foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end)
</insert>
<!--通过主键修改数据-->
<update id="update">
update $!{tableInfo.obj.name}
<set>
#foreach($column in $tableInfo.otherColumn)
<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
$!column.obj.name = #{$!column.name},
</if>
#end
</set>
where $!pk.obj.name = #{$!pk.name}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete from $!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name}
</delete>
</mapper>
service.java
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import java.util.List;
import java.util.Map;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务接口
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} {
/**
* 通过ID查询单条数据
*
* @param $!pk.name 主键
* @return 实例对象
*/
$!{tableInfo.name} queryById($!pk.shortType $!pk.name);
/**
* 查询多条数据
*
* @param offset 查询起始位置
* @param limit 查询条数
* @return 对象列表
*/
List<$!{tableInfo.name}> queryAllByLimit(int offset, int limit);
/**
* 通过实体作为筛选条件查询
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 对象列表
*/
List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 按条件【统计】列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
Integer countListByParam(Map<String, Object> paramMap);
/**
* 按条件【查询】列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
List<$!{tableInfo.name}> queryListByParam(Map<String, Object> paramMap);
/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
$!{tableInfo.name} insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
$!{tableInfo.name} update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 通过主键删除数据
*
* @param $!pk.name 主键
* @return 是否成功
*/
boolean deleteById($!pk.shortType $!pk.name);
}
serviceImpl.java
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
*
* @author $!author
* @since $!time.currTime()
*/
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableName} implements $!{tableInfo.name}Service {
@Resource
private $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper;
/**
* 通过ID查询单条数据
*
* @param $!pk.name 主键
* @return 实例对象
*/
@Override
public $!{tableInfo.name} queryById($!pk.shortType $!pk.name) {
return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryById($!pk.name);
}
/**
* 查询多条数据
*
* @param offset 查询起始位置
* @param limit 查询条数
* @return 对象列表
*/
@Override
public List<$!{tableInfo.name}> queryAllByLimit(int offset, int limit) {
return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryAllByLimit(offset, limit);
}
/**
* 通过实体作为筛选条件查询
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 对象列表
*/
@Override
public List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})){
return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryAll($!tool.firstLowerCase($!{tableInfo.name}));
}
/**
* 按条件【统计】列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
@Override
public Integer countListByParam(Map<String, Object> paramMap){
return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.countListByParam(paramMap);
}
/**
* 按条件【查询】列表,支持:datetiemBegin、datetiemEnd
*
* @param paramMap 参数 map
* @return 对象列表
*/
@Override
public List<$!{tableInfo.name}> queryListByParam(Map<String, Object> paramMap){
return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryListByParam(paramMap);
}
/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
@Override
public $!{tableInfo.name} insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.insert($!tool.firstLowerCase($!{tableInfo.name}));
return $!tool.firstLowerCase($!{tableInfo.name});
}
/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
@Override
public $!{tableInfo.name} update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.update($!tool.firstLowerCase($!{tableInfo.name}));
return this.queryById($!{tool.firstLowerCase($!{tableInfo.name})}.get$!tool.firstUpperCase($pk.name)());
}
/**
* 通过主键删除数据
*
* @param $!pk.name 主键
* @return 是否成功
*/
@Override
public boolean deleteById($!pk.shortType $!pk.name) {
return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.deleteById($!pk.name) > 0;
}
}
语法高亮问题
注意:在版本1.2.6
时发现,模板的后缀名要是.vm
才有语法高亮。
Mybatis-Plus模板 (Velocity)
entity.java
##导入宏定义
$!define
##保存文件(宏定义)
#save("/entity", ".java")
##包路径(宏定义)
#setPackageSuffix("entity")
##自动导入包(全局变量)
$!autoImport
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
##表注释(宏定义)
#tableComment("表实体类")
@SuppressWarnings("serial")
public class $!{tableInfo.name} extends Model<$!{tableInfo.name}> {
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})//${column.comment}#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.fullColumn)
#getSetMethod($column)
#end
#foreach($column in $tableInfo.pkColumn)
/**
* 获取主键值
*
* @return 主键值
*/
@Override
protected Serializable pkVal() {
return this.$!column.name;
}
#break
#end
}
dao.java
##导入宏定义
$!define
##设置表后缀(宏定义)
#setTableSuffix("Dao")
##保存文件(宏定义)
#save("/dao", "Dao.java")
##包路径(宏定义)
#setPackageSuffix("dao")
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;
##表注释(宏定义)
#tableComment("表数据库访问层")
public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {
}
service.java
##导入宏定义
$!define
##设置表后缀(宏定义)
#setTableSuffix("Service")
##保存文件(宏定义)
#save("/service", "Service.java")
##包路径(宏定义)
#setPackageSuffix("service")
import com.baomidou.mybatisplus.extension.service.IService;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;
##表注释(宏定义)
#tableComment("表服务接口")
public interface $!{tableName} extends IService<$!tableInfo.name> {
}
serviceImpl
##导入宏定义
$!define
##设置表后缀(宏定义)
#setTableSuffix("ServiceImpl")
##保存文件(宏定义)
#save("/service/impl", "ServiceImpl.java")
##包路径(宏定义)
#setPackageSuffix("service.impl")
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
##表注释(宏定义)
#tableComment("表服务实现类")
@Service("$!tool.firstLowerCase($tableInfo.name)Service")
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Dao, $!{tableInfo.name}> implements $!{tableInfo.name}Service {
}
controller.java
##导入宏定义
$!define
##设置表后缀(宏定义)
#setTableSuffix("Controller")
##保存文件(宏定义)
#save("/controller", "Controller.java")
##包路径(宏定义)
#setPackageSuffix("controller")
##定义服务名
#set($serviceName = $!tool.append($!tool.firstLowerCase($!tableInfo.name), "Service"))
##定义实体对象名
#set($entityName = $!tool.firstLowerCase($!tableInfo.name))
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.ApiController;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import $!{tableInfo.savePackageName}.entity.$!tableInfo.name;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
##表注释(宏定义)
#tableComment("表控制层")
@RestController
@RequestMapping("$!tool.firstLowerCase($!tableInfo.name)")
public class $!{tableName} extends ApiController {
/**
* 服务对象
*/
@Resource
private $!{tableInfo.name}Service $!{serviceName};
/**
* 分页查询所有数据
*
* @param page 分页对象
* @param $!entityName 查询实体
* @return 所有数据
*/
@GetMapping
public R selectAll(Page<$!tableInfo.name> page, $!tableInfo.name $!entityName) {
return success(this.$!{serviceName}.page(page, new QueryWrapper<>($!entityName)));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public R selectOne(@PathVariable Serializable id) {
return success(this.$!{serviceName}.getById(id));
}
/**
* 新增数据
*
* @param $!entityName 实体对象
* @return 新增结果
*/
@PostMapping
public R insert(@RequestBody $!tableInfo.name $!entityName) {
return success(this.$!{serviceName}.save($!entityName));
}
/**
* 修改数据
*
* @param $!entityName 实体对象
* @return 修改结果
*/
@PutMapping
public R update(@RequestBody $!tableInfo.name $!entityName) {
return success(this.$!{serviceName}.updateById($!entityName));
}
/**
* 删除数据
*
* @param idList 主键结合
* @return 删除结果
*/
@DeleteMapping
public R delete(@RequestParam("idList") List<Long> idList) {
return success(this.$!{serviceName}.removeByIds(idList));
}
}
dto.java
##导入宏定义
$!define
##保存文件(宏定义)
#save("/dto", ".java")
##包路径(宏定义)
#setPackageSuffix("dto")
##自动导入包(全局变量)
$!autoImport
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
##表注释(宏定义)
#tableComment("DTO 数据传输对象")
@SuppressWarnings("serial")
public class $!{tableInfo.name} extends Model<$!{tableInfo.name}> {
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})//${column.comment}#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.fullColumn)
#getSetMethod($column)
#end
#foreach($column in $tableInfo.pkColumn)
/**
* 获取主键值
*
* @return 主键值
*/
@Override
protected Serializable pkVal() {
return this.$!column.name;
}
#break
#end
}
EasyCode模板 - 说明文档
说明文档:
属性
$author 设置中的作者 java.lang.String
$modulePath 选中的module路径 java.lang.String
$projectPath 项目绝对路径 java.lang.String
对象
$tableInfo 表对象
obj 表原始对象 com.intellij.database.model.DasTable
name 表名(转换后的首字母大写)java.lang.String
comment 表注释 java.lang.String
fullColumn 所有列 java.util.List<ColumnInfo>
pkColumn 主键列 java.util.List<ColumnInfo>
otherColumn 其他列 java.util.List<ColumnInfo>,除主键以外的列
savePackageName 保存的包名 java.lang.String
savePath 保存路径 java.lang.String
saveModelName 保存的model名称 java.lang.String
columnInfo 列对象
obj 列原始对象 com.intellij.database.model.DasColumn
name 列名(首字母小写) java.lang.String
comment 列注释 java.lang.String
type 列类型(类型全名) java.lang.String
shortType 列类型(短类型) java.lang.String
custom 是否附加列 java.lang.Boolean
ext 附加字段(Map类型) java.lang.Map<java.lang.String, java.lang.Object>
$tableInfoList java.util.List<TableInfo>所有选中的表
$importList 所有需要导入的包集合 java.util.Set<java.lang.String>
回调
&callback 回调对象
setFileName(String) 设置文件储存名字
setSavePath(String) 设置文件储存路径,默认使用选中路径
setReformat(Boolean) 设置是否重新格式化生成后的代码,默认为true
工具
$tool
firstUpperCase(String name) 首字母大写方法
firstLowerCase(String name) 首字母小写方法
getClsNameByFullName(String fullName) 通过包全名获取类名
getJavaName(String name) 将下划线分割字符串转驼峰命名(属性名)
getClassName(String name) 将下划线分割字符串转驼峰命名(类名)
hump2Underline(String str) 将驼峰字符串转下划线字符串
append(Object... objs) 多个数据进行拼接
newHashSet(Object... objs) 创建一个HashSet对象
newArrayList(Object... objs) 创建一个ArrayList对象
newLinkedHashMap() 创建一个LinkedHashMap()对象
newHashMap() 创建一个HashMap()对象
getField(Object obj, String fieldName) 获取对象的属性值,可以访问任意修饰符修饰的属性.配合debug方法使用.
call(Object... objs) 空白执行方法,用于调用某些方法时消除返回值
debug(Object obj) 调式方法,用于查询对象结构.可查看对象所有属性与public方法
serial() 随机获取序列化的UID
service(String serviceName, Object... param)远程服务调用
parseJson(String) 将字符串转Map对象
toJson(Object, Boolean) 将对象转json对象,Boolean:是否格式化json,不填时为不格式化。
toUnicode(String, Boolean) 将String转换为unicode形式,Boolean:是否转换所有符号,不填时只转换中文及中文符号。
$time
currTime(String format) 获取当前时间,指定时间格式(默认:yyyy-MM-dd HH:mm:ss)
$generateService
run(String, Map<String,Object>) 代码生成服务,参数1:模板名称,参数2:附加参数。
$dasUtil Database提供的工具类,具体可方法请查看源码,适用于高端玩家
$dbUtil Database提供的工具类,具体可方法请查看源码,适用于高端玩家
场景实例
如果想知道有哪些数据方法可用,请到debug.json
的实时调试结果中探索。。。
判断主键
注意这里遍历的是$tableInfo.pkColumn
#foreach($column in $tableInfo.pkColumn)
@PrimaryKey
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
添加 @PrimaryKey
注解
@PrimaryKey
private String id;
判断有注释
注意这里遍历的是$tableInfo.otherColumn
#foreach($column in $tableInfo.otherColumn)
#if(${column.comment})
/**
* ${column.comment}
*/
#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
添加注释
/**
* 创建人
*/
private String createdBy;
判断表字段是否非空
#foreach($column in $tableInfo.otherColumn)
#if(${column.obj.isNotNull()})
@NotNull(message = "${column.comment}不能为空")
#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}
添加@NotNull
注解
@NotNull(message = "创建时间不能为空")
private Date createdDate;
判断表字段类型
如果是varchar
类型。(这次把前面的几个组合起来)
#foreach($column in $tableInfo.otherColumn)
#if(${column.comment})
/**
* ${column.comment}
*/
#end
#if(${column.obj.isNotNull()})
@NotNull(message = "${column.comment}不能为空")
#end
#if($!tool.getField(${column.obj.dataType}, "typeName") == "varchar" )
@Size(max = ${column.obj.dataType.getLength()}, message = "${column.comment}长度不能超过${column.obj.dataType.getLength()}个字符")
#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
我们添加一个 @Size
注解
描述不是非空字段所以这里没出现@NotNull
注解
/**
* XX描述
*/
@Size(max = 500, message = "XX描述长度不能超过500个字符")
private String remark;
生成UUID主键
mapper.xml
中我们判断如果主键是varchar(32)
那就生成UUID(根据自己项目情况定)
<insert id="insert">
#foreach($column in $tableInfo.pkColumn)
#if(${column.obj.dataType} == "varchar(32)")
<selectKey keyProperty="$pk.name" order="BEFORE" resultType="java.lang.String">
select UPPER(REPLACE(UUID(),"-",""))
</selectKey>
#end
#end
insert into $!{tableInfo.obj.name}(#if($pk.type == "java.lang.String")$pk.name,#end #foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
values (#if($pk.type == "java.lang.String")#{$pk.name},#end #foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end)
</insert>
踩坑记录
当我们选择多个表,如果觉得统一配置
不灵,可以按如下找到EasyCode
的配置确认一下。
编辑模板时,12分小心,这两个对应关系别点错了。。。还没二次确认。。。
好几次把配置组删了5555555555555
参考资料
EasyCode 官方地址 中文官网,安装使用文档一应俱全。就不多废话了。
Velocity 学习笔记