必威体育Betway必威体育官网
当前位置:首页 > IT技术

代码生成器(1)

时间:2019-08-15 20:43:15来源:IT技术作者:seo实验室小编阅读:73次「手机版」
 

代码生成器

在上一讲中,我们是运用MyBATis插件进行代码生成,本次我们来自己写一个代码生成器


主要任务:自写代码生成器


上一讲中,我们介绍了一下Mybatis的优点,可以自动生成代码,但是缺点是不能自定义命名,比如各种命名没法改,比如不能生成controller、service、jsp等,本讲将开始解决此问题。

在这里插入图片描述

如何写代码生成器?

模板引擎velocity

使用说明:https://www.ibm.com/developerworks/cn/java/j-lo-velocity1/

Velocity-1.7.jar : 模板引擎 commons的2个jar包 :是模板引擎依赖了人家的类;

guava-27.1-jre.jar :是对字段名的转换,比如good_name字段,在java类的属性叫goodName,当setGoodName时又变成首字母都大写:GoodName,这个jar可以 方便转换

代码生成器的原理

  1. 编写一个模板,比如要生成XXXService.java,service里面所有代码讲模块部分全部用占位符/变量名代替。比如MenuService改成${modelClass}Service;
  2. 使用模板引擎,向模板中传递需要的占位符数据,比如${modelClass},这次要生成Menu,就传Menu,下次要建good,就传Good,就可以生成出来不同的模块,但代码只写了模板里面的这一遍;
  3. 通过模板引擎,将替换好的占位符的模板输出为具体的MenuService.java、MenuController.java甚至是menu.jsp。

开发过程

  1. 引入jar包;

    在这里插入图片描述

  2. 新建类com.lf.code.Codebuilder,要有main方法,需要单独运行生成代码文件。不走Spring框架

  3. 编写模板引擎调用代码。

完整代码如下:

package com.lf.code;

import java.io.printwriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.Velocitycontext;
import org.apache.velocity.APP.Velocity;
import org.apache.velocity.app.VelocityEngine;

public class CodeBuilder {

	public static void main(String[] args) {
		//new一下他的模版引擎
		VelocityEngine ve = new VelocityEngine();
		//设置模版和输出的代码文件的编码方式
		Properties p = new Properties();
		p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
		p.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
		p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
		ve.init(p);//引擎初始化
		
		//引入一个模版,通过模版路径
		Template serviceVm = ve.getTemplate("/Webcontent/WEB-INF/vm/service.vm");
		
		//定义占位符变量,给个值
		String modelClass = "Menu";
		String modelName = "menu";
		//生成的代码放置的目录==项目目录
		String rootPath = "E:/EClass/shop/"; 
		
		//变量放到上下文对象里
		VelocityContext ctx = new VelocityContext();
		ctx.put("modelClass", modelClass);
		ctx.put("modelName", modelName);
				
		//将占位符数据和模版合并,输出代码文件
		CodeBuilder.merge(serviceVm, ctx, rootPath +"src/com/lf/service/" + modelClass +"Service.java");
		
		//service实现类的
		Template serviceImplVm = ve.getTemplate("/WebContent/WEB-INF/vm/serviceImpl.vm");
		CodeBuilder.merge(serviceImplVm, ctx, rootPath +"src/com/lf/service/" + modelClass +"ServiceImpl.java");
		
		//dao的
		Template daoVm = ve.getTemplate("/WebContent/WEB-INF/vm/dao.vm");
		CodeBuilder.merge(daoVm, ctx, rootPath +"src/com/lf/dao/" + modelClass +"Dao.java");
		
		System.out.println("成功");
	}
	
	private static void merge(Template template,VelocityContext ctx,String path){
		PrintWriter writer = null;
		try{
			writer = new PrintWriter(path);
			//合并数据和模版,输出文件
			template.merge(ctx, writer);
			writer.flush();
		}catch(Exception e){
			e.printstacktrace();
		}finally{
			writer.close();
		}
	}
}


  1. 在WEB-INF下建立vm
  • 在vm下建立service.vm
package com.lf.service;

import java.util.List;
import com.github.pagehelper.PageInfo;
import com.lf.model.${modelClass};

public interface ${modelClass}Service {
	/**
	 * 带有分页的列表查询
	 * @param pageNum
	 * @param pageSize
	 * @param ${modelClass}
	 * @return
	 */
	public PageInfo<${modelClass}> list(integer pageNum,Integer pageSize,${modelClass} ${modelName});
	
	/**
	 * 没有分页的列表查询
	 * @param pageNum
	 * @param pageSize
	 * @param ${modelClass}
	 * @return
	 */
	public List<${modelClass}> list(${modelClass} ${modelName});
	public void create(${modelClass} ${modelName});
	public void update(${modelClass} ${modelName});
	public void delete(Integer id);
	public ${modelClass} findById(Integer id);
}

  • 在vm下建立serviceImpl.vm
package com.lf.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lf.dao.${modelClass}Dao;
import com.lf.model.${modelClass};

@Service
public class ${modelClass}ServiceImpl implements ${modelClass}Service {
	
	@Autowired
	private ${modelClass}Dao ${modelName}Dao;

	@Override
	public PageInfo<${modelClass}> list(Integer pageNum,Integer pageSize,${modelClass} ${modelName}) {
		PageHelper.startPage(pageNum, pageSize);
		List<${modelClass}> list =  ${modelName}Dao.list(${modelName});
		PageInfo<${modelClass}> pageInfo = new PageInfo<${modelClass}>(list);
		
		return pageInfo;
	}
	
	@Override
	public List<${modelClass}> list(${modelClass} ${modelName}) {
		List<${modelClass}> list =  ${modelName}Dao.list(${modelName});
		return list;
	}

	@Override
	public void create(${modelClass} ${modelName}) {
		if(${modelName}.getId()!=null && ${modelName}.getId()!=0){
			${modelName}Dao.update(${modelName});
		}else{
			${modelName}Dao.create(${modelName});
		}
	}

	@Override
	public void update(${modelClass} ${modelName}) {
		${modelName}Dao.update(${modelName});
	}

	@Override
	public void delete(Integer id) {
		${modelName}Dao.delete(id);
	}

	@Override
	public ${modelClass} findById(Integer id) {
		return ${modelName}Dao.findById(id);
	}
}

  • 在vm下建立dao.vm
package com.lf.dao;

import java.util.List;
import com.github.pagehelper.PageInfo;
import com.lf.model.${modelClass};

public interface ${modelClass}Dao {
	/**
	 * 没有分页的列表查询
	 * @param pageNum
	 * @param pageSize
	 * @param ${modelClass}
	 * @return
	 */
	public List<${modelClass}> list(${modelClass} ${modelName});
	public void create(${modelClass} ${modelName});
	public void update(${modelClass} ${modelName});
	public void delete(Integer id);
	public ${modelClass} findById(Integer id);
}

以上是大概完成了45%的自动生成代码,完成上述部分Run As——Java Application即可看到自动生成的代码并且在console中会打印‘成功’

在这里插入图片描述

相关阅读

旺旺代码生成器

淘宝网店客服,是网店生存的必备工具之一,但是很多新手店家来seo实验室论坛留言,说不知道这个旺旺怎么装修,代码怎么生成,其实找个步骤

代码生成器

笔者由于觉得很多东西都用工具可以做到很便利 公司由于换成Springboot和用Springdata JPA开发 所以本人觉得什么都要手写效率不高

请问一下现在好多淘宝装修代码生成器

请问这些软件是如何做出来的,真的好想自己做一个,因为自己有比较全的代码,但每次都要手动潜换商品图片,真的比较累哇。

WMI代码生成器怎么使用 WMI Code Creator使用详细图文

WMI是一种轻松获取系统信息的强大工具。利用它但是由于缺少WMI的介绍资料和学习资料(特别是中文的,因为国内大部分程序员的E文水平

分享到:

栏目导航

推荐阅读

热门阅读