编写一个代码生成器

上次我说想自己做个解析Java代码模板的东西,不过实际测试过程中,做的效果不太理想,看了一下MybatisPlus的代码生成器源码,发现了ibeetl,velocity,等模板引擎,都大概学习了一下。最终打算使用velocity来做代码生成。

在这里插入图片描述
我把它安装到了maven大概效果算是实现了,不过因为前期没有分析,导致后面写的不太好,代码就不放出来了,实在写的不怎么样。这里只展示一下制作过程中遇到的问题

velocity简单使用

依赖

<dependency>    
	<artifactId>velocity</artifactId>    
	<groupId>org.apache.velocity</groupId>    
	<version>1.7</version>
</dependency>

模板文件

#foreach($name in $list)  ##循环
<h1>$name</h1>## $取值
#end
#if($name)   ##类似js  python的判断
    $name
#end
#include("src/main/resources/template/Test.vm") ##可以包含多个直接包含不解析
#parse("src/main/resources/template/Test.vm")  ##一次只包含一个递归解析
#set($ok='OKKK')  ##定义变量
$ok
#macro(test $ok)##定义宏 第一个名字 后面  参数
    $ok
#end
#test('asdsadasd')##使用宏
#if($aaa)
    OKKKK
#else  ##也有 elseif
    NNNNNNNNNN
#end
是德国VS的

执行代码

// 初始化模板引擎
VelocityEngine ve = new VelocityEngine();
// 配置引擎上下文对象  并设置变量
VelocityContext ctx = new VelocityContext();
ctx.put("list","sdgfsdgf,rgtrh,sdfsdgerg,sdgesgfdf,gdgdrgdth,dfgdf".split(","));
ctx.put("name","东方化工地方韩国");
// 加载模板文件  并指定编码  必须指定编码否则中文乱码
Template template = ve.getTemplate("src/main/resources/template/User.vm","utf-8");
StringWriter sw = new StringWriter();
// 渲染模板  到输出流
template.merge(ctx, sw);
System.out.print(sw.toString());

解决打包后vm模板文件找不到的问题

velocityEngine.setProperty("resource.loader", "class");
velocityEngine.setProperty("class.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
//推荐使用类资源加载器  开发或打成jar包都没有问题
velocityEngine.init();//设置并应用 类资源加载器

获取数据库元数据主键等信息

//  获取连接信息  新版本无需再Class.forName("");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zzu","root", "123456");
DatabaseMetaData metaData = connection.getMetaData();//获取连接元数据
//                                             都填数据库名   表
ResultSet resultSet = metaData.getPrimaryKeys("zzu", "zzu", "cher");
//                                       都填数据库名   表      列 指定为null都会统配
ResultSet columns = metaData.getColumns("zzu", "zzu", "cher", null);

在Velocity绑定常用的函数方便使用

编写类继承Directive

public class MyTest extends Directive {//必须继承 Directive类
    @Override//返回该函数的调用名称
    public String getName() {
        return "aaaa";
    }
    //  BLOCK  LINE   返回是作用行代码块还是   块代码  (里面是否可以包裹普通内容对象)
    @Override
    public int getType() {
        return LINE;
    }
    @Override
    public boolean render(InternalContextAdapter context, Writer writer, Node node)
            throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException {
        Object name = context.get("name");//获取全局对象信息
        writer.write("HelloWorld");//用于向页面输出内容
        Object value = node.jjtGetChild(0).value(context);//获取对应输入参数等信息
        return true;//返回是否渲染成功
    }
}

配置

VelocityEngine ve = new VelocityEngine();
//加载整个配置文件
//ve.init("E:\\IDEA\\MyNewTest3\\src\\main\\resources\\velocity.properties");
ve.loadDirective("velocty.extend.MyTest");//加载一个  写的是全类名

配置文件(可以写多个使用,分割多个)

userdirective=velocty.extend.MyTest

使用
在这里插入图片描述

首字母大小写问题

public String upperCaseFrist(String name){
	char[] chars = name.toCharArray();
	//chars[0]^=' ';//大小写互转	chars[0]|=' ';//全部变为小写	chars[0]&='_';//全部转换为大写
	chars[0]&='_';
	return new String(chars);
}

这个项目写的比较失败,不过还是记录一下,方便给其他有该想法的人一些建议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值