mybatis-plus代码生成器加模板实践
MyBatis-Plus(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生!
这是官方的介绍说明,不了解的小伙伴可以点击标签去查看。
之前也有写过一版mp的代码生成器,他原本的代码生成器只是生成了一个简单的mvc架构,而且不包括前端的代码,前端的html和js还需要自己去编写,比较麻烦,这个版本集成了Velocity模板,所有的CRUD操作都可以自己定义,包过前端的js和html文件也可生成,大大简化了代码量,用户只需要关注模块的核心业务即可。
下面介绍一下开发流程,项目使用的是springboot+mybatis-plus+mysql
一、集成Velocity模板
maven项目中导入该坐标
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
(一)创建VelocityUtils工具类
该工具类会将前端的文件全部创建好
/**
* @Author: SongTiank
* @Description: 前端文件生成
* @Date: 2021/6/22 10:01
* @Version: 1.0
*/
public class VelocityUtils {
private final static Logger log = LoggerFactory.getLogger(VelocityUtils.class);
private static final String VM_ENTITY_PATH = "templates/js/frontEnd.js.vm";
private static final String VM_ENTITY_ADD_PATH = "templates/js/frontEnd_add.js.vm";
private static final String VM_ENTITY_EDIT_PATH = "templates/js/frontEnd_edit.js.vm";
private static final String VM_HTML_PATH = "templates/html/frontEnd.html.vm";
/**
* 创建首页js
* fileName 文件名称
* tableColumn 数据库字段集合
* CREAT_PATH 文件生成路径
*/
public static void creatEntityJs(String fileName,List<TableColumn> tableColumn,String CREAT_PATH){
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
velocityEngine.init();
// 获取模板文件
Template template = velocityEngine.getTemplate(VM_ENTITY_PATH);
// 设置变量,velocityContext是一个类似map的结构
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("tableName",fileName);
tableColumn.remove(0);//移除只存表名的对象;
velocityContext.put("list", tableColumn);
// 输出渲染后的结果
StringWriter stringWriter = new StringWriter();
template.merge(velocityContext, stringWriter);
//写入文件中
ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+".js");
}
/**
* 创建新增js
* fileName 文件名称
* CREAT_PATH 文件生成路径
*/
public static void creatEntityAddJs(String fileName,String CREAT_PATH){
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
velocityEngine.init();
// 获取模板文件
Template template = velocityEngine.getTemplate(VM_ENTITY_ADD_PATH);
// 设置变量,velocityContext是一个类似map的结构
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("tableName", fileName);
// 输出渲染后的结果
StringWriter stringWriter = new StringWriter();
template.merge(velocityContext, stringWriter);
//写入文件中
ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+"_add.js");
}
/**
* 创建修改js
* fileName 文件名称
* CREAT_PATH 文件生成路径
*/
public static void creatEntityEditJs(String fileName,String CREAT_PATH){
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
velocityEngine.init();
// 获取模板文件
Template template = velocityEngine.getTemplate(VM_ENTITY_EDIT_PATH);
// 设置变量,velocityContext是一个类似map的结构
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("tableName", fileName);
// 输出渲染后的结果
StringWriter stringWriter = new StringWriter();
template.merge(velocityContext, stringWriter);
//写入文件中
ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+"_edit.js");
}
/**
* 创建html页面
* fileName 文件名称
* CREAT_PATH 文件生成路径
*/
public static void creatEntityHtml(String fileName,String CREAT_PATH){
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
velocityEngine.init();
// 获取模板文件
Template template = velocityEngine.getTemplate(VM_HTML_PATH);
// 设置变量,velocityContext是一个类似map的结构
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("tableName", fileName);
// 输出渲染后的结果
StringWriter stringWriter = new StringWriter();
template.merge(velocityContext, stringWriter);
//写入文件中
ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+".html");
}
}
文件目录展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6c4d09241e81f93563be0cb3cf0850ca.png
创建代码工具类
/**
* 代码生成执行类
* @Author: SongTiank
* @Date: 2021/6/20 13:01
*/
public class CreatTableUtil {
/**
* 代码执行类
*TODO 文件存储位置部署需要更换
* 前端页面选择数据库表传递过来的数据。
* 我是创建到了本地D盘,模仿服务器,而后压缩下载到本地,再将downLoad里的文件删除,服务器上需要调整路径。
* @param creatTableName 待创建的数据库表名集合、
* @param dataSource 数据库注册、
* @param Author 创建人
* @param PakagePath 包路径
* @param ModelName 模块名
* @return
*/
public static String creating(String[] creatTableName, DataSourceConfig dataSource,String Author,String PakagePath,
String ModelName,HttpServletResponse response, HttpServletRequest request) {
AutoGenerator mpg = new AutoGenerator();
mpg.setDataSource(dataSource);
String projectPath = request.getSession().getServletContext().getRealPath("/");
String creatPath = "D://text" + "/" + randomUUID().toString().replaceAll("-", "");
String downLoadPath = "D://text//downLoad";
File temDir = new File(creatPath);
if (!temDir.exists()) {
temDir.mkdirs();
}
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(creatPath); //生成路径
gc.setAuthor(Author); //作者
gc.setFileOverride(true); //是否覆盖
gc.setActiveRecord(true); // 不需要ActiveRecord特性的请改为false
gc.setEnableCache(false); // XML 二级缓存
gc.setBaseResultMap(true); // XML ResultMap
gc.setBaseColumnList(true); // XML columList
gc.setOpen(false);
mpg.setGlobalConfig(gc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
if (creatTableName != null && creatTableName.length>0) {
strategy.setInclude(creatTableName); // 需要生成的表
}
strategy.setEntityBuilderModel(true);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent(ModelName);
pc.setController(PakagePath+".controller");
pc.setEntity(PakagePath+".entity");
pc.setMapper(PakagePath+".mapper");
pc.setService(PakagePath+".service");
pc.setServiceImpl(PakagePath+".serviceImpl");
pc.setXml(PakagePath+".mapperXml");
mpg.setPackageInfo(pc);
mpg.setTemplate(TemplateGenerate());
// 执行生成
mpg.execute();
//--------------前端代码生成------------------------
for (String tableName : creatTableName) {
try {
//获取该表的名称,和所有字段以及注释,作为前端生成的条件。
List<TableColumn> tableColumn = getTableColumn(dataSource, tableName);
String fileName= tableColumn.get(0).getTableName();
VelocityUtils.creatEntityJs(fileName,tableColumn,temDir.getPath());//首页js
VelocityUtils.creatEntityAddJs(fileName,temDir.getPath());//新增js
VelocityUtils.creatEntityEditJs(fileName,temDir.getPath());//编辑js
VelocityUtils.creatEntityHtml(fileName,temDir.getPath());//创建html页面
VelocityUtils.creatEntityHtmlAdd(fileName,tableColumn,temDir.getPath());//创建add页面
VelocityUtils.creatEntityHtmlEdit(fileName,tableColumn,temDir.getPath());//创建edit页面
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//--------------前端代码生成结束----------------------
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=excel.zip");
String zipName=UUID.randomUUID().toString().replaceAll("-", "")+".zip";
/** 4.调用工具类,下载zip压缩包 */
try {
FileOutputStream fos1 = new FileOutputStream(new File(downLoadPath + "//"+zipName));
ZipUtil.toZip(temDir.getPath(), fos1, true);
}catch (Exception e){
e.printStackTrace();
}finally {
ZipUtil.delFolder(creatPath);
}
return zipName;
}
/**
* 自定义模板配置
*/
private static TemplateConfig TemplateGenerate() {
TemplateConfig templateConfig = new TemplateConfig()
.setController("templates/java/controller.java" )
.setService("templates/java/service.java" )
.setServiceImpl("templates/java/serviceImpl.java" )
.setEntity("templates/java/entity.java")
.setMapper("templates/java/mapper.java" )
.setXml("templates/java/mapper.xml");
return templateConfig;
}
```java
/**
* 动态获取表字段
* @return 查询到的表字段对象集合
* @throws ClassNotFoundException
* @throws SQLException
*/
public static List<TableColumn> getTableColumn(DataSourceConfig dataSource,String tableName) throws ClassNotFoundException, SQLException {
List<TableColumn> tableColumnList=new ArrayList<>();//存储字段和注释
Class.forName(dataSource.getDriverName());
Connection conn= DriverManager.getConnection(dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());
TableColumn _tableName = new TableColumn();//表名改驼峰
_tableName.setTableName(JDBCUtils.underline2Camel(tableName));
tableColumnList.add(_tableName);//存入表名
String sql = "select column_name,column_comment from Information_schema.columns where table_Name='"+tableName+"'";
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
//获取表字段、表注释,underline2Camel方法:下划线取消,后面字母调整大写,小驼峰命名
String columnName = JDBCUtils.underline2Camel(rs.getString(1), false);
String content = JDBCUtils.underline2Camel(rs.getString(2), false);
TableColumn tableColumn = new TableColumn(columnName,content); //字段名称,字段注释
tableColumnList.add(tableColumn);
}
rs.close();
conn.close();
return tableColumnList;
}
}
下划线调整工具类
/**
* 下划线调整工具类
* @param line
* @param firstIsUpperCase
* @return
*/
public static String underline2Camel(String line, boolean ... firstIsUpperCase) {
String str = "";
if (StringUtils.isBlank(line)) {
return str;
} else {
StringBuilder sb = new StringBuilder();
String[] strArr;
// 不包含下划线,且第二个参数是空的
if (!line.contains("_") && firstIsUpperCase.length == 0) {
sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1));
str = sb.toString();
} else if (!line.contains("_") && firstIsUpperCase.length != 0) {
if (!firstIsUpperCase[0]) {
sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1));
str = sb.toString();
} else {
sb.append(line.substring(0, 1).toUpperCase()).append(line.substring(1));
str = sb.toString();
}
} else if (line.contains("_") && firstIsUpperCase.length == 0) {
strArr = line.split("_");
for (String s : strArr) {
sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
}
str = sb.toString();
str = str.substring(0, 1).toLowerCase() + str.substring(1);
} else if (line.contains("_") && firstIsUpperCase.length != 0) {
strArr = line.split("_");
for (String s : strArr) {
sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
}
if (!firstIsUpperCase[0]) {
str = sb.toString();
str = str.substring(0, 1).toLowerCase() + str.substring(1);
} else {
str = sb.toString();
}
}
}
return str;
}
以上就是工具类的核心方法,有疑问或者指教欢迎留言~
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤