文档章节

当小白遇到--代码生成器

z
 zxszxs
发布于 2017/08/11 18:32
字数 1059
阅读 105
收藏 3

这两天刚刚接触了一个叫代码生成器的东西,太神奇了,以后不用写代码了吗?

呵呵呵......程序员不写代码干什么?

前言:

大家都知道,在做业务开发的时候,通常的模式都是如下过程:

  1. 先按业务需要建立好数据库表
  2. 按数据库表分别实现它们相关的 Entity , Dao , Service, Controller , Dao层等,解决数据的基本操作,如增删查改等基本的数据操作。
  3. ......

然而第二部分这些细活往往比较简单且没有挑战性,纯粹苦力活。能不能有一个模板,直接一键生成上面的一些基本的操作呢?

那是肯定的。

预备知识:

 实现思路:

首先我们请来了强大的模板引擎:FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件配置文件源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

然后在其基础上按数据库表的结构建立它们相关的 Entity , Dao , Service, Controller , Dao层等的模板。

通过数据库表和模板生成相应的Entity , Dao , Service, Controller , Dao层等。

代码实例:

以数据库表:test表为例:

CREATE TABLE `test`(
  `id` varchar(64) NOT NULL COMMENT'ID',
  `content` text NOT NULL COMMENT'描述',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

将test表建立基础数据模板:test.yml

# 示例数据

author: "Cedar"
package: "com.zxs.application" #生成包名
domain: "test"
# 属性列表
fields:
    -
        description: "id"
        type: String
        java:
            name: id
            type: String
        db:
            name: id
            type: varchar
            length: 64
            notnull: true
        view:
            name: id
            input_type: text_area
        validator: {}
    -
        description: "描述"
        type: String # 业务类型, 还有 url,数字,ip地址,中国手机号码, 数据校验的第一项??
        java:
            name: content
            type: String
        db:
            name: content
            type: text
            notnull: true   # 是不是重复的?
        view:
            name: content # 可以用默认值
            input_type: simple_text       # input[text], input[email] ?? simple_text, email, url, select, radio
            search_type: simple_text_like       # 可以用默认, simple_text_like, simple_text_eq, simple_select, multiple_select
        validator:
            notblank: {}
    

基础代码模板:

  • Dao层:dao.template
package ${package}.dao;

import ${package}.Basedao;
import ${package}.entity.${domain?cap_first}Eentity;
@MybatisDao
public interface ${domain?cap_first}Dao extends BaseDao<${domain?cap_first}Eentity> {

}
  • Entity层:entity.template
package ${package}.entity;

/**
 * ${domain?cap_first}Entity
 */
public class ${domain?cap_first} {

<#list fields as field>
    private ${field.java.type} ${field.java.name};
</#list>

<#list fields as field>

    public ${field.java.type} get${field.java.name?cap_first}() {
        return this.${field.java.name};
    }

    public void set${field.java.name?cap_first}(${field.java.type} ${field.java.name}) {
        this.${field.java.name} = ${field.java.name};
    }
</#list>
}
  • Controller层:controller.template
package ${package}.web;

import ${package}.entity.${domain?cap_first}Eentity;
import ${package}.service.${domain?cap_first}Service;
import info.ideatower.infra.shared.query.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * ${domain?cap_first}
 */
@Controller
@RequestMapping("/${domain}")
public class ${domain?cap_first}Controller {

    @Autowired
    private ${domain?cap_first}Service ${domain}Service;

    /**
     * ${domain?cap_first}列表页
     * @param model
     * @return
     */
    @GetMapping(value = {"", "/list"})
    public String index(Model model) {
        Page page = this.${domain}Service.selectPage(Page.DEFAULT,null);
        model.addAttribute("page", page);
        return "/${domain}/list";
    }

    /**
     * ${domain?cap_first}创建页面
     * @return
     */
    @GetMapping("/create")
    public String create(Model model) {
        model.addAttribute(new ${domain?cap_first}());
        return "/${domain}/edit";
    }

    /**
     * ${domain?cap_first}创建操作
     * @param ${domain}
     * @return
     */
    @PostMapping("/create")
    public String createForm(${domain?cap_first}Eentity ${domain}Eentity) {
        this.${domain}Service.insert(${domain});
        return "redirect:/${domain}?repage";
    }

    /**
     * ${domain?cap_first}编辑页面
     * @param id ${domain?cap_first}标识
     * @param model
     * @return
     */
    @GetMapping("/{id}")
    public String edit(
            @PathVariable(value = "id", required = true) String id,
            Model model) {
        ${domain?cap_first}Eentity ${domain}Eentity = this.${domain}Service.selectById(id);
        model.addAttribute("${domain}", ${domain});
        return "/${domain}/edit";
    }

    /**
     * ${domain?cap_first}编辑
     * @param id ${domain?cap_first}标识
     * @param ${domain} ${domain?cap_first}数据
     * @return
     */
    @PostMapping("/{id}")
    public String editForm(
            @PathVariable(value = "id", required = true) String id,
            ${domain?cap_first}Eentity ${domain}Eentity) {
        this.${domain}Service.updateById(${domain});
        return "redirect:/${domain}?repage";
    }

    /**
     * ${domain?cap_first}删除
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public String remove(@PathVariable(value = "id", required = true) String id) {
        this.${domain}Service.deleteById(id);
        return "redirect:/${domain}?repage";
    }

}
  • service层:service.template
package ${package}.service;

import ${package}.dao.${domain?cap_first}Dao;
import ${package}.entity.${domain?cap_first}Eentity;
import ${package}.service.BaseService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional( readOnly = false)
public class ${domain?cap_first}Service extends BaseService<${domain?cap_first}Dao, ${domain?cap_first}Eentity> {

}

配置文件:base.yml


source:
     data: data
     template: template
dest: dest
encoding: UTF-8

# datasource
# path could specify both file path and directory path
#datasource:
#    type: "jdbc"
#    user: "simple.yml"
#    password: "xxx"
#    include: ['single', 'multiple']
#    exclude: [

# excel datasource
# datasource:
#    type: "excel"
#    map:
#        A: "erector"
#        B: "build"

datasource:
    type: "yaml"
    include: ["single_one"]

# for plenty
template:
    -
        file: entity
        to: "src/test/entity/${domain?cap_first}Entity.java"
    -
        file: controller
        to: "src/test/web/${domain?cap_first}Controller.java"
    -
        file: service
        to: "src/test/service/${domain?cap_first}Service.java"
    -
        file: dao.class
        to: "src/test/dao/${domain?cap_first}Dao.java"
    -
        file: mybatis.mapping.xml
        to: "src/test/mybatis/${domain?cap_first}Dao.xml"
#    -
#        file: single
#        type: all
#        to: demo.html

 

未完待续。。。。

相关大神博客:

【1】Freemarker官网 
【2】可用于企业级开发的JAVA代码生成器 
【3】 一个java代码生成器的简单实现

© 著作权归作者所有

共有 人打赏支持
z
粉丝 1
博文 30
码字总数 25291
作品 0
遵义
一个很简短的 JS 生成器入门和用法参考

生成器函数 在写其他 js 代码时会经常用到 的东西,能够让当前运行的函数暂停住。生成器函数里的 关键词也能使得函数暂停运行,同时还能用来做数据的输入输出(如果是 ,只能手动去逐个 insp...

laobubu
07/13
0
0
非Hibernate代码如何使用Hibernate的UUIDHexGenerator

手上有一个工程,是其他的公司开发的,使用的是Hibernate,数据库每个表的ID他都设定成了uuid生成器。 因为开发商的Hibernate写的相当糟糕,很多无意义的关联查询。现在想把这部分功能逐渐改...

逝水fox
2012/10/24
2.2K
2
Python生成器(Generator)详解

这篇文章主要介绍了Python生成器(Generator)详解,本文讲解了什么是生成器、简单生成器、带yield 语句的生成器、加强的生成器等内容,需要的朋友可以参考下 通过列表生成式,我们可以直接创建...

丰_申
2016/10/12
44
0
如何理解Python中的生成器

转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法。 generator [^4] [^7] [^9] 本质上来说,生成器(generator)就是一个...

_Pythonista
08/05
0
0
MyBatis 代码生成器--Mybatis-Generator

mybatis.generator 解决问题 mybatis.generator 后续简称 dalgen,解决mybatis代码自动生成的缺失. 对比其他代码生成工具 mybatis-generator-maven-plugin mybatis比较官方的代码生成器,生成...

匆匆里
2017/09/13
693
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
2
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
2
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
5
0
八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
今天
2
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部