Java自动生成bean、dao、service、impl、controller(JPA初版)

2023-11-19

关自动生成代码我是这么想的:
初步:

目录

一、拿到所有表名、列名、列类型数据。

C3P0连接数据库并获取所需数据

所需数据对象

测试拿到的数据

结果

二、用FreeMarker模板生成对应JPA架构Java文件

编写模板

bean.ftl

bean_vo.ftl

repository.ftl

service.ftl

service_impl.ftl

controller.ftl

FreeMarker生成Java代码

测试

通用工具

参数配置文件

git地址:https://github.com/boorZ/auto


目录

 

一、拿到所有表名、列名、列类型数据。

C3P0连接数据库并获取所需数据

所需数据对象

测试拿到的数据

结果

二、用FreeMarker模板生成对应JPA架构Java文件

编写模板

          bean.ftl

          bean_vo.ftl

          repository.ftl

          service.ftl

          service_impl.ftl

          controller.ftl

FreeMarker生成Java代码

通用工具

参数配置文件

git地址:https://github.com/boorZ/auto


一、拿到所有表名、列名、列类型数据。

C3P0连接数据库并获取所需数据

package auto.c3p0;

import auto.BeanConfig;
import auto.bean.utils.BeanUtils;
import auto.c3p0.pojo.ColumnPOJO;
import auto.c3p0.pojo.TablePOJO;
import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/28
 * 版 本: v1.0
 **/
public class C3P0Utils {

    private static  ComboPooledDataSource cpds;
    private static Connection con;
    private static Statement sta;
    private static ResultSet rs;

    /**
     * 获取Connection
     * @return
     * @throws SQLException
     * @throws PropertyVetoException
     */
    public static Connection getconnection() throws SQLException, PropertyVetoException {
        cpds = new ComboPooledDataSource();
        cpds.setDriverClass("com.mysql.cj.jdbc.Driver");
        cpds.setJdbcUrl("jdbc:mysql:///"+BeanConfig.JPA_DATABASE+"?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
        cpds.setUser(BeanConfig.JPA_USER);
        cpds.setPassword(BeanConfig.JPA_PASSWORD);
        // 得到一个Connection
        con = cpds.getConnection();
        return con;
    }
    public static ResultSet getConnection(String sql) throws SQLException, PropertyVetoException {
        con = getconnection();
        sta = con.createStatement();
        rs = sta.executeQuery(sql);
        return rs;
    }
    public static void close() throws SQLException {
        rs.close();
        sta.close();
        con.close();
        cpds.close();
    }

    /**
     * 封装表名、列名、列类型
     * @return
     * @throws PropertyVetoException
     * @throws SQLException
     */
    public static List<TablePOJO> tableColumnType() throws PropertyVetoException, SQLException {
        List<TablePOJO> tableList = new ArrayList<>();
        ResultSet rs = getConnection("show tables");
        while (rs.next()) {
            // 表名
            Object tableName = rs.getObject(1);
            tableList.add(new TablePOJO(tableName, getColumn(tableName)));
        }
        rs.close();
        close();
        return tableList;
    }

    /**
     * 根据表名来返回该表对应列名和列类型
     * @param table
     * @return
     * @throws SQLException
     * @throws PropertyVetoException
     */
    public static List<ColumnPOJO> getColumn(Object table) throws SQLException, PropertyVetoException {
        List<ColumnPOJO> columnList = new ArrayList<>();
        ResultSet tableName = C3P0Utils.getConnection("select * from "+table);
        ResultSetMetaData rsmd = tableName.getMetaData();
        // 字段总数
        int columnCount = rsmd.getColumnCount();
        for (int i = 1; i <= columnCount; i++) {
            String humpConlumName = BeanUtils.toHump(rsmd.getColumnName(i), 1);
            columnList.add(new ColumnPOJO(rsmd.getColumnName(i), humpConlumName, rsmd.getColumnTypeName(i)));
        }
        return columnList;
    }
}

所需数据对象

package auto.c3p0.pojo;

import java.util.List;

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/28
 * 版 本: v1.0
 **/
public class TablePOJO {
    // 表名
    private Object tableName;
    // 列名集
    private List<ColumnPOJO> columnCountList;

    public Object getTableName() {
        return tableName;
    }

    public void setTableName(Object tableName) {
        this.tableName = tableName;
    }

    public List<ColumnPOJO> getColumnCountList() {
        return columnCountList;
    }

    public void setColumnCountList(List<ColumnPOJO> columnCountList) {
        this.columnCountList = columnCountList;
    }

    public TablePOJO() {
    }

    public TablePOJO(Object tableName, List<ColumnPOJO> columnCountList) {
        this.tableName = tableName;
        this.columnCountList = columnCountList;
    }

    @Override
    public String toString() {
        return "TablePOJO{" +
                "tableName=" + tableName +
                ", columnCountList=" + columnCountList +
                '}';
    }
}

package auto.c3p0.pojo;

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/28
 * 版 本: v1.0
 **/
public class ColumnPOJO {
    // 列名
    private Object conlumName;
    // 驼峰列名
    private Object humpConlumName;
    // 列类型
    private Object conlumTypeName;

    public Object getConlumName() {
        return conlumName;
    }

    public Object getHumpConlumName() {
        return humpConlumName;
    }

    public void setHumpConlumName(Object humpConlumName) {
        this.humpConlumName = humpConlumName;
    }

    public void setConlumName(Object conlumName) {
        this.conlumName = conlumName;
    }

    public Object getConlumTypeNameOriginal() {
        return conlumTypeName;
    }
    public Object getConlumTypeName() {
        switch (conlumTypeName.toString()) {
            case "INT":
                return "int";
            case "VARCHAR":
                return "String";
            default:
                return "";
        }
    }

    public void setConlumTypeName(Object conlumTypeName) {
        this.conlumTypeName = conlumTypeName;
    }

    public ColumnPOJO() {
    }

    public ColumnPOJO(Object conlumName, Object humpConlumName, Object conlumTypeName) {
        this.conlumName = conlumName;
        this.humpConlumName = humpConlumName;
        this.conlumTypeName = conlumTypeName;
    }

    public ColumnPOJO(Object conlumName, Object conlumTypeName) {
        this.conlumName = conlumName;
        this.conlumTypeName = conlumTypeName;
    }

    @Override
    public String toString() {
        return "ColumnPOJO{" +
                "conlumName=" + conlumName +
                ", humpConlumName=" + humpConlumName +
                ", conlumTypeName=" + conlumTypeName +
                '}';
    }
}

测试拿到的数据

@Test
    public void test01() throws PropertyVetoException, SQLException {
        List<TablePOJO> tablePOJOS = C3P0Utils.tableColumnType();
        tablePOJOS.forEach(table -> {
            System.out.println("=======================================");
            System.out.println("表名:"+table.getTableName());
            table.getColumnCountList().forEach(column -> {
                System.out.println("列名:"+column.getConlumName());
                System.out.println("列类型:"+column.getConlumTypeNameOriginal());
                System.out.println("转换列类型:"+column.getConlumTypeName());
                System.out.println("列驼峰:"+column.getHumpConlumName());
                System.out.println("-----------------------");
            });
        });
    }

结果


二、用FreeMarker模板生成对应JPA架构Java文件

编写模板

bean.ftl

<#if classPath??>
package ${classPath};
</#if>
${imports}

@Entity
@Table(name = "${className}")
public class ${fileName} extends BaseEntity{
<#--public class ${fileName} {-->

<#list newMember as m>
    @Column(name = "${m.conlumName}")
    private ${m.conlumTypeName} ${m.humpConlumName ? uncap_first};

</#list>
<#list newMember as m>
    public ${m.conlumTypeName} get${m.humpConlumName}() {
        return ${m.humpConlumName ? uncap_first};
    }

    public void set${m.humpConlumName}(${m.conlumTypeName} ${m.humpConlumName ? uncap_first}) {
        this.${m.humpConlumName ? uncap_first} = ${m.humpConlumName ? uncap_first};
    }

</#list>
    public ${fileName}() {
    }

    public ${fileName}(<#list newMember as m>${m.conlumTypeName} ${m.humpConlumName ? uncap_first}<#if m_has_next>,</#if></#list> ) {
        <#list newMember as m>
            this.${m.humpConlumName ? uncap_first} = ${m.humpConlumName ? uncap_first};
        </#list>
    }
}

bean_vo.ftl

<#if classPath??>
package ${classPath};
</#if>

${imports}

public class ${fileName} extends BaseEntity{
<#--public class ${fileName} {-->

<#list newMember as m>
    private ${m.conlumTypeName} ${m.humpConlumName ? uncap_first};
</#list>

<#list newMember as m>
    public ${m.conlumTypeName} get${m.humpConlumName}() {
        return ${m.humpConlumName ? uncap_first};
    }

    public void set${m.humpConlumName}(${m.conlumTypeName} ${m.humpConlumName ? uncap_first}) {
        this.${m.humpConlumName ? uncap_first} = ${m.humpConlumName ? uncap_first};
    }

</#list>
    public ${fileName}() {
    }

    public ${fileName}(<#list newMember as m>${m.conlumTypeName} ${m.humpConlumName ? uncap_first}<#if m_has_next>,</#if></#list> ) {
        <#list newMember as m>
            this.${m.humpConlumName ? uncap_first} = ${m.humpConlumName ? uncap_first};
        </#list>
    }
}

repository.ftl

<#if classPath??>
package ${classPath};
</#if>

${imports}

public interface ${fileName} extends CommonRepository<${T}, Integer>{

}

service.ftl

<#if classPath??>
package ${classPath};
</#if>
${imports}

public interface ${fileName} extends SimpCommonService<${T}, Integer>{

}

service_impl.ftl

<#if classPath??>
package ${classPath};
</#if>

${imports}

@Service
public class ${fileName} implements ${Service} {
    @Autowired
    private ${Repository} ${Repository ? uncap_first};

    @Override
    public CommonRepository<${T}, Integer> getCommonRepository() {
        return this.${Repository ? uncap_first};
    }

}

controller.ftl

<#if classPath??>
package ${classPath};
</#if>

${imports}

@RestController
@RequestMapping(value = "/")
public class ${fileName} {
    @Autowired
    private ${Service} ${Service ? lower_case};

}

FreeMarker生成Java代码

package auto.freemarker.templates.ftlutils;

import auto.BeanConfig;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.*;
import java.util.Map;

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/28
 * 版 本: v1.0
 **/
public class FreemarkerUtils {

    public static void base(Map<String, Object> dataMap, String ftlName, String dir, String newFileName) {
        // step1 创建freeMarker配置实例
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
        Writer out = null;
        try {
            // step2 获取模版路径
            configuration.setDirectoryForTemplateLoading(new File(BeanConfig.JPA_TEMPLATE_PATH));
            // step3 创建数据模型
            // step4 加载模版文件
            Template template = configuration.getTemplate(ftlName);
            // step5 生成数据
            File newDir=new File(BeanConfig.JPA_CLASS_PATH + dir);
            File newFile = new File(newDir,newFileName);
            if (!newDir.exists()) {
                newDir.mkdirs();
                newFile.createNewFile();
            }
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile)));
            // step6 输出文件
            template.process(dataMap, out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != out) {
                    out.flush();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}
package auto.freemarker;

import auto.BeanConfig;
import auto.bean.utils.BeanUtils;
import auto.c3p0.C3P0Utils;
import auto.c3p0.pojo.ColumnPOJO;
import auto.c3p0.pojo.TablePOJO;
import auto.freemarker.templates.ftlutils.FreemarkerUtils;

import java.beans.PropertyVetoException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/29
 * 版 本: v1.0
 **/
public class JpaUtils {
    /**
     *
     * @param ftlName
     * @param beanConfig
     * @param javaPostfix
     * @param fileName
     * @throws PropertyVetoException
     * @throws SQLException
     */
    public static void jpaBase(String ftlName, String beanConfig, String javaPostfix, String fileName) throws PropertyVetoException, SQLException {

        List<TablePOJO> tableList = C3P0Utils.tableColumnType();
        for (TablePOJO table : tableList) {
            String hump = BeanUtils.toHump((String) table.getTableName(), 1);
            String java = hump + javaPostfix;

            Map<String, Object> map = new HashMap<>();

            String classPath = BeanConfig.JPA_CLASS_PATH;
            if (classPath.contains("src/main/java")) {
                classPath = classPath.split("src/main/java/")[1].replace("/", ".");
                classPath += fileName;
            } else {
                classPath = null;
            }
            map.put("classPath", classPath);
            map.put("imports", beanConfig);
            map.put("className", table.getTableName());
            map.put("fileName", java);
            map.put("newMember", filtration(table.getColumnCountList()));
            map.put("T", hump + "Entity");
            map.put("Service", hump + "Service");
            map.put("Repository", hump + "Repository");
            map.put("mapping", javaPostfix);
            FreemarkerUtils.base(map, ftlName, fileName, java+".java");
        }
    }

    /** 过滤 **/
    private static List<ColumnPOJO> filtration(List<ColumnPOJO> columnPOJOList) {
        List<ColumnPOJO> columnCountList = new ArrayList<>();
        for (ColumnPOJO columnPOJO : columnPOJOList) {
            if (!BeanConfig.JPA_NEGLECT_FIELDS.contains((CharSequence) columnPOJO.getConlumName())) {
                columnCountList.add(columnPOJO);
            }
        }
        return columnCountList;
    }
}

测试

public class AutoMain {
    public static void main(String[] args) throws PropertyVetoException, SQLException, IOException {
        JpaUtils.jpaBase("bean.ftl", BeanConfig.JPA_IMPORTS_BEAN, "Entity", "bean");
        JpaUtils.jpaBase("bean_vo.ftl", BeanConfig.JPA_IMPORTS_BEAN_VO, "VO", "vo");
        JpaUtils.jpaBase("repository.ftl", BeanConfig.JPA_IMPORTS_REPOSITORY, "Repository", "repository");
        JpaUtils.jpaBase("service.ftl", BeanConfig.JPA_IMPORTS_SERVICE, "Service", "service");
        JpaUtils.jpaBase("service_impl.ftl", BeanConfig.JPA_IMPORTS_SERVICE_IMPL, "ServiceImpl", "service//impl");
        JpaUtils.jpaBase("controller.ftl", BeanConfig.JPA_IMPORTS_CONTROLLER, "Controller", "controller");
    }
}

通用工具

import java.io.IOException;

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/29
 * 版 本: v1.0
 **/
public class BeanUtils {
    /**
     * 转成驼峰命名规则
     * yOrn: 1(首字母大写)
     * yOrn: 0(首字母不大写)
     */
    public static String toHump(String s, Integer yOrn){
        s = s.toLowerCase();
        String[] split = s.split("_");
        String ss = "";
        for (int i = 0; i < split.length; i++) {
            String s0 = "";
            if (i == 0) {
                if (yOrn == 0) {
                    s0 = split[i].substring(0, 1);
                } else if (yOrn == 1) {
                    s0 = split[i].substring(0, 1).toUpperCase();
                }
            } else {
                s0 = split[i].substring(0, 1).toUpperCase();
            }
            ss += s0 + split[i].substring(1);
        }
        return ss;
    }

    public static void openFileDirectory(String url) throws IOException {
        if (url != null && !"".equals(url)) {
            String[] cmd = new String[5];
            cmd[0] = "cmd";
            cmd[1] = "/c";
            cmd[2] = "start";
            cmd[3] = " ";
            cmd[4] = url;
            Runtime.getRuntime().exec(cmd);
        }
    }
}

参数配置文件

/**
 * 描 述: 请描述功能
 * 作 者: ZhouLin
 * 日 期: 创建时间: 2019/4/29
 * 版 本: v1.0
 **/
public class BeanConfig {
    /** 数据库用户 **/
    public static String JPA_USER = "root";
    /** 数据库密码 **/
    public static String JPA_PASSWORD = "123456";
    /** 数据库 **/
    public static String JPA_DATABASE = "zl";
    /** 忽略字段 **/
    public static String JPA_NEGLECT_FIELDS = "id";
    /** ftl模板所在目录 **/
    public static String JPA_TEMPLATE_PATH = "src/main/java/auto/freemarker/templates/jpa/";
    /** 生成文件路径 **/
    public static String JPA_CLASS_PATH = "C:\\Users\\Administrator\\Desktop\\autoCode\\";

    /** 不同文件导入的包 **/
    public static String JPA_IMPORTS_BEAN = "import common.model.BaseEntity;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;";
    public static String JPA_IMPORTS_BEAN_VO = "import common.model.BaseEntity;";
    public static String JPA_IMPORTS_REPOSITORY = "import common.repository.CommonRepository;\nimport org.springframework.data.repository.NoRepositoryBean;";
    public static String JPA_IMPORTS_SERVICE = "import common.service.SimpCommonService;";
    public static String JPA_IMPORTS_SERVICE_IMPL = "import common.repository.CommonRepository;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;";
    public static String JPA_IMPORTS_CONTROLLER = "import org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;";
}

git地址:https://github.com/boorZ/auto

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java自动生成bean、dao、service、impl、controller(JPA初版) 的相关文章

随机推荐

  • 如何批量Ping 1000个IP地址,一个小技巧节约N小时?

    一 批量ping网段 对于一个网段ip地址众多 如果单个检测实在麻烦 那么我们可以直接批量ping网段检测 那个ip地址出了问题 一目了然 先看代码 直接在命令行窗口输入 for L D in 1 1 255 do ping 10 168
  • 定义类数组

    编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toString 方法显示所有属性 3 在测试类中定义学生数组 长度为4 分别给数组每个元素赋值 然后循环调用
  • Vue自定义插件的编写

    如何实现一个vue的自定义插件 div div
  • windows 如何查询主板sn(主板ID)

    wmic bios get serialnumber
  • dell服务器维护软件,Dell服务器硬件,RAID等查询和维护软件OMSA_推荐

    Dell服务器硬件 RAID等查询和维护软件OMSA 推荐 原创 chenshengang2014 01 17 19 07 03 著作权 阅读数 441 著作权归作者所有 来自51CTO博客作者chenshengang的原创作品 如需转载
  • Java 读取resources下的资源文件

    Web项目中应该经常有这样的需求 在maven项目的resources目录下放一些文件 比如一些配置文件 资源文件等 文件的读取方式有好几种方式 本文会对常用的读取方式做一个总结 并说明一下应该注意的地方 准备工作 新建一个spring t
  • 无向图染色问题-dfs剪枝

    无向图染色问题 问题描述 给定一个无向图 要求用最少的颜色将节点染色 限制是不能让相邻节点染上相同的颜色 算法 使用dfs 为节点分配不同的颜色进行尝试 计算每种分配所需的颜色数 最终进行回溯 取得最小的颜色数 代码 C include
  • OpenAI最新发布通用人工智能路线图!AGI比想象中来得更快!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉 微信技术交流群 转载自 机器之心 编辑 泽南 小舟 通用人工智能的出现可能只是技术发展历程中的一个小节点 因为 AGI 或许可以加速自身的进
  • 点云/网格模型的体积计算

    点云体积计算 有时用激光扫描设备扫描零件或者用无人机进行测量后会想知道它们的体积 比如下面的土堆 如果扫描得到的数据是一系列三维点云 那么体积就比较难求 因为如何定义物体的边界比较困难 一种方法是提取三维点云的凸壳 包络体 然后再进行计算
  • 第五章 数据清洗

    5 1数据去重 5 1 1完全去重 点击 获取字段 配置csv文件输入的属性 Name Gender City 配置唯一行属性 选择要去重的属性 Name Gender City 运行结果 完全去重成功 5 1 2不完全去重 将文本分隔符替
  • 支付宝短视频平台创作分成激励项目

    没想到支付宝也开通了中视频计划 这波羊毛算是蒿定了 最近啊 马爸爸火速上线了支付宝创作分成计划 明显就是抄的抖音中视频计划 目前还在内测阶段 补贴的力度非常大 错过的话就只能拍大腿了 看到短视频这么的火爆 巨头大佬们都想分一杯羹啊 阿里也不
  • Linux下MySQL启动、停止、重启的几种方式

    一 启动 1 使用service 启动 service mysqld start 2 使用 mysqld 脚本启动 etc inint d mysqld start 3 使用 safe mysqld 启动 safe mysqld 二 停止
  • 互联网产品上线流程,及面试题分类

    一 基础情况 问题1 自我介绍 3mins 与自我介绍 1min 问题2 为什么你要来这个行业 问题3 为什么你要来这个岗位 问题4 为什么你能胜任这份工作 问题5 为什么你要离职 问题6 过往经历STAR故事描述 问题7 你的职业规划是什
  • php mes代码,完整MES代码(含客户端和server端)

    实例简介 完整的代码 带数据库文件 包含客户端 服务端 实例截图 核心代码 MES 源代码 MES 源代码 MES 源代码 dll AjaxControlToolkit dll AspNetServer dll AxInterop CELL
  • el-form 校验单个字段

    单个校验 核心为 validateField 而非validate
  • 关于编译器生成默认构造函数的理解

    构造函数 构造函数是创建类类型对象时 由编译器自动调用 用来初始化对象的函数 它保证每个数据成员都有一个合适的初始值 并且在对象的生命周期内只调用一次 函数名与类名相同 无返回值 构造函数可以重载 什么是默认构造函数 无参的构造函数 全缺省
  • JAVA中的while do-while循环以及for循环的深刻理解 入门 小白必看

    循环 循环 循环 循环的作用 提出问题为什么需要循环 解决问题循环的出现 while 前序 循环 while循环的语法与流程以及细节 do while 后序循环 do while循环的语法和流程 while和do while 之间的区别 f
  • 人工智能顶会顶刊以及SCI,IF,核心,分区

    人工智能顶会顶刊以及SCI IF 核心 分区 标签 常识 刚上研究生的时候 老师总会让大家看论文 并且还要求要看好文章 要看顶会或者顶刊上面的文章 但是刚开始就不知道什么是顶会或者顶刊 所以这里整理了一下在人工智能方面的顶刊或者顶会 比如c
  • HacksudoAliens

    HacksudoAliens arp scan interface eth0 192 168 1 0 24 nmap sC sV p sT 192 168 1 251 sS sT sA sW sM TCP SYN Connect ACK W
  • Java自动生成bean、dao、service、impl、controller(JPA初版)

    关自动生成代码我是这么想的 初步 目录 一 拿到所有表名 列名 列类型数据 C3P0连接数据库并获取所需数据 所需数据对象 测试拿到的数据 结果 二 用FreeMarker模板生成对应JPA架构Java文件 编写模板 bean ftl be