Mybatis代码生成器

【Java代码生成神器】自动化生成Java实体类、代码、增删改查功能!点击访问

推荐一个自己每天都在用的Java代码生成器!这个网站支持在线生成Java代码,包含完整的Controller\Service\Entity\Dao代码,完整的增删改查功能!

还可以自定义自己的代码模板、自由配置高级选项,指定是否集成Lombok和Swagger等常用库,一键生成,省去了大量时间和精力!
快来试试吧!在线地址
在这里插入图片描述
在这里插入图片描述

一款支持多种ORM框架的Java代码生成器,基于模板引擎实现,具有非常高的自由度,可随意修改为适合你的代码风格
支持JPA、Mybatis、MybatisPlus等ORM框架

以下为开源版本
源码:

  • 前端:https://github.com/dengweiping4j/code-generator-ui.git
  • 后端:https://github.com/dengweiping4j/CodeGenerator.git

界面展示:在这里插入图片描述
在这里插入图片描述

关键代码:

 package com.dwp.codegenerator.utils;import com.dwp.codegenerator.domain.ColumnEntity;
import com.dwp.codegenerator.domain.DatabaseColumn;
import com.dwp.codegenerator.domain.GeneratorParams;
import com.dwp.codegenerator.domain.TableEntity;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class GeneratorUtil {/*** 生成代码** @param generatorParams* @param zip*/public static void generatorCode(GeneratorParams generatorParams, ZipOutputStream zip) {//参数处理TableEntity tableEntity = formatParams(generatorParams);//设置velocity资源加载器initVelocity();//封装模板数据VelocityContext context = getVelocityContext(generatorParams, tableEntity);//渲染模板apply(context, zip, tableEntity, generatorParams);}private static void apply(VelocityContext context, ZipOutputStream zip, TableEntity tableEntity, GeneratorParams generatorParams) {List<String> templates = getTemplates(generatorParams.getGeneratorType());templates.forEach(template -> {StringWriter sw = new StringWriter();Template tpl = Velocity.getTemplate(template, "UTF-8");tpl.merge(context, sw);try {String fileName = getFileName(template, tableEntity.getUpperClassName(), generatorParams);//添加到zipzip.putNextEntry(new ZipEntry(fileName));IOUtils.write(sw.toString(), zip, "UTF-8");IOUtils.closeQuietly(sw);zip.closeEntry();} catch (IOException e) {throw new RuntimeException("渲染模板失败,表名:" + tableEntity.getTableName(), e);}});}/*** 使用自定义模板** @param generatorType* @return*/private static List<String> getTemplates(String generatorType) {List<String> templates = new ArrayList<>();switch (generatorType) {case "jpa":templates.add("template/jpa/Repository.java.vm");templates.add("template/jpa/Specifications.java.vm");templates.add("template/jpa/Service.java.vm");templates.add("template/jpa/Controller.java.vm");templates.add("template/jpa/Domain.java.vm");break;case "mybatis":templates.add("template/mybatis/Mapper.java.vm");templates.add("template/mybatis/Mapper.xml.vm");templates.add("template/mybatis/Service.java.vm");templates.add("template/mybatis/ServiceImpl.java.vm");templates.add("template/mybatis/Controller.java.vm");templates.add("template/mybatis/Entity.java.vm");templates.add("template/mybatis/EntityParam.java.vm");templates.add("template/mybatis/PageResult.java.vm");templates.add("template/mybatis/RestResp.java.vm");break;case "mybatis-plus":templates.add("template/mybatis-plus/Mapper.java.vm");templates.add("template/mybatis-plus/Mapper.xml.vm");templates.add("template/mybatis-plus/Service.java.vm");templates.add("template/mybatis-plus/ServiceImpl.java.vm");templates.add("template/mybatis-plus/Controller.java.vm");templates.add("template/mybatis-plus/Entity.java.vm");templates.add("template/mybatis-plus/EntityParam.java.vm");templates.add("template/mybatis-plus/PageResult.java.vm");templates.add("template/mybatis-plus/RestResp.java.vm");break;}return templates;}private static String getPackagePath(GeneratorParams generatorParams) {//配置信息Configuration config = getConfig();String packageName = StringUtils.isNotBlank(generatorParams.getPackageName())? generatorParams.getPackageName(): config.getString("package");String moduleName = StringUtils.isNotBlank(generatorParams.getModuleName())? generatorParams.getModuleName(): config.getString("moduleName");String packagePath = "main" + File.separator + "java" + File.separator;if (StringUtils.isNotBlank(packageName)) {packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator;}return packagePath;}private static VelocityContext getVelocityContext(GeneratorParams generatorParams, TableEntity tableEntity) {Configuration config = getConfig();Map<String, Object> map = new HashMap<>();map.put("generatorType", generatorParams.getGeneratorType());map.put("tableName", tableEntity.getTableName());map.put("comments", tableEntity.getComments());map.put("pk", tableEntity.getPk());map.put("className", tableEntity.getUpperClassName());map.put("classname", tableEntity.getLowerClassName());map.put("pathName", tableEntity.getLowerClassName().toLowerCase());map.put("columns", tableEntity.getColumns());map.put("mainPath", StringUtils.isBlank(config.getString("mainPath")) ? "com.dwp" : config.getString("mainPath"));map.put("package", StringUtils.isNotBlank(generatorParams.getPackageName()) ? generatorParams.getPackageName() : config.getString("package"));map.put("moduleName", StringUtils.isNotBlank(generatorParams.getModuleName()) ? generatorParams.getModuleName() : config.getString("moduleName"));map.put("author", StringUtils.isNotBlank(generatorParams.getAuthor()) ? generatorParams.getAuthor() : config.getString("author"));map.put("email", config.getString("email"));map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));VelocityContext context = new VelocityContext(map);return context;}private static void initVelocity() {Properties prop = new Properties();prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");Velocity.init(prop);}/*** 表、字段参数处理** @param generatorParams* @return*/private static TableEntity formatParams(GeneratorParams generatorParams) {TableEntity tableEntity = new TableEntity();//表信息setTableEntity(tableEntity, generatorParams);//设置列信息setColumns(tableEntity, generatorParams);//没主键,则第一个字段为主键if (tableEntity.getPk() == null) {tableEntity.setPk(tableEntity.getColumns().get(0));}return tableEntity;}private static void setColumns(TableEntity tableEntity, GeneratorParams generatorParams) {List<ColumnEntity> columnsList = new ArrayList<>();for (DatabaseColumn column : generatorParams.getColumns()) {ColumnEntity columnEntity = new ColumnEntity();columnEntity.setColumnName(column.getColumnName());//列名转换成Java属性名String attrName = columnToJava(column.getColumnName());columnEntity.setUpperAttrName(attrName);columnEntity.setLowerAttrName(StringUtils.uncapitalize(attrName));columnEntity.setComments(column.getColumnComment());//列的数据类型,转换成Java类型Configuration config = getConfig();String attrType = config.getString(column.getColumnType(), "unknowType");columnEntity.setAttrType(attrType);//是否主键if (column.isPrimary()) {tableEntity.setPk(columnEntity);}columnsList.add(columnEntity);}tableEntity.setColumns(columnsList);}private static void setTableEntity(TableEntity tableEntity, GeneratorParams generatorParams) {tableEntity.setTableName(generatorParams.getTableName());tableEntity.setComments(generatorParams.getTableComment());//表名转换成Java类名Configuration config = getConfig();String className = tableToJava(tableEntity.getTableName(), config.getString("tablePrefix"));tableEntity.setUpperClassName(className);tableEntity.setLowerClassName(StringUtils.uncapitalize(className));}/*** 列名转换成Java属性名*/private static String columnToJava(String columnName) {return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");}/*** 表名转换成Java类名*/private static String tableToJava(String tableName, String tablePrefix) {if (StringUtils.isNotBlank(tablePrefix)) {tableName = tableName.replaceFirst(tablePrefix, "");}return columnToJava(tableName);}/*** 获取配置信息*/private static Configuration getConfig() {try {return new PropertiesConfiguration("generator.properties");} catch (ConfigurationException e) {throw new RuntimeException("获取配置文件失败,", e);}}/*** 获取文件名*/private static String getFileName(String templateName, String className, GeneratorParams generatorParams) {String packagePath = getPackagePath(generatorParams);if (StringUtils.isNotBlank(templateName)) {String afterClassName = templateName.substring(templateName.lastIndexOf("/") + 1, templateName.indexOf("."));if (templateName.contains("template/jpa/Specifications.java.vm")) {return packagePath + "repository" + File.separator + className + "Specifications.java";}if (templateName.endsWith("Mapper.xml.vm")) {return packagePath + afterClassName.toLowerCase() + File.separator + className + afterClassName + ".xml";}if (templateName.contains("template/jpa/Domain.java.vm")|| templateName.endsWith("Entity.java.vm")) {return packagePath + afterClassName.toLowerCase() + File.separator + className + ".java";}if (templateName.endsWith("EntityParam.java.vm")) {return packagePath + "entity/param" + File.separator + className + "Param.java";}if (templateName.endsWith("ServiceImpl.java.vm")) {return packagePath + "service/impl" + File.separator + className + afterClassName + ".java";}if (templateName.endsWith("PageResult.java.vm")) {return packagePath + "util" + File.separator + "PageResult.java";}if (templateName.endsWith("RestResp.java.vm")) {return packagePath + "util" + File.separator + "RestResp.java";}return packagePath + afterClassName.toLowerCase() + File.separator + className + afterClassName + ".java";}return null;}
}

项目地址:
前端:https://github.com/dengweiping4j/code-generator-ui.git
后端:https://github.com/dengweiping4j/CodeGenerator.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/231191.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超详细的pytest玩转HTML报告:修改、汉化和优化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…

可逆图像去噪——InvDN模型推理测试

性能&#xff1a;InvDN的去噪性能优于多数现有的竞争模型&#xff0c;在SIDD数据集上实现了新的先进的结果&#xff0c;同时享受更少的运行时间。这表明该方法在处理真实噪声问题上具有很高的效率和准确性。 模型大小&#xff1a;此外&#xff0c;InvDN的大小远小于DANet&…

除了Whimsical,这4款在线协作软件也值得推荐!干货建议收藏。

Whimsical介绍 Whimsical是一款流行的在线协作工具&#xff0c;旨在帮助团队成员更好地进行头脑风暴、设计和规划工作。它提供了多种工具&#xff0c;包括流程图、线框图、思维导图和便签板&#xff0c;以满足团队在不同阶段的需求。Whimsical的界面简洁直观&#xff0c;易于使…

MySQL--主从复制

主从复制 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制&#xff0c;从库同时…

OpenCV | 图像梯度sobel算子、scharr算子、lapkacian算子

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 1、sobel算子 img cv2.imread(pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow(img,img) cv2.waitKey() cv2.destroyAllWindows() pie图片 dst cv2.S…

【VScode】代码文件注释,User snippets 配置 Python/C++ , 其他语言类似

在代码文件头部&#xff0c;输入 header &#xff0c;回车&#xff0c;自动生成文件注释 Python {"HEADER": {"prefix": "header","body": ["# -*- encoding: utf-8 -*-", "\"\"\"","Date …

HCIP---MPLS---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 MPLS协议使用标签交换来转发报文&#xff0c;最初是为了提高IP报文转发效率而设计的&#xff0c;但是后来随着硬件性能的提升&#xff0c;路由表已经不再是路由表/防火墙的转发瓶颈&#…

qt-C++笔记之主线程中使用异步逻辑来处理ROS事件循环和Qt事件循环解决相互阻塞的问题

qt-C笔记之主线程中使用异步逻辑来处理ROS事件循环和异步循环解决相互阻塞的问题 code review! 文章目录 qt-C笔记之主线程中使用异步逻辑来处理ROS事件循环和异步循环解决相互阻塞的问题1.Qt的app.exec()详解2.ros::spin()详解3.ros::AsyncSpinner详解4.主线程中结合使用的示…

荒野大镖客提示找不到emp.dll文件的5个修复方法-快速修复dll教程

今天我要和大家分享的是关于荒野大镖客缺失emp.dll的5个修复方法。我们都知道&#xff0c;荒野大镖客是一款非常受欢迎的游戏&#xff0c;但是有些玩家在玩游戏的过程中会遇到一些问题&#xff0c;比如emp.dll文件丢失。那么&#xff0c;emp.dll文件到底有什么作用呢&#xff1…

(二)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

IELTS学习笔记_grammar_新东方

参考&#xff1a; 新东方 田静 语法 目录&#xff1a; 导学简单句… x.1 导学 学语法以应用为主。 基础为&#xff1a;单词&#xff0c;语法 进阶为&#xff1a;听说读写译&#xff0c;只考听说读写。 words -> chunks -> sentences, chunks&#xff08;语块的重要…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之存储管理(1)》(14)

[TOC](《Linux操作系统原理分析之存储管理》&#xff08;14&#xff09; 5 存储管理5.1 存储管理的目的和功能5.1.1 存储管理目的&#xff1a;5.1.2 存储管理的主要功能5.1.3 存储管理主要是对用户区进行管理 5.2 地址重定位5.2.1 作业的地址空间5.2.2&#xff0e;地址映射&…