您的位置:首页 > 编程语言

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

2017-08-11 00:00 148 查看
摘要: 代码生成器

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

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

前言:

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

先按业务需要建立好数据库表

按数据库表分别实现它们相关的 Entity , Dao , Service, Controller , Dao层等,解决数据的基本操作,如增删查改等基本的数据操作。

......

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

那是肯定的。

预备知识:

freemacker模板引擎:http://www.sojson.com/tag_freemarker.html

一定Java语言基础

spring 框架

实现思路:

首先我们请来了强大的模板引擎: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代码生成器的简单实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息