EasyCode简介
基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。
只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。
支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。
打开设置插件下载搜索EasyCode插件,下载后需要重启IDEA
easyCode自动生成实体类是基于数据库中的表,故通过idea中自带的Database工具连接数据库,通过选择表来生成对应表的实体类
配置连接信息,与Navicat工具连接数据库相似,测试连接成功后点击OK应用
连接成功之后可能默认只展示个别数据库,这个时候需要勾选想要展示的数据库
可以看见Java类型和数据库字段类型映射关系
下载完会默认生成一下模板,此时我们需要根据自己的需要更改模板
定义全局变量,在模板中可能会共同使用,可用于去掉指定表的前缀
在init.vm中定义去掉表的指定前缀,因为有时候我们所定义的表会带有一些前缀,此时我们生成实体类的时候并不会用到前缀,故可动态去除
##去掉表的t_前缀
$!tableInfo.setName($tool.getClassName($tableInfo.obj.name.replaceFirst("t_","")))
##灵活写法 ,也可去掉别的前缀,如: 如含有book_则替换为 ""
#if($tableInfo.obj.name.startsWith("book_"))
$!tableInfo.setName($tool.getClassName($tableInfo.obj.name.replaceFirst("book_","")))
#end
使用方法:
在模板中通过$!{init.vm}
定义使用
定义模板处下边可直接看说明文档,这里只是复制粘贴出来了
属性
$author 设置中的作者 java.lang.String
$modulePath 选中的module路径 java.lang.String
$projectPath 项目绝对路径 java.lang.String
对象
$tableInfo 表对象
obj 表原始对象 com.intellij.database.model.DasTable
preName 表前缀 java.lang.String
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) 设置是否重新格式化生成后的代码,默认为界面选定值
setWriteFile(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提供的工具类,具体可方法请查看源码,适用于高端玩家
$dasUtil.
$dbUtil Database提供的工具类,具体可方法请查看源码,适用于高端玩家
在该处使用了lombok插件简化get、set方法的生成,故先引入lombok依赖以及下载lombok插件
lombok依赖
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
dependency>
lombok插件下载
实体类生成后需要手动导入@Data注解,每次手动导入很是不方便,恰好IDEA是可以设置自动导包以及自动删除不使用的包的
依次操作 :
File → setting → Editor → General → Auto Import → Apply或OK
entity.java.vm 模板定义
内容如下:
##引入宏定义
$!{define.vm}
$!{init.vm}
##使用宏定义设置回调(保存位置与文件后缀),默认生成的实体类(A)前缀会加上entity,后置会加上.java
#save("/entity", ".java")
##使用宏定义设置包后缀
#setPackageSuffix("entity")
##使用全局变量实现默认包导入
$!{autoImport.vm}
import java.io.Serializable;
##使用宏定义实现类注释信息
/**
* $!{tableInfo.comment}($!{tableInfo.name})实体类
*
* @author jzh
* @date $!time.currTime("yyyy-MM-dd HH:mm:ss")
*/
## @Data lombok的注解
@Data
public class $!{tableInfo.name} implements Serializable {
private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})
/**
* ${column.comment}
*/#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}
根据模板生成Java实体类代码
设置生成规则
温馨提示:首次生成由于在模板中定义了前缀目录entity,此时提示该目录未存在是否自动创建一个
最终生成效果如下:
package com.hang.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户表(User)实体类
*
* @author jzh
* @date 2022-11-13 17:41:04
*/
@Data
public class User implements Serializable {
private static final long serialVersionUID = 120360764081252207L;
/**
* 主键
*/
private Long userId;
/**
* 借书卡编号
*/
private String userLibraryCardNumber;
/**
* 用户登录账号
*/
private String userName;
}
还可以选中多个表进行批量生成
用到的mybatis-plus依赖
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.2.0version>
dependency>
dao.java.vm内容:
##引入宏定义
$!{init.vm}
##定义初始变量 拼接dao层类名:表明+Mapper
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##设置回调 设置文件名
$!callback.setFileName($tool.append($tableName, ".java"))
##设置文件名所保存路径 保存在dao包下
$!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
/**
* $!{tableInfo.comment}($!{tableInfo.name})数据库访问层
*
* @author jzh
* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")
*/
public interface $!{tableName} extends BaseMapper<$!{tableInfo.name}> {
}
Generate Code生成规则
生成效果:
package com.hang.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hang.entity.User;
/**
* 用户表(User)表数据库访问层
*
* @author jzh
* @since 2022-11-13 17:59:22
*/
public interface UserMapper extends BaseMapper<User> {
}
mapper.xml.vm内容:
##引入宏定义
$!{init.vm}
##引入mybatis支持
$!{mybatisSupport.vm}
##设置保存名称与保存位置
$!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}.dao.$!{tableInfo.name}Mapper">
</mapper>
Generate Code生成规则设置
生成效果:
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hang.dao.UserMapper">
mapper>
service.java.vm模板内容:
##引入宏定义
$!{init.vm}
##定义初始变量
#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};
/**
* $!{tableInfo.comment}($!{tableInfo.name})服务接口
*
* @author jzh
* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")
*/
public interface $!{tableName} extends IService<User> {
}
serviceImpl.java.vm模板内容:
##引入宏定义
$!{init.vm}
##定义初始变量
#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}.dao.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
/**
* $!{tableInfo.comment}($!{tableInfo.name})服务实现类
*
* @author jzh
* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")
*/
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper,$!{tableInfo.name}> implements $!{tableInfo.name}Service {
@Resource
private $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper;
}
Generate Code规则设置
生成效果:
Service
package com.hang.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hang.entity.User;
/**
* 用户表(User)服务接口
*
* @author jzh
* @since 2022-11-13 18:51:27
*/
public interface UserService extends IService<User> {
}
ServiceImpl
package com.hang.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hang.dao.UserMapper;
import com.hang.entity.User;
import com.hang.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 用户表(User)服务实现类
*
* @author jzh
* @since 2022-11-13 18:51:30
*/
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
@Resource
private UserMapper userMapper;
}
controller.java.vm模板内容
##引入宏定义
$!{init.vm}
##定义初始变量
#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;
/**
* $!{tableInfo.comment}($!{tableInfo.name})控制层
*
* @author jzh
* @since $!time.currTime("yyyy-MM-dd HH:mm:ss")
*/
@Controller
@RequestMapping("")
public class $!{tableName} {
@Resource
private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;
}
Generate Code生成配置
生成效果:
package com.hang.controller;
import com.hang.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
/**
* 用户表(User)控制层
*
* @author jzh
* @since 2022-11-13 19:02:13
*/
@Controller
@RequestMapping("")
public class UserController {
@Resource
private UserService userService;
}
在模板全都定义好的情况下,可直接一次性生成entity、dao、service、controller