mybatis plus代码生成工具的实现代码

前言:

原本想使用AutoGenerator 是 MyBatis-Plus 的官方代码生成器 ,尝试了一下,竟然报错,原因可能是MyBatis-Plus和mybatis-plus-generator 的版本不一致,因为我用的MyBatis-Plus 的版本是3.42 ,但是mybatis-plus-generator的3.4.2不知道怎么了,下载不下来,只能下载3.4.1,发现运行起来老是报错,还有一堆配置说明要看,于是自己手写生成代码的工具类,觉得更简单些。分享给大家,请多多指教。

pom文件引入java-mysql 驱动依赖

 <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

单类代码实现,复制粘贴到编辑器里,主方法运行即可。

import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * mybatis plus通用生成工具
 * 可生成业务接口、mapper接口、实体类
 *
 * @author tarzan Liu
 * @date 2021/4/10 19:44
 */

public class MyBatisPlusTools {
    private static final String driver = "com.mysql.cj.jdbc.Driver";//驱动
    private static final String user = "root";  //数据库账号
    private static final String pwd = "123456"; //数据库密码
    private static final String url = "jdbc:mysql://127.0.0.1:3306/ofcms" + "?user=" + user + "&password=" + pwd+"&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"; //链接参数
    private static String tableName = "of_cms_ad"; // 数据库表名
    private static String aliasName = "cms_ad"; // 数据库别名,可以与数据库表名相同
    private static final String packagePath = "com/tarzan/cms"; //mapper.xml命名空间路径
    private static final String packageName = "com.tarzan.cms"; //mapper.xml命名空间路径
    private static final String author = "tarzan"; // 作者
    private static final String rootPathName = "src/main/java/"; // 默认生成主文件夹路径
    private static Connection getConnection = null;
    static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    /**
     * 链接数据库
     */
    private static Connection getConnections() {
        try {
            Class.forName(driver);
            getConnection = DriverManager.getConnection(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return getConnection;
    }

    /**
     * 格式化默认值
     */
    private static String defaultValue(String value) {
        if (StringUtils.isNotBlank(value)) {
            return ";默认值:" + value;
        }
        {
            return "";
        }
    }

    private  static String getAliasName(String tableName,String prefix){
        return tableName.substring(prefix.length());
    }

    /**
     * 格式化数据类型
     * 返回的是基本类型的包装类
     * 如果使用基本数据类型long
     */
    private static String formatType(String typeValue) {

        if ("bit".equalsIgnoreCase(typeValue)) {
            return "Boolean";
        }
        else if (
                typeValue.equalsIgnoreCase("int") || typeValue.equalsIgnoreCase("int unsigned")
                        || typeValue.equalsIgnoreCase("tinyint") || typeValue.equalsIgnoreCase("tinyint unsigned")
                        || typeValue.equalsIgnoreCase("smallint") || typeValue.equalsIgnoreCase("smallint unsigned")
                        || typeValue.equalsIgnoreCase("mediumint") || typeValue.equalsIgnoreCase("mediumint unsigned")
                ) {
            return "Integer";
        } else if (typeValue.equalsIgnoreCase("bigint") || typeValue.equalsIgnoreCase("bigint unsigned")) {
            return "Long";
        } else if (typeValue.equalsIgnoreCase("float") || typeValue.equalsIgnoreCase("float unsigned")) {
            return "Float";
        } else if (typeValue.equalsIgnoreCase("decimal") || typeValue.equalsIgnoreCase("decimal unsigned") || typeValue.equalsIgnoreCase("numeric") || typeValue.equalsIgnoreCase("numeric unsigned")
                || typeValue.equalsIgnoreCase("real") || typeValue.equalsIgnoreCase("real unsigned") || typeValue.equalsIgnoreCase("money") || typeValue.equalsIgnoreCase("money unsigned")
                || typeValue.equalsIgnoreCase("smallmoney") || typeValue.equalsIgnoreCase("smallmoney unsigned")) {
            return "Double";
        } else if (typeValue.equalsIgnoreCase("varchar") || typeValue.equalsIgnoreCase("char")
                || typeValue.equalsIgnoreCase("nvarchar") || typeValue.equalsIgnoreCase("nchar")
                || typeValue.equalsIgnoreCase("text")) {
            return "String";
        } else if (typeValue.equalsIgnoreCase("datetime")) {
            return "Date";
        } else if (typeValue.equalsIgnoreCase("image")) {
            return "Blod";
        } else {
            return "Long";
        }

    }

    /**
     * 驼峰转换
     */
    private static String columnToProperty(String column) {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (column == null || column.isEmpty()) {
            // 没必要转换
            return "";}
        else column =column.toLowerCase();

         if (!column.contains("_")) {
            // 不含下划线,仅将首字母小写
            return column.substring(0, 1).toLowerCase() + column.substring(1);
        } else {
            // 用下划线将原始字符串分割
            String[] columns = column.split("_");
            for (String columnSplit : columns) {
                // 跳过原始字符串中开头、结尾的下换线或双重下划线
                if (columnSplit.isEmpty()) {
                    continue;
                }
                // 处理真正的驼峰片段
                if (result.length() == 0) {
                    // 第一个驼峰片段,全部字母都小写
                    result.append(columnSplit.toLowerCase());
                } else {
                    // 其他的驼峰片段,首字母大写
                    result.append(columnSplit.substring(0, 1).toUpperCase()).append(columnSplit.substring(1).toLowerCase());
                }
            }
            return result.toString();
        }
    }

    /**
     * 实体名称转换
     */
    private static String formatBeanName(String column) {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (column == null || column.isEmpty()) {
            // 没必要转换
            return "";
        } else if (!column.contains("_")) {
            // 不含下划线,仅将首字母大写
            return column.substring(0, 1).toUpperCase() + column.substring(1);
        } else {
            // 用下划线将原始字符串分割
            String[] columns = column.split("_");
            for (String columnSplit : columns) {
                // 跳过原始字符串中开头、结尾的下换线或双重下划线
                if (columnSplit.isEmpty()) {
                    continue;
                }
                // 处理真正的驼峰片段
                result.append(columnSplit.substring(0, 1).toUpperCase()).append(columnSplit.substring(1).toLowerCase());
            }
            return result.toString();
        }
    }

    /**
     * 实体类字段
     */
    private static void getBean(String tableName,String aliasName) {
        getConnection = getConnections();
        StringBuilder sb = new StringBuilder();
        try {
            DatabaseMetaData dbmd = getConnection.getMetaData();
            ResultSet rs = dbmd.getColumns(null, "%", tableName, "%");
            String beanName = formatBeanName(aliasName);
            sb.append("package "+packageName+".entity;\n\n");
            sb.append("import com.baomidou.mybatisplus.annotation.TableName;\n");
            sb.append("import lombok.Data;\n");
            int length=sb.length();
            boolean dateFlag=false;
            sb.append(  " /**\n" +
	                    "  * @author " + author + "\n" +
	                    "  * @date "+ format.format(new Date())+"\n" +
	                    "  */\n" +
                        "@Data\n" +
                        "@TableName(\""+tableName+"\")\n" +
	                    "public class "+beanName+"Entity {\n");
            while (rs.next()) {
                if(formatType(rs.getString("TYPE_NAME")).equals("Date")){
                    dateFlag=true;
                }
                sb.append("\t//").append(rs.getString("REMARKS")).append(defaultValue(rs.getString("COLUMN_DEF"))).append("\n");
                sb.append("\tprivate ").append(formatType(rs.getString("TYPE_NAME"))).append(" ").append(columnToProperty(rs.getString("COLUMN_NAME"))).append(";\n");
            }
            sb.append("} ");
            if(dateFlag){
                sb.insert(length, "import java.util.Date;\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        write(sb.toString(),"Entity.java","entity");
        System.err.println("\n类型:JAVA数据层实体类(bean.java)" + "\n状态:成功" + "\n时间:" + format.format(new Date()) + "\n");
    }

    /**
     * 生成DAO层接口
     */
    private static void getMapper(String tableName,String aliasName) {
        StringBuilder sb = new StringBuilder();
        try {
            String beanName = formatBeanName(aliasName);
            sb.append("package "+packageName+".mapper;\n\n");
            sb.append("import com.baomidou.mybatisplus.core.mapper.BaseMapper;\n");
            sb.append("import "+packageName+".entity."+beanName+"Entity;\n");
            sb.append(  "/**\n" +
	                    " * @author " + author + "\n" +
	                    " * @date "+ format.format(new Date())+"\n" +
	                    " */\n" +
	                    "public interface "+beanName+"Mapper extends BaseMapper<"+beanName+"Entity>{\n" +
	                    " \n" +
	            		"}");
        } catch (Exception e) {
            e.printStackTrace();
        }
        write(sb.toString(),"Mapper.java","mapper");
        System.err.println("\n类型:JAVA数据持久层接口(dao.java)" + "\n状态:成功" + "\n时间:" + format.format(new Date()) + "\n");
    }

    /**
     * 生成SERVICE层接口
     */
    private static void getService(String tableName,String aliasName) {
        StringBuilder sb = new StringBuilder();
        try {
            String beanName = formatBeanName(aliasName);
            sb.append("package "+packageName+".service;\n\n");
            sb.append("import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n");
            sb.append("import org.springframework.stereotype.Service;\n");
            sb.append("import "+packageName+".mapper."+beanName+"Mapper;\n");
            sb.append("import "+packageName+".entity."+beanName+"Entity;\n");
            sb.append(  "/**\n" +
	                    " * @author " + author + "\n" +
	                    " * @date "+ format.format(new Date())+"\n" +
	                    " */\n" +
                        "@Service\n" +
	                    "public class "+beanName+"Service extends ServiceImpl<"+beanName+"Mapper, "+beanName+"Entity>{\n" +
	                    "\n" +
	            		"}");
        } catch (Exception e) {
            e.printStackTrace();
        }
        write(sb.toString(),"Service.java","service");
        System.err.println("\n类型:JAVA业务层接口(service.java)" + "\n状态:成功" + "\n时间:" + format.format(new Date()) + "\n");

    }

    /**
     * 写文件,支持中文字符,在linux redhad下测试过
     * @param str 文本内容
     * @param name 文本名称
     * */
    private static void write(String str, String name,String type) {
        try {
            File dir = new File(rootPathName +packagePath+ "/" + type);
            dir.mkdirs();
            String path = dir.getPath() + "/" + formatBeanName(aliasName)+name;
            File file = new File(path);
            if (!file.exists())
                file.createNewFile();

            FileOutputStream out = new FileOutputStream(file, false); //如果追加方式用true
            StringBuilder sb = new StringBuilder();
            sb.append(str + "\n");
            out.write(sb.toString().getBytes("utf-8"));//注意需要转换对应的字符集
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //一次生产所有表
    private static void tableNames() {
        getConnection = getConnections();
        try {
            DatabaseMetaData dbmd = getConnection.getMetaData();
            ResultSet rs = dbmd.getTables(getConnection.getCatalog(), null, null, new String[] { "TABLE" });
            while (rs.next()) {
                tableName=rs.getString("TABLE_NAME");
                aliasName=getAliasName(tableName,"of_");
                //实体
                	getBean(tableName,aliasName);
                //dao层接口
                	getMapper(tableName,aliasName);
                //业务类接口
                	getService(tableName,aliasName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
    //  tableNames();
        //实体
    	getBean(tableName,aliasName);
    	//mapper接口
    	getMapper(tableName,aliasName);
        //业务类接口
    	getService(tableName,aliasName);
    }

}

生成文件截图

实体

mapper

service

到此这篇关于mybatis plus代码生成工具的实现代码的文章就介绍到这了,更多相关mybatis plus代码生成工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatisPlus3.x中使用代码生成器(全注释)

    场景 MyBaitsPlus3.x与2.x是不一样的.这里使用3.0.1版本. 官方文档 https://mp.baomidou.com/guide/generator.html 这里在IDEA上的SpringBoot项目中进行代码生成测试. 实现 添加依赖 添加 代码生成器 依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artif

  • SpringBoot+MybatisPlus+代码生成器整合示例

    项目目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

  • 基于Mybatis plus 自动代码生成器的实现代码

    1.使用的是maven项目,添加依赖 <!-- mybatis-plus begin --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.2.0</version> </dependency> 还有数据库的连接 <dependency> <

  • mybatis plus代码生成器配置过程解析

    这篇文章主要介绍了mybatis plus代码生成器配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近在玩项目,发现自己写严重浪费时间~于是想到了代码生成器,之前用过一次的mybatis-plus,再重新实现了一下 确保修改好对应的配置即可 依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boo

  • mybatis plus代码生成工具的实现代码

    前言: 原本想使用AutoGenerator 是 MyBatis-Plus 的官方代码生成器 ,尝试了一下,竟然报错,原因可能是MyBatis-Plus和mybatis-plus-generator 的版本不一致,因为我用的MyBatis-Plus 的版本是3.42 ,但是mybatis-plus-generator的3.4.2不知道怎么了,下载不下来,只能下载3.4.1,发现运行起来老是报错,还有一堆配置说明要看,于是自己手写生成代码的工具类,觉得更简单些.分享给大家,请多多指教. pom文件

  • Java 8 开发的 Mybatis 注解代码生成工具

    MybatisAnnotationTools MybatisAnnotationTools 是基于 Java8 开发的一款可以用于自动化生成 MyBatis 注解类的工具,支持配置数据源.类路径,表名去前缀.指定类名前后缀等功能.同时支持 Java 8 和 Mybatis 3.5+ 的一些新特性,比如时间类 LocalDateTime/LocalDate .接口方法返回 Optional 等. 此工具生成的代码是基于注解的 Mybatis 接口方法,所以不会生成 XML 配置文件. 源码地址:G

  • MyBatis官方代码生成工具给力(解放双手)

    摘要 在我们使用MyBatis的过程中,如果所有实体类和单表CRUD代码都需要手写,那将会是一件相当麻烦的事情.MyBatis官方代码生成器MyBatis Generator可以帮助我们解决这个问题,在我的开源项目mall中也是使用的这个代码生成器,用习惯了也挺不错的.本文将介绍MyBatis Generator的使用方法及使用技巧,希望对大家有所帮助! 简介 MyBatis Generator(简称MBG)是MyBatis官方提供的代码生成工具.可以通过数据库表直接生成实体类.单表CRUD代码

  • Java MyBatis可视化代码生成工具使用教程

    现公司架构大佬在项目中使用了 mybatis-generator-gui ,这是一款开源图形化 MyBatis 代码生成工具,使用起来相当的方便好用!推荐给在开发道路上的小伙伴们: GutHub 地址:https://github.com/zouzg/mybatis-generator-gui 使用 Git 克隆到本地,然后可直接导入开发工具 Eclipse 或者 IDEA 中使用: 这里以 Eclipse 为例,(IDEA同理). 1.工具代码结构,如下图所示: 2.打开 src/main/j

  • Asp.Net权限管理系统 专用代码生成工具(DDBuildTools) 1.1.0 下载

    DDBuildTools 1.1.0 是supesoft.com为Asp.Net权限管理系统开发的一套代码生成工具.其主要功能: 1.根据数据库表结构生成数据库表结构文档 2.根据数据库表结构生成符合 Asp.Net权限管理系统 的数据库操作代码(支持Access和MsSql2000/2005) 表结构需有标识字段 3.根据数据库表结构生成MsSql2000/2005的表增加/删除/修改 存储过程 4.根据数据库表结构生成符合 Asp.Net权限管理系统 的前台表数据的新增/修改/删除/列表/查

  • Thinkphp自定义代码生成工具及用法说明(附下载地址)

    本文实例讲述了Thinkphp自定义代码生成工具及用法说明.分享给大家供大家参考,具体如下: 我最近沮丧的发现在使用Thinkphp很多时候我都在做重复的事情,比如重复写最简单的CRUD方法,编写表单,写前台样式表等等. Thinkphp对于后台操作的支持已经非常强大,再加上最近非常流行的Bootstrap框架让前台样式也变得容易遵循一个标准,于是我决定开始写一个属于自己的代码生成器. 我希望它操作足够简单,让人一看就懂,对MySql和Sqlite数据库都能够稳定生成CRUD代码就好,还如果还能

  • Go 代码生成工具详解

    分享两个常用的代码生成工具: gormgen handlergen gormgen 基于 MySQL 数据表结构进行生成 3 个文件: 生成表的 struct 结构体 生成表的 Markdown 文档 生成表的 CURD 方法 场景 在进行业务需求开发时,创建完数据表后,执行代码生成工具,常用的 CURD 操作全部生成完毕,使用的时候只需要 . 后面的方法即可,这样大大提高了业务开发效率. 示例 表结构: CREATE TABLE `user_demo` (   `id` int(11) uns

  • python使用pyqt写带界面工具的示例代码

    上篇介绍的使用python自带tkinter包,来写带界面的工具. 此篇介绍使用pyqt来开发测试工具. tkinter的好处是python官方自带,上手容易(但手写控件复杂),布局和摆放都不直观和容易,因为是像素坐标定位,需要花较长时间在界面开发上.pyqt是第三方gui开发工具,是目前公认的python上最好的客户端界面开发工具,因为控件是通过qt设计师的手动拖拽,调整颜色 字体 大小等样式也很简单,不需要去代码层面来写大量界面代码,真正的所见即所得. 学习pyqt需要安装这些文件,pyqt

  • Android常用正则表达式验证工具类(实例代码)

    东西不多,但一般项目够用了. public class RegularUtil { //身份证 public static final String REGEX_ID_CARD = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$"; //验证邮箱 public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\

  • springmvc+mybatis 做分页sql 语句实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <?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="s

随机推荐