# 代码生成配置[IDEA]
# 注意:
1.本工具截至目前兼容IDEA 2018.3.*版本
2.安装好插件后需要更新插件内模版,封包模版已过时需要根据文档做更新
3.如果出现插件无法生成代码,可先删除项目文件夹.idea文件夹后重试,仍旧不行联系后台
4.本代码生成工具只能在使用IDEA连接数据库后方可使用,连接数据库为前置条件
5.生成前端插件支持拖拽
# 工具下载(目前兼容IDEA 2018.3.*版本)
- JAVA代码生成工具:ta-idea-plugin-2018.3-IU-1.8.1-RELEASE.zip (opens new window)
- 前端代码生成工具 ta-idea-plugin-2018.3-WS-1.7.2-RELEASE.zip (opens new window)
# 安装
下载生成工具到本地目录,打开idea进行安装:
选择安装本地磁盘文件,选择上一步下载的文件进行安装,安装成功后重启即可
# 测试
重启完成后我们需要测试插件是否安装成功:
首先连接数据库 连接成功 数据库连接成功后开始生成代码,打开数据库连接表目录,点击数据库表右键选择代码生成选项,如果不存在选项说明插件可能安装失败
填入配置信息点击确认即可完成
# 修改工具代码模版
- Type Mapper 安装包本身已经对常用数据类型做了映射,如特殊情况可自行添加
- Template Setting 代码生成模版示例
# entity
##引入宏定义
$!define
##定义初始变量
$!init
##使用宏定义设置回调(保存位置与文件后缀)
#save("/entity", "Po.java")
##使用宏定义设置包后缀
#setPackageSuffix("entity")
##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.HashMap;
import java.util.Map;
##使用宏定义实现类注释信息
#tableComment("实体类")
@ApiModel(value = "$!{tableInfo.name}")
public class $!{tableInfo.name}Po implements Serializable {
private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})//${column.comment}#end
@ApiModelProperty(value="${column.comment}")
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end
##toMap
public Map toMap(){
Map map = new HashMap();
#foreach($column in $tableInfo.fullColumn)
map.put("$!{column.name}",$!{column.name});
#end
return map;
}
## toString 方法
@Override
public String toString() {
return "$!{tableInfo.name}{" +
#foreach($column in $tableInfo.fullColumn)
",$!{column.name} ='" + $!{column.name} + '\'' +
#end
'}';
}
}
# readMapper
##定义初始变量
$!init
#set($tableName = $tool.append($fileName, "ReadMapper"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper/read"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper.read;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import com.jinke.ts.module.mybatis.mapper.TsSupportMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} extends TsSupportMapper{
/**
* 通过ID查询单条数据
*
* @param $!pk.name 主键
* @return 实例对象
*/
$!{tableInfo.name}Po queryById($!pk.shortType $!pk.name);
/**
* 通过实体作为筛选条件查询
*
* @param po 实例对象
* @return 对象列表
*/
List<$!{tableInfo.name}Po> selectByPage($!{tableInfo.name}Po po);
/**
* 通过实体作为筛选条件查询
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 对象列表
*/
List<$!{tableInfo.name}Po> queryAll($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name}));
}
# writeMapper
##定义初始变量
$!init
#set($tableName = $tool.append($fileName, "WriteMapper"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper/write"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper.write;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import java.util.List;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} {
/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 影响行数
*/
int insert($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 影响行数
*/
int update($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 通过主键删除数据
*
* @param $!pk.name 主键
* @return 影响行数
*/
int deleteById($!pk.shortType $!pk.name);
}
# readMapper.xml
##定义初始变量
$!init
##引入mybatis支持
$!mybatisSupport
##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{fileName}, "ReadMapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper/read"))
##拿到主键,没有主键取第一列
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#else
#set($pk = $tableInfo.fullColumn.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.read.$!{fileName}ReadMapper">
<resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po" 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.parent.name}.$!tableInfo.obj.name
where $!pk.obj.name = #{$!pk.name,jdbcType=$!pk.ext.jdbcType}
</select>
<!--通过实体作为筛选条件查询-->
<select id="queryAll" resultMap="$!{tableInfo.name}Map">
select
#allSqlColumn()
from $!{tableInfo.obj.parent.name}.$!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,jdbcType=$!column.ext.jdbcType}
</if>
#end
</where>
</select>
<!--通过实体作为筛选条件查询-->
<select id="selectByPage" resultMap="$!{tableInfo.name}Map">
select
#allSqlColumn()
from $!{tableInfo.obj.parent.name}.$!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,jdbcType=$!column.ext.jdbcType}
</if>
#end
</where>
</select>
</mapper>
# writeMapper.xml
##定义初始变量
$!init
##引入mybatis支持
$!mybatisSupport
##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{fileName}, "WriteMapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper/write"))
##拿到主键,没有主键取第一列
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#else
#set($pk = $tableInfo.fullColumn.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.write.$!{fileName}WriteMapper">
<!--新增所有列-->
<insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">
insert into $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end)
values (#foreach($column in $tableInfo.otherColumn)#{$!{column.name},jdbcType=$!column.ext.jdbcType}#if($velocityHasNext), #end#end)
</insert>
<!--通过主键修改数据-->
<update id="update">
update $!{tableInfo.obj.parent.name}.$!{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.parent.name}.$!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name,jdbcType=$!pk.ext.jdbcType}
</delete>
</mapper>
# readService
##定义初始变量
$!init
#set($tableName = $tool.append($fileName, "ReadService"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/read"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.read;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import java.util.List;
import com.jinke.ts.core.restservice.requestbean.PageParam;
import com.jinke.ts.core.restservice.resultbaen.Page;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务接口
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} {
/**
* 通过ID查询单条数据
*
* @param $!pk.name 主键
* @return 实例对象
*/
$!{tableInfo.name}Po queryById($!pk.shortType $!pk.name);
/**
* 分页查询
*
* @param condition
* @param pageParam
* @return
*/
Page<$!{tableInfo.name}Po> selectByPage($!{tableInfo.name}Po condition, PageParam pageParam);
}
# readServiceImpl
##定义初始变量
$!init
#set($tableName = $tool.append($fileName, "ReadServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/read/impl"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.read.impl;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.mapper.read.$!{fileName}ReadMapper;
import $!{tableInfo.savePackageName}.service.read.$!{fileName}ReadService;
import com.jinke.ts.core.transaction.annotation.TsTransactional;
import org.springframework.stereotype.Service;
import com.jinke.ts.core.restservice.requestbean.PageParam;
import com.jinke.ts.core.restservice.resultbaen.Page;
import javax.annotation.Resource;
import java.util.List;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
*
* @author $!author
* @since $!time.currTime()
*/
@Service
@TsTransactional(readOnly = true)
public class $!{tableName} implements $!{fileName}ReadService {
@Resource
private $!{fileName}ReadMapper $!tool.firstLowerCase($!{fileName})ReadMapper;
/**
* 通过ID查询单条数据
*
* @param $!pk.name 主键
* @return 实例对象
*/
@Override
public $!{tableInfo.name}Po queryById($!pk.shortType $!pk.name) {
return this.$!{tool.firstLowerCase($!{fileName})}ReadMapper.queryById($!pk.name);
}
/**
* 分页查询
*
* @param condition
* @param pageParam
* @return
*/
@Override
public Page<$!{tableInfo.name}Po> selectByPage($!{tableInfo.name}Po condition, PageParam pageParam) {
$!{tool.firstLowerCase($!{fileName})}ReadMapper.beginPager(pageParam);
Page<$!{tableInfo.name}Po> resultPage = $!{tool.firstLowerCase($!{fileName})}ReadMapper.endPager($!{tool.firstLowerCase($!{fileName})}ReadMapper.selectByPage(condition));
return resultPage;
}
}
# writeService
##定义初始变量
$!init
##定义初始变量
#set($tableName = $tool.append($fileName, "WriteService"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/write"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.write;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import java.util.List;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务接口
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} {
/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
$!{tableInfo.name}Po insert($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
$!{tableInfo.name}Po update($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name}));
/**
* 通过主键删除数据
*
* @param $!pk.name 主键
* @return 是否成功
*/
boolean deleteById($!pk.shortType $!pk.name);
}
# writeServiceImpl
##定义初始变量
$!init
##定义初始变量
#set($tableName = $tool.append($fileName, "WriteServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/write/impl"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.write.impl;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.mapper.write.$!{fileName}WriteMapper;
import $!{tableInfo.savePackageName}.service.write.$!{fileName}WriteService;
import com.jinke.ts.core.transaction.annotation.TsTransactional;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
*
* @author $!author
* @since $!time.currTime()
*/
@Service
@TsTransactional
public class $!{tableName} implements $!{fileName}WriteService {
@Resource
private $!{fileName}WriteMapper $!tool.firstLowerCase($!{fileName})WriteMapper;
/**
* 新增数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
@Override
public $!{tableInfo.name}Po insert($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name})) {
this.$!{tool.firstLowerCase($!{fileName})}WriteMapper.insert($!tool.firstLowerCase($!{tableInfo.name}));
return $!tool.firstLowerCase($!{tableInfo.name});
}
/**
* 修改数据
*
* @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
* @return 实例对象
*/
@Override
public $!{tableInfo.name}Po update($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name})) {
this.$!{tool.firstLowerCase($!{fileName})}WriteMapper.update($!tool.firstLowerCase($!{tableInfo.name}));
return $!tool.firstLowerCase($!{tableInfo.name});
}
/**
* 通过主键删除数据
*
* @param $!pk.name 主键
* @return 是否成功
*/
@Override
public boolean deleteById($!pk.shortType $!pk.name) {
return this.$!{tool.firstLowerCase($!{fileName})}WriteMapper.deleteById($!pk.name) > 0;
}
}
# restService
##定义初始变量
$!init
#set($tableName = $tool.append($fileName, "RestService"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/rest"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}rest;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.service.read.$!{fileName}ReadService;
import $!{tableInfo.savePackageName}.service.write.$!{fileName}WriteService;
import com.jinke.ts.core.restservice.BaseRestService;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;
import com.jinke.ts.core.restservice.annotation.RestService;
import com.jinke.ts.core.restservice.requestbean.PageParam;
import javax.annotation.Resource;
import javax.validation.Valid;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表控制层
*
* @author $!author
* @since $!time.currTime()
*/
@Api(tags = { "$!{tableInfo.comment}" })
@RestService("/$!{tool.firstLowerCase($fileName)}")
@Valid
public class $!{tableName} extends BaseRestService {
/**
* 服务对象
*/
@Resource
private $!{fileName}ReadService $!tool.firstLowerCase($fileName)ReadService;
@Resource
private $!{fileName}WriteService $!tool.firstLowerCase($fileName)WriteService;
/**
* 条件查询信息
*
* @param condition 搜索条件
* @param pageParam 分页参数
*/
@ApiOperation(value = "列表查询", response = $!{tableInfo.name}Po.class,produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping("queryByCondition")
public void queryByCondition($!{tableInfo.name}Po condition, PageParam pageParam) {
setPageBean(this.$!{tool.firstLowerCase($fileName)}ReadService.selectByPage(condition, pageParam));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@ApiOperation(value = "$!{tableInfo.comment}查询",response = $!{tableInfo.name}Po.class, produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping("selectById")
public $!{tableInfo.name}Po selectById($!pk.shortType id) {
return this.$!{tool.firstLowerCase($fileName)}ReadService.queryById(id);
}
/**
* 通过主键新增单条数据
*
* @param entity 主键
* @return 单条数据
*/
@ApiOperation(value = "$!{tableInfo.comment}新增",response = $!{tableInfo.name}Po.class, produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping("insert")
public void insert($!{tableInfo.name}Po entity) {
$!{tableInfo.name}Po response = this.$!{tool.firstLowerCase($fileName)}WriteService.insert(entity);
setData("result",response);
}
/**
* 通过主键编辑单条数据
*
* @param entity 主键
* @return 单条数据
*/
@ApiOperation(value = "$!{tableInfo.comment}编辑",response = $!{tableInfo.name}Po.class, produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping("update")
public void update($!{tableInfo.name}Po entity) {
$!{tableInfo.name}Po po = this.$!{tool.firstLowerCase($fileName)}WriteService.update(entity);
setData("result",po);
}
/**
* 通过主键删除单条数据
*
* @param id 主键
* @return 单条数据
*/
@ApiOperation(value = "$!{tableInfo.comment}删除", produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping("deleteById")
public void deleteById($!pk.shortType id) {
boolean response = this.$!{tool.firstLowerCase($fileName)}WriteService.deleteById(id);
setData("result",response);
}
}