freemarker代码生成器

FreeMarker开发代码生成器全解 代码生成器:可以生成代码的程序 代码生成器的三要素:数据+模板+合成机制 我们使用的模板引擎是freemarker FreeMarker是一款模板引擎: 一种基于模板和数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具 下面通过一个简单的案例来了解一下Freemarker的使用: 首先创建一个maven的工程,在pom.xml文件中添加如下依赖: pom.xml ... 阅读详情

代码生成器概述

  • 代码生成器顾名思义就生成代码的一个软件。 为了节省人力成本, 在日常的企业开发中, 代码生成器使用的较为普遍。
     
  • 简单说:可以生成代码的程序
  • 例如:

  • 可以得出如下结论
    • jsp就是一个模板
    • tomcat根据jsp和数据生成了html代码
    • tomcat内部有一个代码生成器可以生成html代码
  • 代码生成器=模板+数据+合成机制
  • 对比如下两个mapper接口

 

 

  • 代码生成器的好处
    • 节省人力成本
    • 易于代码规范控制
  • 代码生成器三要素
    • 模板: 生成文件的模板文件
    • 数据: 生成文件所需要的关键数据
    • 合成机制: 使用数据置换模板中的占位符, 生成新的文件的机制
    • 其中数据我们可以从数据库中进行获取, 模板文件,以及根据模板文件生成代码的机制我们选用较为成熟的模板引擎: FreeMarker,velocity,thymeleaf

freemarker

  • FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本 (HTML 网页、 电子邮件、 配置文件、 源代码等) 的通用工具。 FreeMarker 是免费的, 基于 Apache 许可证 2.0 版本发布。 其模板编写为 FreeMarker Template Language(FTL) , 属于简单、 专用的语言。
     
  • 原理图

  • freemarker数据合成
    • 下载freemarker的jar包

  1.     <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
    </dependencies>
  • 创建Configuration对象
    • 作用:环境初始化
    • 常用API

  • 创建Template对象
    • 作用:模板实例化,执行代码生成
    • 常用API
  • 入门案例
    • java代码

  1. public void test1() throws IOException, TemplateException {
        // 初始化freemarker配置
        // 创建configuration对象实例
        Configuration configuration = new Configuration();
        // 获取源文件夹的位置
        String path = this.getClass().getClassLoader().getResource("").getPath();
        // 设置模板文件位置
        configuration.setDirectoryForTemplateLoading(new File(path));
     
        // 通过configuration对象获根据模板名称取到template
        Template template = configuration.getTemplate("/templates/demo.ftl");
     
        // 组装数据
        Map map = new HashMap();
        map.put("name", "jerry");
        // 传参生成数据
        template.process(map, new OutputStreamWriter(new FileOutputStream(new File("d:/a.html"))));
    }
    • 模板代码

  1.     <head>
        </head>
        <body>
           hello ${name}<br>        
        </body>
    </html>

freemarker基本语法

  • 输出基本数据类型或对象属性
    • 输出数据/对象的属性
  •   语法规则:${数据}或者${对象.属性}
    • 输出集合
  1. #list sequence as item> 
       <#ifitem_has_next>
           ...... 
        <#else>
           ...... 
        </#if> 
    </#list>
     
    <#list users as u>
        ${u.username}<br>
    </#list><hr>
    • 判断条件
  2. #if condition1>...
        <#elseif condition2>
           ......
        <#elseif condition3>
           ......
        <#else>
           ......
    </#if>
     
    <#list users as u>
        <#if u.username != "张三">
            ${u.username}<br>
        </#if>
    </#list>
    <hr>
     
     
    <#list users as u>
        <#if u_has_next>
            ${u.username},
        <#else>
            ${u.username}
        </#if>
    </#list>
    <hr>
     
    <#list users as u>
        <#if u.username ="张三">
            ${u.username}<br>
        <#elseif u.username="李四">
            hello${u.username}<br>
        <#else>
            你好${u.username}<br>
        </#if>
    </#list>
    <hr>

获取数据库表数据

 

  • 我们只需要获取到表的数据,就能够通过代码生成器生成mapper
  • 使用JDBC连接数据库
  • <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.8</version>
    </dependency>
  • 获取DatabaseMetaData元数据
    • 获取方式:conn.getMetaData()
  • 获取数据库表信息(主要为表名)
    • ResultSet resultSet = dbmd.getTables(null, null, null, new String[]{"TABLE"})
    • String tableName = resultSet.getString("TABLE_NAME")

/**
 * 获取表信息demo
 */
public class TableDemo {
 
    public static final String DBDRIVER = PropertiesUtils.get("database.properties", "mysql.driver");
    public static final String DBURL = PropertiesUtils.get("database.properties", "mysql.url");
    public static final String DBUSER = PropertiesUtils.get("database.properties", "mysql.user");
    public static final String DBPWD = PropertiesUtils.get("database.properties", "mysql.password");
    private static Connection conn;
    private static DatabaseMetaData metaData;
 
    static {
        try {
            // 加载驱动
            Class.forName(DBDRIVER);
            // 获取数据库连接
            conn = DriverManager.getConnection(DBURL, DBUSER, DBPWD);
            // 得到DatabaseMetaData对象
            metaData = conn.getMetaData();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
     // 获取表名
    public static void getTable() {
        try {
            // 拿到表的结果集
            ResultSet resultSet = metaData.getTables(null, null, null, new String[]{"TABLE"});
            // 遍历结果集
            while (resultSet.next()) {
                String tableName = resultSet.getString("TABLE_NAME");
                System.out.println(tableName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void test() {
        getTable();
    }
 
}

  • 获取列信息
    • 根据表名获取列信息
      • ResultSet rs = dbmd.getColumns(null, "%", tableName, "%");
    • 获取列名
      • rs.getString("COLUMN_NAME")
    • 获取列注释
      • rs.getString("REMARKS")
    • 获取列类型
      • rs.getString("TYPE_NAME")

// 获取表的列信息
public static void getColumns(String tableName) {
    try {
        // 拿到表的列信息结果集
        ResultSet resultSet = metaData.getColumns(null, "%", tableName, "%");
        // 遍历结果集
        while (resultSet.next()) {
            // 获取列名
            String column_name = resultSet.getString("COLUMN_NAME");
            // 获取列类型
            String type_name = resultSet.getString("TYPE_NAME");
            // 获取列注释
            String remarks = resultSet.getString("REMARKS");
            System.out.println(table_name + "-" + type_name + "-" + remarks);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

集成代码生成器

  • 使用Freemarker编写程序源码模板
    • Module.ftl
    • Mapper.ftl
    • Service.ftl
    • ServiceImpl.ftl
  • 分层集成
    • 模板、数据、合成机制
  • 统一配置
    • 配置文件

编写pojo的代码生成器

  • 先将pojo.java改造为pojo.ftl模板

public class 根据表命转化的类名 implements Serializable {
 
    private 表的列类型-java类型 表的列名称;
 
    public void set表的列名首字母大写 (表的列类型-java类型  表的列名称){
        this.表的列名称=表的列名称;
    }
 
    public  Long get表的列名首字母大写(){
        return this.表的列名称;
    }
 
}

  • 封装table和column对象

public class Table {
    // 数据库表名
    private String tableName;
    // 表名转化的类名
    private String className;
    // 表中的列
    private List<Column> list;
}

public class Column {
    // 列名
    private String columnName;
    // 属性名(如果列名和属性名不一致需要转换)
    private String fieldName;
    // 属性名首字母大写
    private String upperFieldName;
    // 列类型
    private String columnType;
    // 列类型转换的java类型
    private String javaType;
    // 列注释
    private String remarks;
}

  • 抽取TableUtil工具类

/**
 * 获取表信息工具类
 */
public class TableUtil {
 
    public static final String DBDRIVER = PropertiesUtils.get("database.properties", "mysql.driver");
    public static final String DBURL = PropertiesUtils.get("database.properties", "mysql.url");
    public static final String DBUSER = PropertiesUtils.get("database.properties", "mysql.user");
    public static final String DBPWD = PropertiesUtils.get("database.properties", "mysql.password");
    private static Connection conn;
    private static DatabaseMetaData metaData;
 
    static {
        try {
            // 加载驱动
            Class.forName(DBDRIVER);
            // 获取数据库连接
            conn = DriverManager.getConnection(DBURL, DBUSER, DBPWD);
            // 得到DatabaseMetaData对象
            metaData = conn.getMetaData();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    // 获取表的列信息
    public static List<Column> getColumns(String tableName) {
        List<Column> columnList = new ArrayList<Column>();
        try {
            // 拿到表的列信息结果集
            ResultSet resultSet = metaData.getColumns(null, "%", tableName, "%");
            // 遍历结果集
            while (resultSet.next()) {
                Column column = new Column();
                // 获取列名
                String column_name = resultSet.getString("COLUMN_NAME");
                // 获取列类型
                String type_name = resultSet.getString("TYPE_NAME");
                // 获取列注释
                String remarks = resultSet.getString("REMARKS");
                //封装columnList
                column.setColumnName(column_name);
                column.setColumnType(type_name);
                column.setFieldName(column_name);
                column.setJavaType(StringUtils.switchType(type_name));
                column.setRemarks(remarks);
                column.setUpperFieldName(StringUtils.captureName(column_name));
                columnList.add(column);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return columnList;
    }
 
    // 获取表名
    public static List<Table> getTable() {
        List<Table> tableList = new ArrayList<Table>();
        try {
            // 拿到表的结果集
            ResultSet resultSet = metaData.getTables(null, null, null, new String[]{"TABLE"});
            // 遍历结果集
            while (resultSet.next()) {
                Table table = new Table();
                String tableName = resultSet.getString("TABLE_NAME");
                table.setClassName(StringUtils.putOffUnderline(tableName));
                table.setTableName(tableName);
                List<Column> columnList = getColumns(tableName);
                table.setList(columnList);
                tableList.add(table);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return tableList;
    }
}

  • 修改模板

public class ${table.className} implements Serializable {
<#list table.list as column>
    // ${column.remarks}
    private ${column.javaType} ${column.fieldName};
</#list>
 
<#list table.list as column>
    public void set${column.upperFieldName} (${column.javaType} ${column.fieldName}){
        this.${column.fieldName}=${column.fieldName};
    }
 
    public ${column.javaType} get${column.upperFieldName}(){
        return this.${column.fieldName};
    }
</#list>
}

  • 改造生成器GeneratorUtils

public class GeneratorUtil {
 
    private static Configuration configuration = new Configuration();
 
    public static void proceed(Map<String, Object> map, String tempName, String savePath) {
        try {
            // 通过configuration对象获根据模板名称取到template
            Template template = configuration.getTemplate(tempName);
            // 传参生成数据
            template.process(map, new OutputStreamWriter(new FileOutputStream(new File(savePath))));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    }
 
    public static void init(String path) {
        try {
            // 设置模板文件位置
            configuration.setDirectoryForTemplateLoading(new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 编写pojo的生成器并测试

public class PojoHandler {
 
    public void execute() {
        GeneratorUtil.init(this.getClass().getClassLoader().getResource("templates").getPath());
        List<Table> tables = TableUtil.getTable();
        for (Table table : tables) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("table", table);
            GeneratorUtil.proceed(map, "pojo.ftl", "d:/data/" + table.getClassName() + ".java");
        }
    }
 
    @Test
    public void test() {
        PojoHandler handler = new PojoHandler();
        handler.execute();
    }
}

velocity和freemarker的比较 NULL 博文链接:https://jetway.iteye.com/blog/569436 立即下载

相关推荐

Qt Creator菜单栏消失的终极修复指南:从快捷键冲突到设置恢复

本文详细解析了Qt Creator菜单栏消失的常见原因及修复方法,包括快捷键冲突排查、配置文件重置和界面模式切换等解决方案。特别针对Qt开发者遇到的菜单栏显示问题,提供了从简单快捷键操作到深度配置修改的全方位指南,帮助用户快速恢复Qt Creator的正常使用。

weixin_27240351的博客 338

Java之利用Freemarker模板引擎实现代码生成器,提高效率

开心一笑【1.你以为我会眼睁睁的看着你去送死?我会闭着眼睛。2.给你讲个故事,从前有个笨蛋,他非常笨,别人问他问题他只会回答“没有”,这个故事你听过吗?】提出问题如何利用 Java + Freemarker 实现代码生成器???解决问题* 前言 *做业务开发的时候,经常要根据建立好的数据库表,生成相关的 Model , DTO , Service, Controller , DAO 等等。包括基本的

IT技术分享 4万+

[多智能体强化学习] 王树森YouTube课程笔记

前言 近期在设计V2X资源分配任务下的状态空间和动作空间,可以说是一筹莫展,是自己菜,现在看来可能也是涉及到一些关于多智能体强化学习实现过程中过于细节的点,目前的知识储备还不够。因此打算用半周到一周的时间重电,希望之后能有进展。 本文内容来自于友人LX所推荐的油管教程,链接如下:多智能体强化学习,一共两节课40min左右。教程废话不多干货不少,老师的声音还好听,推荐直接去看原教程。 这里还要多一嘴,那就是对于强化学习来说,单主体和多主体的界限,在某种程度上来说是很模糊的,并不是场景中有多个主体需要..

观林望实的博客 3365

Velocity和FreeMarker模版技术

模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity作为view,模板技术作为view的好处是很多,尤其和jsp比较起来优点更大,众所周知jsp需要在第一次被执行的时候编译成servlet,那么这个过程是很慢

sunzhenhua0608的专栏 1223

Flowable多数据源实战:从配置到指定Schema的避坑指南

本文详细介绍了Flowable多数据源配置的实战指南,包括基础配置、数据源Bean创建、指定Schema的进阶配置以及常见问题排查。通过具体代码示例和避坑建议,帮助开发者高效实现多租户系统中的工作流引擎集成,特别强调了schema设置和事务管理的注意事项。

weixin_30824599的博客 486

Jetson Orin NX上PyTorch环境搭建与性能优化指南

本文详细指导如何在Jetson Orin NX上搭建高效的PyTorch开发环境。内容涵盖CUDA与cuDNN的“隐藏”配置、Miniconda虚拟环境管理、PyTorch for Jetson的正确安装与验证,并提供了电源模式设置、TensorRT加速、混合精度等关键性能优化实战技巧,帮助开发者充分释放边缘AI设备的算力。

weixin_29090089的博客 338

FreeMarker 生成代码

freemarker代码生成 数据库代码生成 mvc三层代码生成

lanse_huanxiang的专栏 620

视觉定位避坑指南:基于双mark点的坐标转换常见错误排查

本文详细解析了工业视觉项目中基于双mark点的坐标转换常见错误及排查方法,涵盖旋转矩阵构建、坐标系原点选择、图像预处理优化等关键环节。通过实战案例和代码示例,帮助工程师避免定位偏差,提升系统精度,特别适用于自动化检测和精密制造场景。

7z8x2c4v6b9的博客 168

使用freemarker实现代码生成的小项目|后端代码生成篇

一步一步使用freemarker实现代码生成的小项目|后端代码生成篇 前言 使用freemarker来生成代码,先定义代码的模板,使用定义的模板和传入的模型变量来生成相应的代码 ...

github_35976996的博客 1087

微信小程序使用TCP通信

最终目的:在微信小程序内实现对局域网发起TCP通信实现步骤:建立TCP服务 + 小程序发起通信。

Big_YiFeng的博客 5612

在 SAP 中启用应收/应付“代扣税(Withholding Tax)”功能,本质上是激活并配置“扩展代扣税(Extended Withholding Tax)”模型

摘要:SAP中启用应收/应付代扣税功能需完成3个层级12个核心步骤:1)全局激活公司代码代扣税功能;2)配置代扣税规则、税率和科目,包括定义税种类型、代码、总账科目等;3)在供应商/客户主数据中关联代扣税设置。完成后系统可在发票或付款环节自动计算并过账代扣税,支持多税种并行计算和税率年度调整,最终生成税务报表。常见问题排查需检查公司代码激活状态和主数据配置。(149字)

金牌架构师 836

使用FreeMarker生成代码

pom.xml // 引入FreeMarker包。Test.ftl // 指定的模板引擎。Main.java // 生成代码封装。

focus-unchanged-thing 1622

华为OD机试真题 新系统 2026-09-06 Python&JS【仓储货物有序出库】

某仓储中心有一个货物堆放区,货物编号按乱序堆叠存放,只能从顶部取货,管理员需要将货物按编号从小到大取出。

MISAYAONE的博客 116

freemarker实现代码生成器

这个主要是黑马的ihrm课程中讲的代码生成器的部分内容。 文章目录应用场景第一个FreeMarker程序(数据+模板 = 文件输出)概述数据模型模板的常用标签模板的常用指令元数据数据库元数据参数元数据结果集元数据代码生成器思路分析搭建环境导入坐标配置实体类导入工具类代码生成器实现构造数据模型数据分析自定义数据元数据处理路径处理制作模板模板的约定需求分析SpringBoot通用模板实体类持久化层Service层Controller配置文件 页面=模板+数据模型 FreeMarker 不是 Web 应用框架。

shall_zhao的博客 1383

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Freemarker简单实现一个代码生成器。

忽然想起以前工作的时候突发奇想写的一个一个代码生成器,也记录一下吧。 首先文件如下: 我的模板配置如下: package ${packageName}; import java.util.Date; public class ${className}{ &lt;#-- 循环类型及属性 --&gt; &lt;#list attrs as attr&gt; private $...

qq_42324187的博客 6445

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MybatisPlus代码生成器 + FreeMarker 模板

代码生成本身往往难以满足项目中的自定义需求,结合进行代码生成的个性化定制。

m0_69786632的博客 3034

Freemarker自定义代码生成器

Freemarker自定义代码生成器:帕斯卡风格进行快速开发dao层

Huangjunqi23的博客 2668

基于freemarker构建专属代码生成器——代码生成器的底层原理

通常来讲,在Java开发中最基本的也是占用我们最大量事件的就是CRUD,也就是频繁地构造“实体类”、“dao层代码”以及相关的service层和controller层的代码。其实,这一部分工作,可以使用代码生成器来完成,这里就要用到,我们的freemarker引擎了,我们需要将刚刚的代码复制到Hello.ftl文件中,然后将World和world提出按成变量(注意这里区分大小写)当然,我们可以使用循环,判断等逻辑表达生成更加复杂,通用性更好的模板。经过这样的三步走,最终就是我们的想要生成的目标代码。

m0_47532096的博客 1250

基于FreeMarker的自定义代码生成器

官方以及民间大佬都提供了一些代码生成器,例如mybatis-generator、Mybatis-plus的代码生成器等,但是可能跟我们平时使用习惯不一样。本文将介绍如何使用FreeMarker定义自己的代码生成器。

linovce的博客 1074

FreeMarker SpringBoot 代码生成器

FreeMarker SpringBoot 代码生成器 这篇大部分代码是用了 https://blog.youkuaiyun.com/weixin_43424932/article/details/104253977 这篇文章,只是我用它的代码没跑通,自己修改了一下,然后添加了注释,现在用下面的代码是可以跑通 FreeMarker教程: http://www.freemarker.net/ maven添加库 <!-- lombok --> <dependency> <groupId&gt

阿友的专栏 1116

基于Freemarker模板引擎的Java代码生成器

目录 一、前言 二、FreeMarker简介 三、实现原理 (一)编写模板文件 (二)配置FreeMarker (三)统一文件生成工具 (四)数据库操作 (五)封装填充数据 一、前言 对于Java开发人员来说,在做好框架整合进入开发阶段后,依然存在大量的重复工作,比如在Spring、SpringMVC、Mybatis架构下,我们需要构建Entity、Mapper、dao、ser...

一颗贪婪的星 6549

Mybatis-Plus代码生成器-FreeMarker引擎

Mybatis-Plus代码生成器-FreeMarker引擎

宁好的博客 1374

基于FreeMarker和DBUtils的JavaWeb代码生成器 一

基于FreeMarker和DBUtils的代码生成器 项目说明

哈 684

基于 Freemarker 的 Java 代码生成器:从数据库表自动生成 CRUD 代码

代码生成器

heguoqin123的博客 1448

如何使用freemarker编写代码生成器

pom.xml文件引入freemarker和jdbc依赖 <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.16</version> </dependency> <dependency> <g

qq_47759220的博客 230

学习开发代码生成器(一)--使用FreeMarker开发代码生成器

学习开发代码生成器(一)--使用FreeMarker开发代码生成器 什么是代码生成器 代码生成器:可以生成代码的程序 代码生成器=模板+数据+合成机制。Tomcat内部就有一个代码生成器可以生成HTML代码,客户端访问时,访问到的实际是Tomcat根据JSP(一种模板文件)和数据生成了静态的HTML代码。 为什么需要代码生成器 (1)节省人力成本 ...

丨Anna丨的博客 1443
上一篇: nexus搭建私服
下一篇: quartz任务调度器
GoldWashing
博客等级 码龄8年 18粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值