• ruoyi后台管理系统分析(四)-----generator包


    四、generator包

    java包--domain包

    ColumnInfo.java------数据库表列信息
    package com.ruoyi.generator.domain;
    
    /**
     * ry数据库表列信息
     * 
     * @author ruoyi
     */
    public class ColumnInfo
    {
        /** 字段名称 */
        private String columnName;
    
        /** 字段类型 */
        private String dataType;
    
        /** 列描述 */
        private String columnComment;
    
        /** Java属性类型 */
        private String attrType;
    
        /** Java属性名称(第一个字母大写),如:user_name => UserName */
        private String attrName;
    
        /** Java属性名称(第一个字母小写),如:user_name => userName */
        private String attrname;
    
        public String getColumnName()
        {
            return columnName;
        }
    
        public void setColumnName(String columnName)
        {
            this.columnName = columnName;
        }
    
        public String getDataType()
        {
            return dataType;
        }
    
        public void setDataType(String dataType)
        {
            this.dataType = dataType;
        }
    
        public String getColumnComment()
        {
            return columnComment;
        }
    
        public void setColumnComment(String columnComment)
        {
            this.columnComment = columnComment;
        }
    
        public String getAttrName()
        {
            return attrName;
        }
    
        public void setAttrName(String attrName)
        {
            this.attrName = attrName;
        }
    
        public String getAttrname()
        {
            return attrname;
        }
    
        public void setAttrname(String attrname)
        {
            this.attrname = attrname;
        }
    
        public String getAttrType()
        {
            return attrType;
        }
    
        public void setAttrType(String attrType)
        {
            this.attrType = attrType;
        }
    }
    View Code
    TableInfo.java------数据库表
    package com.ruoyi.generator.domain;
    
    import java.util.List;
    import com.ruoyi.common.base.BaseEntity;
    import com.ruoyi.common.utils.StringUtils;
    
    /**
     * ry 数据库表
     * 
     * @author ruoyi
     */
    public class TableInfo extends BaseEntity
    {
        private static final long serialVersionUID = 1L;
    
        /** 表名称 */
        private String tableName;
    
        /** 表描述 */
        private String tableComment;
    
        /** 表的主键列信息 */
        private ColumnInfo primaryKey;
    
        /** 表的列名(不包含主键) */
        private List<ColumnInfo> columns;
    
        /** 类名(第一个字母大写) */
        private String className;
    
        /** 类名(第一个字母小写) */
        private String classname;
    
        public String getTableName()
        {
            return tableName;
        }
    
        public void setTableName(String tableName)
        {
            this.tableName = tableName;
        }
    
        public String getTableComment()
        {
            return tableComment;
        }
    
        public void setTableComment(String tableComment)
        {
            this.tableComment = tableComment;
        }
    
        public List<ColumnInfo> getColumns()
        {
            return columns;
        }
    
        public ColumnInfo getColumnsLast()
        {
            ColumnInfo columnInfo = null;
            if (StringUtils.isNotNull(columns) && columns.size() > 0)
            {
                columnInfo = columns.get(0);
            }
            return columnInfo;
        }
    
        public void setColumns(List<ColumnInfo> columns)
        {
            this.columns = columns;
        }
    
        public String getClassName()
        {
            return className;
        }
    
        public void setClassName(String className)
        {
            this.className = className;
        }
    
        public String getClassname()
        {
            return classname;
        }
    
        public void setClassname(String classname)
        {
            this.classname = classname;
        }
    
        public ColumnInfo getPrimaryKey()
        {
            return primaryKey;
        }
    
        public void setPrimaryKey(ColumnInfo primaryKey)
        {
            this.primaryKey = primaryKey;
        }
    }
    View Code
    --mapper包

    GenMapper.java-----代码生成 数据层
    package com.ruoyi.generator.mapper;
    
    import java.util.List;
    import com.ruoyi.generator.domain.ColumnInfo;
    import com.ruoyi.generator.domain.TableInfo;
    
    /**
     * 代码生成 数据层
     * 
     * @author ruoyi
     */
    public interface GenMapper
    {
        /**
         * 查询ry数据库表信息
         * 
         * @param tableInfo 表信息
         * @return 数据库表列表
         */
        public List<TableInfo> selectTableList(TableInfo tableInfo);
    
        /**
         * 根据表名称查询信息
         * 
         * @param tableName 表名称
         * @return 表信息
         */
        public TableInfo selectTableByName(String tableName);
    
        /**
         * 根据表名称查询列信息
         * 
         * @param tableName 表名称
         * @return 列信息
         */
        public List<ColumnInfo> selectTableColumnsByName(String tableName);
    }
    View Code

    --service包

    IGenService.java----代码生成 服务层
    package com.ruoyi.generator.service;
    
    import java.util.List;
    import com.ruoyi.generator.domain.TableInfo;
    
    /**
     * 代码生成 服务层
     * 
     * @author ruoyi
     */
    public interface IGenService
    {
        /**
         * 查询ry数据库表信息
         * 
         * @param tableInfo 表信息
         * @return 数据库表列表
         */
        public List<TableInfo> selectTableList(TableInfo tableInfo);
    
        /**
         * 生成代码
         * 
         * @param tableName 表名称
         * @return 数据
         */
        public byte[] generatorCode(String tableName);
    
        /**
         * 批量生成代码
         * 
         * @param tableNames 表数组
         * @return 数据
         */
        public byte[] generatorCode(String[] tableNames);
    }
    View Code

    ---------impl包

     GenServiceImpl.java----代码生成  服务层处理

    package com.ruoyi.generator.service.impl;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.StringWriter;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    import org.apache.commons.io.IOUtils;
    import org.apache.velocity.Template;
    import org.apache.velocity.VelocityContext;
    import org.apache.velocity.app.Velocity;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.ruoyi.common.config.Global;
    import com.ruoyi.common.constant.Constants;
    import com.ruoyi.common.utils.StringUtils;
    import com.ruoyi.generator.domain.ColumnInfo;
    import com.ruoyi.generator.domain.TableInfo;
    import com.ruoyi.generator.mapper.GenMapper;
    import com.ruoyi.generator.service.IGenService;
    import com.ruoyi.generator.util.GenUtils;
    import com.ruoyi.generator.util.VelocityInitializer;
    
    /**
     * 代码生成 服务层处理
     * 
     * @author ruoyi
     */
    @Service
    public class GenServiceImpl implements IGenService
    {
        private static final Logger log = LoggerFactory.getLogger(GenServiceImpl.class);
    
        @Autowired
        private GenMapper genMapper;
    
        /**
         * 查询ry数据库表信息
         * 
         * @param tableInfo 表信息
         * @return 数据库表列表
         */
        @Override
        public List<TableInfo> selectTableList(TableInfo tableInfo)
        {
            return genMapper.selectTableList(tableInfo);
        }
    
        /**
         * 生成代码
         * 
         * @param tableName 表名称
         * @return 数据
         */
        @Override
        public byte[] generatorCode(String tableName)
        {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ZipOutputStream zip = new ZipOutputStream(outputStream);
            // 查询表信息
            TableInfo table = genMapper.selectTableByName(tableName);
            // 查询列信息
            List<ColumnInfo> columns = genMapper.selectTableColumnsByName(tableName);
            // 生成代码
            generatorCode(table, columns, zip);
            IOUtils.closeQuietly(zip);
            return outputStream.toByteArray();
        }
    
        /**
         * 批量生成代码
         * 
         * @param tableNames 表数组
         * @return 数据
         */
        @Override
        public byte[] generatorCode(String[] tableNames)
        {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ZipOutputStream zip = new ZipOutputStream(outputStream);
            for (String tableName : tableNames)
            {
                // 查询表信息
                TableInfo table = genMapper.selectTableByName(tableName);
                // 查询列信息
                List<ColumnInfo> columns = genMapper.selectTableColumnsByName(tableName);
                // 生成代码
                generatorCode(table, columns, zip);
            }
            IOUtils.closeQuietly(zip);
            return outputStream.toByteArray();
        }
    
        /**
         * 生成代码
         */
        public void generatorCode(TableInfo table, List<ColumnInfo> columns, ZipOutputStream zip)
        {
            // 表名转换成Java属性名
            String className = GenUtils.tableToJava(table.getTableName());
            table.setClassName(className);
            table.setClassname(StringUtils.uncapitalize(className));
            // 列信息
            table.setColumns(GenUtils.transColums(columns));
            // 设置主键
            table.setPrimaryKey(table.getColumnsLast());
    
            VelocityInitializer.initVelocity();
    
            String packageName = Global.getPackageName();
            String moduleName = GenUtils.getModuleName(packageName);
    
            VelocityContext context = GenUtils.getVelocityContext(table);
    
            // 获取模板列表
            List<String> templates = GenUtils.getTemplates();
            for (String template : templates)
            {
                // 渲染模板
                StringWriter sw = new StringWriter();
                Template tpl = Velocity.getTemplate(template, Constants.UTF8);
                tpl.merge(context, sw);
                try
                {
                    // 添加到zip
                    zip.putNextEntry(new ZipEntry(GenUtils.getFileName(template, table, moduleName)));
                    IOUtils.write(sw.toString(), zip, Constants.UTF8);
                    IOUtils.closeQuietly(sw);
                    zip.closeEntry();
                }
                catch (IOException e)
                {
                    log.error("渲染模板失败,表名:" + table.getTableName(), e);
                }
            }
        }
    }
    View Code

    --util包

    GenUtils.java-----代码生成器 工具类
    package com.ruoyi.generator.util;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.apache.velocity.VelocityContext;
    import com.ruoyi.common.config.Global;
    import com.ruoyi.common.constant.Constants;
    import com.ruoyi.common.utils.DateUtils;
    import com.ruoyi.common.utils.StringUtils;
    import com.ruoyi.generator.domain.ColumnInfo;
    import com.ruoyi.generator.domain.TableInfo;
    
    /**
     * 代码生成器 工具类
     * 
     * @author ruoyi
     */
    public class GenUtils
    {
        /** 项目空间路径 */
        private static final String PROJECT_PATH = "main/java/com/ruoyi";
    
        /** mybatis空间路径 */
        private static final String MYBATIS_PATH = "main/resources/mybatis";
    
        /** html空间路径 */
        private static final String TEMPLATES_PATH = "main/resources/templates";
    
        /** 类型转换 */
        public static Map<String, String> javaTypeMap = new HashMap<String, String>();
    
        /**
         * 设置列信息
         */
        public static List<ColumnInfo> transColums(List<ColumnInfo> columns)
        {
            // 列信息
            List<ColumnInfo> columsList = new ArrayList<>();
            for (ColumnInfo column : columns)
            {
                // 列名转换成Java属性名
                String attrName = StringUtils.convertToCamelCase(column.getColumnName());
                column.setAttrName(attrName);
                column.setAttrname(StringUtils.uncapitalize(attrName));
    
                // 列的数据类型,转换成Java类型
                String attrType = javaTypeMap.get(column.getDataType());
                column.setAttrType(attrType);
    
                columsList.add(column);
            }
            return columsList;
        }
    
        /**
         * 获取模板信息
         * 
         * @return 模板列表
         */
        public static VelocityContext getVelocityContext(TableInfo table)
        {
            // java对象数据传递到模板文件vm
            VelocityContext velocityContext = new VelocityContext();
            String packageName = Global.getPackageName();
            velocityContext.put("tableName", table.getTableName());
            velocityContext.put("tableComment", replaceKeyword(table.getTableComment()));
            velocityContext.put("primaryKey", table.getPrimaryKey());
            velocityContext.put("className", table.getClassName());
            velocityContext.put("classname", table.getClassname());
            velocityContext.put("moduleName", GenUtils.getModuleName(packageName));
            velocityContext.put("columns", table.getColumns());
            velocityContext.put("package", packageName);
            velocityContext.put("author", Global.getAuthor());
            velocityContext.put("datetime", DateUtils.getDate());
            return velocityContext;
        }
    
        /**
         * 获取模板信息
         * 
         * @return 模板列表
         */
        public static List<String> getTemplates()
        {
            List<String> templates = new ArrayList<String>();
            templates.add("vm/java/domain.java.vm");
            templates.add("vm/java/Mapper.java.vm");
            templates.add("vm/java/Service.java.vm");
            templates.add("vm/java/ServiceImpl.java.vm");
            templates.add("vm/java/Controller.java.vm");
            templates.add("vm/xml/Mapper.xml.vm");
            templates.add("vm/html/list.html.vm");
            templates.add("vm/html/add.html.vm");
            templates.add("vm/html/edit.html.vm");
            templates.add("vm/sql/sql.vm");
            return templates;
        }
    
        /**
         * 表名转换成Java类名
         */
        public static String tableToJava(String tableName)
        {
            if (Constants.AUTO_REOMVE_PRE.equals(Global.getAutoRemovePre()))
            {
                tableName = tableName.substring(tableName.indexOf("_") + 1);
            }
            if (StringUtils.isNotEmpty(Global.getTablePrefix()))
            {
                tableName = tableName.replace(Global.getTablePrefix(), "");
            }
            return StringUtils.convertToCamelCase(tableName);
        }
    
        /**
         * 获取文件名
         */
        public static String getFileName(String template, TableInfo table, String moduleName)
        {
            // 小写类名
            String classname = table.getClassname();
            // 大写类名
            String className = table.getClassName();
            String javaPath = PROJECT_PATH + "/" + moduleName + "/";
            String mybatisPath = MYBATIS_PATH + "/" + moduleName + "/" + className;
            String htmlPath = TEMPLATES_PATH + "/" + moduleName + "/" + classname;
    
            if (template.contains("domain.java.vm"))
            {
                return javaPath + "domain" + "/" + className + ".java";
            }
    
            if (template.contains("Mapper.java.vm"))
            {
                return javaPath + "mapper" + "/" + className + "Mapper.java";
            }
    
            if (template.contains("Service.java.vm"))
            {
                return javaPath + "service" + "/" + "I" + className + "Service.java";
            }
    
            if (template.contains("ServiceImpl.java.vm"))
            {
                return javaPath + "service" + "/" + className + "ServiceImpl.java";
            }
    
            if (template.contains("Controller.java.vm"))
            {
                return javaPath + "controller" + "/" + className + "Controller.java";
            }
    
            if (template.contains("Mapper.xml.vm"))
            {
                return mybatisPath + "Mapper.xml";
            }
    
            if (template.contains("list.html.vm"))
            {
                return htmlPath + "/" + classname + ".html";
            }
            if (template.contains("add.html.vm"))
            {
                return htmlPath + "/" + "add.html";
            }
            if (template.contains("edit.html.vm"))
            {
                return htmlPath + "/" + "edit.html";
            }
            if (template.contains("sql.vm"))
            {
                return classname + "Menu.sql";
            }
            return null;
        }
    
        /**
         * 获取模块名
         * 
         * @param packageName 包名
         * @return 模块名
         */
        public static String getModuleName(String packageName)
        {
            int lastIndex = packageName.lastIndexOf(".");
            int nameLength = packageName.length();
            String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength);
            return moduleName;
        }
    
        public static String replaceKeyword(String keyword)
        {
            String keyName = keyword.replaceAll("(?:表|信息)", "");
            return keyName;
        }
    
        static
        {
            javaTypeMap.put("tinyint", "Integer");
            javaTypeMap.put("smallint", "Integer");
            javaTypeMap.put("mediumint", "Integer");
            javaTypeMap.put("int", "Integer");
            javaTypeMap.put("integer", "integer");
            javaTypeMap.put("bigint", "Long");
            javaTypeMap.put("float", "Float");
            javaTypeMap.put("double", "Double");
            javaTypeMap.put("decimal", "BigDecimal");
            javaTypeMap.put("bit", "Boolean");
            javaTypeMap.put("char", "String");
            javaTypeMap.put("varchar", "String");
            javaTypeMap.put("tinytext", "String");
            javaTypeMap.put("text", "String");
            javaTypeMap.put("mediumtext", "String");
            javaTypeMap.put("longtext", "String");
            javaTypeMap.put("time", "Date");
            javaTypeMap.put("date", "Date");
            javaTypeMap.put("datetime", "Date");
            javaTypeMap.put("timestamp", "Date");
        }
    
        public static void main(String[] args)
        {
            System.out.println(StringUtils.convertToCamelCase("user_name"));
            System.out.println(replaceKeyword("岗位信息表"));
            System.out.println(getModuleName("com.ruoyi.system"));
        }
    }
    View Code
    VelocityInitializer。java------VelocityEngine工厂
    package com.ruoyi.generator.util;
    
    import java.util.Properties;
    import org.apache.velocity.app.Velocity;
    import com.ruoyi.common.constant.Constants;
    
    /**
     * VelocityEngine工厂
     *
     * Velocity将java代码从web页面中分离出来
     *
     * @author RuoYi
     */
    public class VelocityInitializer
    {
        /**
         * 初始化vm方法
         */
        public static void initVelocity()
        {
            Properties p = new Properties();
            try
            {
                // 加载classpath目录下的vm文件
                p.setProperty("file.resource.loader.class",
                        "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
                // 定义字符集
                p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
                p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
                // 初始化Velocity引擎,指定配置Properties
                Velocity.init(p);
            }
            catch (Exception e)
            {
                throw new RuntimeException(e);
            }
        }
    }
    View Code

    resources包

    --mapper.generator包

    GenMapper.xml------mybatis中自动生成代码的配置

    --vm包------vm文件的存放

    (*.vm 后缀的文件,是velocity的文件。velocity是基于java的一种页面模板引擎,支持#if #else #foreach等写法的前台文件。)

  • 相关阅读:
    SQL 函数:Aggregate、Scalar函数介绍
    SQL 用于各种数据库的数据类型:MySQL、SQLsever
    SQL 通用数据类型解析
    SQL NULL 函数:使用方法及案例剖析
    SpringBoot的配置文件
    SpringBoot简介及快速入门
    本地仓库和远程仓库分支回退到指定的历史版本(idea)
    maven配置阿里云镜像仓库
    SSM三大框架整合-分模块版本
    Java程序调用Oracle存储过程和存储函数
  • 原文地址:https://www.cnblogs.com/zhzJAVA11/p/10000247.html
Copyright © 2020-2023  润新知