文档章节

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

z
 zxszxs
发布于 2017/08/11 18:32
字数 1059
阅读 116
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
1
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部