如果你厌烦了增删改查,可以试试他

认证侠
• 阅读 1762
预期:一次配置,远离增删改查

在系统开发过程中,每次写新模块都要一股脑建表、前后台的增删改查,花费了大量时间做重复工作。因此有了这个工具,主要实现:

  • 生成CRUD前后台代码,放到项目中可正常运行
  • 可适用于多种项目框架

一些想法

为实现目标功能,我这样设计这个工具。首先,需要一个表和字段的管理。然后用模板文件来呈现源码文件功能。最后我们根据配置好的元数据渲染模板文件产生源文件放到工程中就可以运行了。基于上面的思路,我画了一个简单的图:
如果你厌烦了增删改查,可以试试他

这样,一个项目配置一次后,就不用重复写增删改查通用功能了,而且适用于所有框架的项目工程。


示例

环境:jdk1.8。

  • 下载依赖jackson-databind-2.9.8.jar,jackson-core-2.9.8.jar,mysql-connector-java-8.0.19.jar,freemarker-2.3.30.jar。
  • 工具打包。如果你下载了源码,可以通过mvn package打包。也可以github上下载已经打好的包。generator-core-1.0.0.jar
  • 在工程中引入上面的包,开始写测试用例。

目前项目内置了JDBC解析器和JSON文件解析器帮助我们解析表和字段的配置,也可以自己定义。模板渲染引擎使用freemarker,后面会支持更多的模板引擎。通常第一次使用的时候我们要做以下几步:

1. 选择解析器和渲染器

如果你熟悉关系数据库,就选择JDBC解析器,也可以用json文件配置;如果你熟悉freemarker的模板语法,就使用freemarker的渲染器,也可使用其他模板引擎Thymeleaf、Velocity,一切可根据你喜欢而定。

2. 配置模板

模板的配置没有固定的方式,根据你的工程结构而定的。模板可以是任意字符文件格式,如:html,jsp,java。通常一个工程写一次模板,如果多个工程的框架一样可多次使用。

3. 配置表和字段

表的配置目前提供三种方式数据库,json,或者自己内置。之后会提供可视化界面。

4.代码示例

最后代码看起来像这样的,测试数据可以在github中找到。

    Renderer renderer = new FreeMarkerRenderer();
    String templatePath = "project template path";
    String sourcePath = "source code path";
    
    /**
     * json + freemarker
    */
    @Test
    public void testFromFileToFreeMarker() {
        MetaResolve resolve = new JsonFileResolve("gen.txt");
        CRUDGenerator generator = new CRUDGenerator(templatePath, sourcePath, resolve, renderer);
        generator.generate();
    }
    
    /**
     * jdbc + freemarker
     */
    @Test
    public void testFromDBToFreeMarker() {
        String url = "jdbc:mysql://xxxx:3306/xxxx?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
        String username = "username";
        String password = "password";
        MetaResolve resolve = new JdbcResolve(url, username, password, "com.mysql.cj.jdbc.Driver");

        CRUDGenerator generator = new CRUDGenerator(templatePath, sourcePath, resolve, renderer);
        generator.generate();
    }
    
    /**
     * 自定义解析 + freemarker
     */
    @Test
    public void testCustomResole() {
        MetaResolve resolve = new MetaResolve() {
            @Override
            public MetaContext resolveMeta() {
                MetaContext context = new MetaContext();
                context.setTables(new ArrayList<>());
                context.setNamingRules(Constants.RULES_LOWERCASE);
                MetaTable table = new MetaTable();
                table.setName("user");
                context.getTables().add(table);

                table.setColumns(new ArrayList<>());
                MetaColumn column = new MetaColumn();
                column.setName("username");
                column.setType("varchar");
                column.setLength(100);
                table.getColumns().add(column);

                MetaColumn column1 = new MetaColumn();
                column1.setName("password");
                column1.setType("varchar");
                column1.setLength(100);
                table.getColumns().add(column1);
                return context;
            }

            @Override
            public LinkedHashMap<String, String> resolveTypeMap() {
                LinkedHashMap<String, String> dbTypeMap = new LinkedHashMap<>();
                dbTypeMap.put("varchar", "String");
                dbTypeMap.put("int", "Integer");
                dbTypeMap.put("tinyint", "Boolean");
                return dbTypeMap;
            }
        };

        CRUDGenerator generator = new CRUDGenerator(templatePath, sourcePath, resolve, renderer);
        generator.generate();
    }

写在后面

初次接入后,我们的主要工作是在配置表和字段,就可以完成从前端到后端的添加、删除、修改、查询,甚至更多的通用功能。花5分钟就能完成一个模块基本的功能。源代码已上传github点击链接查看,在git上有具体的使用样例, gen.txt是json配置样例,sql.sql是数据库配置的脚本。不足之处,欢迎大佬指点,希望它可以做得更好。
GitHub地址:
https://github.com/BlueSkyT/generator

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
Mysql之数据操作
数据的增删改查:增:insertinto表名values();删:物理删除:deletefrom表名where条件;逻辑删除;改:update表名set列1值1,列2值2...where条件;查:全查:select\from数据表名;指定条件查:select\fr
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这