(转)freemakeer初入门

在web开发过程中,尤其是后台管理系统的开发中,少不了增删改成的基础操作,原来我自己的做法是一份一份的拷贝粘贴,然后修改其中的不同,然而这样既枯燥无味又浪费了大量的时间,所以根据自己项目结构的特点写了一个自动生成结构代码的工具jar包,可以根据数据库表直接生成相应数据库模型对象(DMO)以及对表的增删改查代码。

之前我考虑过多种自动生成代码的提供方式,比如web的方式,通过在页面文本框里面输入各种参数,比如模板文件地址,生成文件地址,数据库名,数据库用户名和密码等,点击生成按钮就可以生成源代码文件。但这样需要部署启动这个web程序。使用java的图形用户界面,但我对java图形的相关API并不了解,最后决定使用一个jar包的方式,方便简洁。

由于模板文件使用的是freemarker,数据库使用的是mysql,所以引入其他的两个jar文件。

如上图,AutoGenerationJavaCode.jar 是将原本工程里的 AutoGenerationJavaCode.java文件打包生成的,也是最终的形式。通过在AutoGenerationDemo类main函数中设置参数,直接调用即可自动生成代码。

配置好参数后在左图右键运行java程序即可生成右图代码文件:

     

调用如下:

 1 public class AutoGenerationDemo {
 2
 3     public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException, TemplateException {
 4         //数据库地址
 5         String url = "jdbc:mysql://10.27.209.137:3306/sample";
 6         //用户名
 7         String name = "root";
 8         //密码
 9         String passWord = "root";
10         //驱动
11         String driver = "com.mysql.jdbc.Driver";
12         //表名
13         String tableName = "t_operate_log";
14         //模板路径
15         String templateDir = "F:\\template";
16         //生成文件路径
17         String autoGeneratedFile = "F:\\autoGenerated";
18         //实例化
19         AutoGenerationJavaCode autoGenerationJavaCode = new AutoGenerationJavaCode(url, name, passWord, driver,
20                 tableName,autoGeneratedFile,templateDir);
21
22         //调用生成java代码方法
23         autoGenerationJavaCode.autoGenerationJavaCode();
24     }
25
26 }

在main方法中配置好所需参数,由于代码包含注释,不在赘述,调用jar包中 AutoGenerationJavaCode的autoGenerationJavaCode方法即可生成,控制台会打印文件生产完成

我的Web项目的结构采用的是三层结构,Controller层调用service层,从service层调用dao层(数据操作层),所以决定自己生成service层,dao层代码。其实质就是将模板文件中的变量进行替换。模板文件及对应生成的java代码如下:

                                    

          

    

jar包的源代码如下:

package com.sun.autoGenerated;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class AutoGenerationJavaCode {

    private String url;
    private String name;
    private String passWord;
    private String driver;
    private String sql;
    private String tableName;
    private String templateDir;
    private String autoGeneratedFile;
    private static String[][] fileNameArray = new String[5][2];

    static {
        fileNameArray[0][0] = "dmoTemplate.ftl";
        fileNameArray[0][1] = "DMO.java";

        fileNameArray[1][0] = "serviceTemplate.ftl";
        fileNameArray[1][1] = "Service.java";

        fileNameArray[2][0] = "serviceImplTemplate.ftl";
        fileNameArray[2][1] = "ServiceImpl.java";

        fileNameArray[3][0] = "daoTemplate.ftl";
        fileNameArray[3][1] = "Dao.java";

        fileNameArray[4][0] = "daoImplTemplate.ftl";
        fileNameArray[4][1] = "DaoImpl.java";
    }

    public AutoGenerationJavaCode(String url, String name, String passWord, String driver, String tableName,
           String autoGeneratedFile,String templateDir) {
        this.url = url;
        this.name = name;
        this.passWord = passWord;
        this.driver = driver;
        this.sql = "select * from " + tableName;
        this.tableName = tableName;
        this.templateDir = templateDir;
        this.autoGeneratedFile = autoGeneratedFile;
    }

    public void autoGenerationJavaCode() throws IOException, TemplateException, ClassNotFoundException,
            SQLException {
        Configuration cfg = new Configuration();
        cfg.setDefaultEncoding("utf-8");

        String className = dealTableName();

        String fileName = dealClassName(className);
        Map<String, Object> columnMap = getColumn();
        //设置模板文件路径
        cfg.setDirectoryForTemplateLoading(new File(templateDir));

        Map<String, Object> rootMap = new HashMap<String, Object>();
        rootMap.put("className", className);
        rootMap.put("columnMap", columnMap);
        File dir = new File(autoGeneratedFile + "\\");
        //检查目录是否存在,不存在则创建
        if (!dir.exists()) {
            dir.mkdir();
        }
        for (int i = 0; i < fileNameArray.length; i++) {

            Template temp = cfg.getTemplate(fileNameArray[i][0]);

            File docFile = new File(autoGeneratedFile + "\\" + fileName + fileNameArray[i][1]);

            Writer docout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
            //输出文件
            temp.process(rootMap, docout);
        }
        System.out.println("==============文件生产成功===============");

    }

    //获取数据库表字段名放入map中
    public Map<String, Object> getColumn() throws ClassNotFoundException, SQLException {
        Connection conn;
        PreparedStatement pStemt = null;
        Class.forName(driver);
        conn = DriverManager.getConnection(url, name, passWord);
        pStemt = conn.prepareStatement(sql);
        ResultSetMetaData rsmd = pStemt.getMetaData();

        Map<String, Object> columnMap = new HashMap<String, Object>();
        int size = rsmd.getColumnCount();
        for (int i = 0; i < size; i++) {
            String columnName = dealColumnName(rsmd, i);
            columnMap.put(columnName, columnName);
        }
        conn.close();
        return columnMap;
    }

    //将表名转换为DMO的字段名,比如 operate_type 转换后为 operateType
    private String dealColumnName(ResultSetMetaData rsmd, int i) throws SQLException {
        String columnName = rsmd.getColumnName(i + 1).toLowerCase();
        String charAfterLine = String.valueOf(columnName.charAt((columnName.indexOf("_") + 1)));
        String convertedChar = charAfterLine.toUpperCase();
        columnName = columnName.replace("_" + charAfterLine, convertedChar);
        return columnName;
    }

     //将表名转换为类型类名 比如 t_operate_log 转换后为 operateLog ,类名首字母应为大写,这里在freemarker的模板里直接转换
    private String dealTableName() {
        String className = tableName.toLowerCase().substring(tableName.indexOf("_") + 1);
        String charAfterLine = String.valueOf(className.charAt((className.indexOf("_") + 1)));
        String convertedChar = charAfterLine.toUpperCase();
        className = className.replace("_" + charAfterLine, convertedChar);
        return className;
    }

    //将类名转换为文件名,java公共类名与其文件名应该相同,这里将首字母转换为大写 如operateLog 转换后为 OperateLog
    private String dealClassName(String className) {
        String first = className.substring(0, 1).toUpperCase();
        String rest = className.substring(1, className.length());
        String fileName = new StringBuffer(first).append(rest).toString();
        return fileName;
    }

}

源码下载:http://files.cnblogs.com/files/jarman/sourceCode.zip

时间: 2024-10-12 08:11:13

(转)freemakeer初入门的相关文章

JSON初入门

JSON:Javascript Object Notation 轻量级的数据交换格式 语法规则:(js对象表示语法的子集) 1.数据在名称/值对中 2.数据由逗号分隔 3.花括号{}保存对象 4.中括号[]保存对象 JSON名称/值 数据书写格式:名称/值 包括字段名称(双引号""),中间:隔开 "firstName":"John"     易理解,相当于js中  firstName="John" JSON值 数字(整数/浮点

mybatis初入门

昨天刚接触mybatis,感觉吧. 对于我这个菜鸟来说,能学什么就是什么,完全没有感觉... 还是说说mybatis吧. mybatis的配置xml,实体类,dao. configuration.xml <?xml version="1.0" encoding="UTF-8" ?>      <!DOCTYPE configuration          PUBLIC "-//mybatis.org//DTD Config 3.0//E

【C#Windows 服务】 《一》初入门

[C#Windows 服务] <一>初入门 一.工具: VS2015+NET Framework4.5. 二.操作: 1.新建windows服务的项目: 2.修改windows服务相关内容: 3.预览windows服务代码结构: 4.windows服务生成与发布: 三.代码: 1.测试代码: using ClassLibrary1; using System; using System.Collections.Generic; using System.ComponentModel; usin

C++初入门

C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互.现在让我们简要地看一下什么是类.对象,方法.即时变量. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例.最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题.类 - 类可以定义为描述对象行为/状态的模板/蓝图. 方法 - 从基本上说,一个方法表示一种行为.一个类可以包含多

SpringBoot 初入门

SpringBoot 初入门 关于介绍什么之类的就不讲了,主要做一下学习记录. 1. 启动方式 IDEA 启动 命令行启动: mvn spring-boot:run 部署到服务器启动: 先进行打包, mvn clean package 移动到项目的 target 目录下,可以看到一个后缀名为 jar 的文件,便是刚刚我们打包的 jar 包, 使用命令行启动: java -jar target/luckymoney-0.0.1-SNAPSHOT.jar 传参方式启动: java -jar -Dsp

pybrain初入门

标准的官方网址:http://pybrain.org/ 在python语言中自己实现神经网络的所有代码很复杂,但是有了pybrain就容易的多了,我们只需要专注于算法本身,而忽略算法的繁琐细节 pybrain的介绍 基本流程 1.构造神经网络 2.构造数据集 3.训练神经网络 4.结果可视化 5.验证与分析 pybrain使用入门 参考文献: 下面的基本用法将逐步的完善补充,主要还是根据自己的学习进度进行推进 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1

坚持自学的第二天,bootstrap初入门

前言 昨天,初步学完了jekyll目录结构与Liquid语法的应用与认识. 日志 今天刚入门,做了一个bootstrap导航栏,但是选中状态不行,找了JS中写好的API,写法与视频中讲的有点不一样,但还没有尝试.这样的一个小错误,也和过支一样,花了几人小时.但是,还是不得要领,我想看原文档的API,并仔细研究,尝试编码验证还是很重要的.以后的几天,我将尝试使用这种模式,但是不同的是,自己仔细看完一遍,自己不看原代码写出来,并写好注释. 感言 今天熬住,没有再下载游戏,疯狂玩游戏的那种状态.遇到代

算法竞赛之排序算法初入门

关于排序的一些知识点 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.我们学习的排序是关于算法之中,对一些特定数据,按照一定的优先级顺序将数据及逆行合理化的排列,比如在最初学习C语言的时候,老师提到的冒泡排序.选择排序,这两个是基本的排序,原理也应该比较简单,其实最早接触到的就是两个数字比较大小,然后按升序或者降序排布的,这个应该是最早接触的排序了. 既然排序这么重要,我们就学习一下一些常见的排序算法吧,由于本人能力有限,

技术人员初入门,该如何突破早期瓶颈?

这是我在知乎上关于问题“只会 if, else, 数据库 CRUD 的 Java 程序员如何提升自己?”给出的答案.其实,这应该就是一个关于早期技术人员怎样突破瓶颈的问题. 作为一个爱好技术的人,我们最常见的技术入门——或者说技术切入点——就是开发有实际可见结果的应用——因为这个够简单,够有成就感.而无论哪个平台.框架上面的应用开发在现阶段都逃不开楼主所说的,某个编程语言的学习(Java.Ruby.PHP 等),某个数据库(Mysql.Sqlite.Mongodb 等),再加上楼主未曾说的该框架