当小白遇到--代码生成器
博客专区 > zxszxs 的博客 > 博客详情
当小白遇到--代码生成器
zxszxs 发表于4个月前
当小白遇到--代码生成器
  • 发表于 4个月前
  • 阅读 33
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 代码生成器

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

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

前言:

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

  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代码生成器的简单实现

共有 人打赏支持
粉丝 2
博文 12
码字总数 5149
×
zxszxs
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: