FreeMarker 生成Java、mybatis文件

FreeMarker 生成Java、mybatis文件FreeMarker 生成 Java mybatis 文件将 mysql 数据库表通过 FreeMarker 生成对应的 Java 文件和对应的 mybatis 文件 FreeMarker 是一款模板引擎 即一种基于模板和要改变的数据 并用来生成输出文本 HTML 网页 电子邮件

                                             FreeMarker 生成Java、mybatis文件

       将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件。

       FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

package com.iteye.injavawetrust.freemarker; import java.io.File; import java.util.List; import java.util.Map; / * @author InJavaWeTrust */ public class TestFreeMarker { public static void main(String[] args) { // 1.创建目录 Params params = UtilXML.params; UtilFile.initDirName(params); // 2.生成文件 List 
  
    tables = UtilXML.tableList; for (Tables table : tables) { System.out.println(table.getTableName()); String javaClassName = UtilString.capitalize(UtilString .dbNameToVarName(table.getTableName())); Map 
   
     map = UtilFreemarker.getTableInfo(table .getTableName()); map.put("title", "InJavaWeTrust"); map.put("author", params.getAuthor()); map.put("createTime", UtilDate.getToday()); map.put("project", params.getProject()); map.put("className", javaClassName); map.put("voClassName", javaClassName); map.put("javapackage", params.getJavapackage()); // 1.po String poName = params.getOsdir() + File.separatorChar + "po" + File.separatorChar + javaClassName + "PO.java"; UtilFreemarker.generateFile(poName, "javapo.ftl", map); // 2.vo String voName = params.getOsdir() + File.separatorChar + "vo" + File.separatorChar + javaClassName + "VO.java"; UtilFreemarker.generateFile(voName, "javavo.ftl", map); // 3.xml String xmlName = params.getOsdir() + File.separatorChar + "xml" + File.separatorChar + javaClassName + ".xml"; UtilFreemarker.generateFile(xmlName, "xml.ftl", map); } } } 
    
  

package com.iteye.injavawetrust.freemarker; / * @author InJavaWeTrust */ public class Constants { public static final String DRIVER = UtilXML.dataSource.getDriver(); public static final String URL = UtilXML.dataSource.getUrl(); public static final String USER = UtilXML.dataSource.getUsername(); public static final String PASSWORD = UtilXML.dataSource.getPassword(); }

package com.iteye.injavawetrust.freemarker; / * @author InJavaWeTrust */ public class DataSource { public String driver; public String url; public String username; public String password; public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 

package com.iteye.injavawetrust.freemarker; / * @author InJavaWeTrust */ public class Params { public String osdir; public String javapackage; public String author; public String project; public String getOsdir() { return osdir; } public void setOsdir(String osdir) { this.osdir = osdir; } public String getJavapackage() { return javapackage; } public void setJavapackage(String javapackage) { this.javapackage = javapackage; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getProject() { return project; } public void setProject(String project) { this.project = project; } } 

  

package com.iteye.injavawetrust.freemarker; / * @author InJavaWeTrust */ public class Tables { public String tableName; public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } } 

package com.iteye.injavawetrust.freemarker; import java.text.SimpleDateFormat; import java.util.Date; / * @author InJavaWeTrust */ public class UtilDate { public static String getToday(){ String result = ""; Date date = new Date(); result = format(date); return result; } public static String format(Date date){ String format = "yyyyMMdd"; SimpleDateFormat fmt = new SimpleDateFormat(format); return fmt.format(date); } } 

  

package com.iteye.injavawetrust.freemarker; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.LinkedList; import java.util.List; / * @author InJavaWeTrust */ public class UtilDB { private static Connection conn = null; private static Statement st = null; private static ResultSet rs = null; private static DatabaseMetaData dmd = null; / * 链接数据库 * @return */ public static Connection connection() { try { Class.forName(Constants.DRIVER); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } try { conn = DriverManager.getConnection(Constants.URL, Constants.USER, Constants.PASSWORD); } catch (SQLException e) { e.printStackTrace(); } return conn; } / * 关闭链接 * @param rs * @param st * @param conn */ public static void release(ResultSet rs, Statement st, Connection conn) { try { try { if (null != rs) { rs.close(); } } catch (Exception e) { rs = null; } try { if (null != st) { st.close(); } } catch (Exception e) { st = null; } try { if (null != conn) { conn.close(); } } catch (Exception e) { conn = null; } } finally { rs = null; st = null; conn = null; } } / * 根据表名查询表中列注释 * @param tableName 表名 * @return List 
  
    */ public static List 
   
     getColumnRemarksByTableNameWithList(String tableName) { List 
    
      columnComments = new LinkedList 
     
       (); connection(); try { dmd = conn.getMetaData(); rs = dmd.getColumns(null, dmd.getUserName(), tableName, null); while (rs.next()) { columnComments.add(rs.getString("REMARKS")); } } catch (SQLException e) { e.printStackTrace(); } release(rs, st, conn); return columnComments; } / * 根据表名查询表中列名 * @param tableName 表名 * @return List 
      
        */ public static List 
       
         getColumnNameByTableNameWithList(String tableName) { List 
        
          columnComments = new LinkedList 
         
           (); connection(); try { dmd = conn.getMetaData(); rs = dmd.getColumns(null, dmd.getUserName(), tableName, null); while (rs.next()) { columnComments.add(rs.getString("COLUMN_NAME")); } } catch (SQLException e) { e.printStackTrace(); } release(rs, st, conn); return columnComments; } / * 根据表名查询表中列类型 * @param tableName 表名 * @return List 
          
            */ public static List 
           
             getColumnTyBypeTableNameWithList(String tableName) { List 
            
              tableNames = new LinkedList 
             
               (); connection(); try { dmd = conn.getMetaData(); rs = dmd.getColumns(null, dmd.getUserName(), tableName, null); while (rs.next()) { tableNames.add(rs.getString("TYPE_NAME")); } } catch (SQLException e) { e.printStackTrace(); } release(rs, st, conn); return tableNames; } / * 得到数据库中所有表名 * @return List 
              
                */ public static List 
               
                 getTableNames() { List 
                
                  tableNames = new LinkedList 
                 
                   (); connection(); try { dmd = conn.getMetaData(); rs = dmd.getTables(null, dmd.getUserName(), null, null); while (rs.next()) { tableNames.add(rs.getString("TABLE_NAME")); } } catch (SQLException e) { e.printStackTrace(); } release(rs, st, conn); return tableNames; } } 
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
    
  

package com.iteye.injavawetrust.freemarker; / * @author InJavaWeTrust */ import java.io.File; public class UtilFile { public static void createDir(String path){ if(null != path && !"".equals(path)){ File file = new File(path); file.mkdirs(); } } public static void initDirName(Params params){ //1.po String poDir = params.getOsdir() + File.separatorChar + "po"; createDir(poDir); //2.vo String voDir = params.getOsdir() + File.separatorChar + "vo"; createDir(voDir); //3.xml String xmlDir = params.getOsdir() + File.separatorChar + "xml"; createDir(xmlDir); } } 

package com.iteye.injavawetrust.freemarker; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import freemarker.cache.ClassTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateExceptionHandler; / * @author InJavaWeTrust */ public class UtilFreemarker { / * 获取表中列并转换成java属性 * @param tableName 表名 * @return list */ public static List 
  
    getColumnName(String tableName) { List 
   
     retCol = new LinkedList 
    
      (); List 
     
       columns = UtilDB.getColumnNameByTableNameWithList(tableName); for(String column : columns){ retCol.add(UtilString.dbNameToVarName(column)); } return retCol; } / * 获取表中列 * @param tableName 表名 * @return list */ public static List 
      
        getColumnNameForMybatis(String tableName) { List 
       
         retCol = new LinkedList 
        
          (); List 
         
           columns = UtilDB.getColumnNameByTableNameWithList(tableName); for(String column : columns){ retCol.add(column); } return retCol; } / * 得到表中列字段长度最长的列字段 * @param tableName 表名 * @return 最长的列字段 */ public static int getMaxColumnLength(String tableName){ int maxLen = 0; List 
          
            columns = getColumnNameForMybatis(tableName); for(String column : columns){ if(column.length() > maxLen){ maxLen = column.length(); } } return maxLen; } / * 得到Java属性字段长度最长的字段长度 * @param tableName 表名 * @return Java属性最长字段长度 */ public static int getMaxJavaPropertyLength(String tableName){ int maxLen = 0; List 
           
             property = getColumnName(tableName); for(String column : property){ if(column.length() > maxLen){ maxLen = column.length(); } } return maxLen; } / * 获取表中列注释 * @param tableName 表名 * @return list */ public static List 
            
              getRemarks(String tableName) { List 
             
               remarks = new ArrayList 
              
                (); remarks = UtilDB.getColumnRemarksByTableNameWithList(tableName); return remarks; } / * 获取表中列类型并转换成java类型 * @param tableName 表名 * @return list */ public static List 
               
                 getColumnType(String tableName) { List 
                
                  retTypes = new ArrayList 
                 
                   (); List 
                  
                    types = UtilDB.getColumnTyBypeTableNameWithList(tableName); for(String type : types){ retTypes.add(UtilString.dbTypeToJavaType(type)); } return retTypes; } / * 获取mybatis类型 * @param tableName 表名 * @return list */ public static List 
                   
                     getMybatisType(String tableName){ List 
                    
                      retTypes = new ArrayList 
                     
                       (); List 
                      
                        types = UtilDB.getColumnTyBypeTableNameWithList(tableName); for(String type : types){ retTypes.add(UtilString.mybatisType(type)); } return retTypes; } / * 获取dataModel * @param tableName 表名 * @return Map */ public static Map 
                       
                         getTableInfo(String tableName){ Map 
                        
                          map = new HashMap 
                         
                           (); map.put("columns", getColumnName(tableName)); map.put("mybatisColumns", getColumnNameForMybatis(tableName)); map.put("remarks", getRemarks(tableName)); map.put("columnTypes", getColumnType(tableName)); map.put("mybatisTypes", getMybatisType(tableName)); map.put("maxColumnLength", getMaxColumnLength(tableName)); map.put("maxJavaPropertyLength", getMaxJavaPropertyLength(tableName)); return map; } public static void generateFile(String fileName, String templateName, Map 
                          
                            map){ Configuration config = new Configuration(); config.setDefaultEncoding("UTF-8"); config.setTemplateLoader(new ClassTemplateLoader(UtilFreemarker.class, "/")); config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); try{ BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")); Template template = config.getTemplate(templateName); template.process(map, out); out.close(); }catch(Exception e){ e.printStackTrace(); } } public static Map 
                           
                             getMapInfo(String tableName){ Map 
                            
                              map = new HashMap 
                             
                               (); map = UtilFreemarker.getTableInfo(tableName); return map; } } 
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
    
  

package com.iteye.injavawetrust.freemarker; / * @author InJavaWeTrust */ public class UtilString { / * 首字母大写 * @param str * @return */ public static String capitalize(String str) { if (null == str) { return null; } else if ("".equals(str)) { return str; } return Character.toTitleCase(str.charAt(0)) + str.substring(1); } / * 将表中列名去下划线且下划线后首字母大写其他字母小写 * @param columnName 表中列名 * @return java类属性名 */ public static String dbNameToVarName(String columnName) { if (columnName == null) { return null; } StringBuilder fieldName = new StringBuilder(); boolean toUpper = false; for (int i = 0; i < columnName.length(); i++) { char ch = columnName.charAt(i); if (ch == '_') { toUpper = true; } else if (toUpper == true) { fieldName.append(Character.toUpperCase(ch)); toUpper = false; } else { fieldName.append(Character.toLowerCase(ch)); } } return fieldName.toString(); } / * 将数据库类型转换成java类型 * @param columnType 数据库类型 * @return java类型 */ public static String dbTypeToJavaType(String columnType) { String type = ""; if (columnType == null || columnType.trim().equals("")) { return null; } if (columnType.equals("VARCHAR")) { type = "String"; } else if (columnType.equals("DATE")) { type = "java.util.Date"; } else if (columnType.equals("DATETIME")) { type = "java.util.Date"; } else if (columnType.equals("CHAR")) { type = "String"; } else if (columnType.equals("INT")) { type = "Integer"; } else if (columnType.equals("INT UNSIGNED")) { type = "Integer"; } else if (columnType.equals("TEXT")) { type = "String"; } else if (columnType.equals("MEDIUMBLOB")) { type = "byte[]"; } else if (columnType.equals("DECIMAL")) { type = "java.math.BigDecimal"; } else { System.out.println("columnType[" + columnType + "]"); type = null; } return type; } / * 将数据库类型转换成mybatis配置文件类型 * @param sqlTypeName 数据库类型 * @return mybatis配置文件类型 */ public static String mybatisType(String sqlTypeName){ String type = ""; if (sqlTypeName == null || sqlTypeName.trim().equals("")) { return null; } if(sqlTypeName.equals("VARCHAR") || sqlTypeName.equals("TEXT")){ type = "VARCHAR"; }else if(sqlTypeName.equals("TINYBLOB") || sqlTypeName.equals("BLOB") || sqlTypeName.equals("MEDIUMBLOB")){ type = "BLOB"; } else if (sqlTypeName.equals("CHAR")) { type = "CHAR"; } else if (sqlTypeName.equals("INT")) { type = "INTEGER"; } else if (sqlTypeName.equals("DATETIME") || sqlTypeName.equals("DATE")) { type = "TIMESTAMP"; } else if (sqlTypeName.equals("DECIMAL")) { type = "DECIMAL"; } else if (sqlTypeName.equals("INT UNSIGNED")) { type = "INTEGER"; } else { System.out.println("sqlTypeName[" + sqlTypeName + "]"); type = null; } return type; } public static String getFileName(String tableName, String flag){ String retName; switch(flag){ case "po" : retName = tableName + "_po"; break; case "vo" : retName = tableName + "_vo"; break; default : retName = null; } return retName; } } 

package com.iteye.injavawetrust.freemarker; import java.io.File; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; / * 解析config.xml * @author InJavaWeTrust */ public class UtilXML { public static Params params = new Params(); public static DataSource dataSource = new DataSource(); public static List 
  
    tableList = new ArrayList 
   
     (); static{ parseXml("F:\\injavawetrust\\injavawetrust\\src\\main\\resources\\config.xml"); } private static void parseXml(String xmlResource){ try { SAXReader reader = new SAXReader(); Document document = reader.read(new File(xmlResource)); Element root = document.getRootElement(); List 
    
      elements = root.elements(); for(Element element : elements){ if("params".equals(element.getName())){ List 
     
       paramElements = element.elements(); for(Element param : paramElements){ if("osdir".equals(param.getName())){ params.setOsdir(param.attributeValue("value")); }else if("javapackage".equals(param.getName())){ params.setJavapackage(param.attributeValue("value")); }else if("author".equals(param.getName())){ params.setAuthor(param.attributeValue("value")); }else if("project".equals(param.getName())){ params.setProject(param.attributeValue("value")); } } }else if("dataSource".equals(element.getName())){ List 
      
        ele = element.elements(); for(Element e : ele){ if("driver".equals(e.getName())){ dataSource.setDriver(e.attributeValue("value")); }else if("url".equals(e.getName())){ dataSource.setUrl(e.attributeValue("value")); }else if("username".equals(e.getName())){ dataSource.setUsername(e.attributeValue("value")); }else if("password".equals(e.getName())){ dataSource.setPassword(e.attributeValue("value")); } } }else if("tables".equals(element.getName())){ List 
       
         tables = element.elements(); for(Element table : tables){ if("table".equals(table.getName())){ if("yes".equalsIgnoreCase(table.attributeValue("value"))){ List 
        
          tableNames = UtilDB.getTableNames(); for(String tableName: tableNames){ Tables t = new Tables(); t.setTableName(tableName); tableList.add(t); } break; }else if("no".equalsIgnoreCase(table.attributeValue("value"))){ continue; } Tables t = new Tables(); t.setTableName(table.attributeValue("value")); tableList.add(t); } } } } } catch (DocumentException e) { e.printStackTrace(); } } public static Params getParams() { return params; } public static void setParams(Params params) { UtilXML.params = params; } public static DataSource getDataSource() { return dataSource; } public static void setDataSource(DataSource dataSource) { UtilXML.dataSource = dataSource; } public static List 
         
           getTableList() { return tableList; } public static void setTableList(List 
          
            tableList) { UtilXML.tableList = tableList; } } 
           
          
         
        
       
      
     
    
  

freemarker模板

package ${javapackage}.po; / * 

${title}

* 类名:${className}PO
* 创建人:${author}
* 创建时间:${createTime}
*/ public class ${className}PO { <#list columns as propertyName> / * ${remarks[propertyName_index]} */ private ${columnTypes[propertyName_index]} ${propertyName}; <#list columns as propertyName> public ${columnTypes[propertyName_index]} get${propertyName?cap_first}() { return ${propertyName}; } public void set${propertyName?cap_first}(${columnTypes[propertyName_index]} ${propertyName}) { this.${propertyName} = ${propertyName}; } }







package ${javapackage}.vo; import ${javapackage}.po.${className}PO; / * 

${title}

* 类名:${className}VO
* 创建人:${author}
* 创建时间:${createTime}
*/ public class ${voClassName}VO extends ${className}PO { }







 
   
   
   
     <#list columns as propertyName> 
     
     
    
  

config 配置文件

 
   
   
    
     
     
     
     
    
    
     
     
     
     
    
    
    

数据库表

create table dept( deptno int unsigned auto_increment primary key COMMENT '部门编号', dname varchar(15) COMMENT '部门名称', loc varchar(50) COMMENT '部门所在位置' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表'; create table emp( empno int unsigned auto_increment primary key COMMENT '雇员编号', ename varchar(15) COMMENT '雇员姓名', job varchar(10) COMMENT '雇员职位', mgr int unsigned COMMENT '雇员对应的领导的编号', hiredate date COMMENT '雇员的雇佣日期', sal decimal(7,2) COMMENT '雇员的基本工资', comm decimal(7,2) COMMENT '奖金', deptno int unsigned COMMENT '所在部门', foreign key(deptno) references dept(deptno) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='雇员表'; create table salgrade( grade int unsigned COMMENT '工资等级', losal int unsigned COMMENT '此等级的最低工资', hisal int unsigned COMMENT '此等级的最高工资' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='工资等级表'; create table bonus( ename varchar(10) COMMENT '雇员姓名', job varchar(9) COMMENT '雇员职位', sal decimal(7,2) COMMENT '雇员工资', comm decimal(7,2) COMMENT '雇员资金' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='工资表';

 maven 依赖

 
   
   
     mysql 
    
   
     mysql-connector-java 
    
   
     5.1.15 
    
   
     provided 
    
   
   
   
     org.freemarker 
    
   
     freemarker 
    
   
     2.3.23 
    
   
   
   
     dom4j 
    
   
     dom4j 
    
   
     1.6.1 
    
  

 运行结果 freemarker.rar  源代码 demo.rar

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207535.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:39
下一篇 2026年3月19日 下午1:40


相关推荐

  • Flume的学习和使用

    Flume的学习和使用Flume 的学习和使用本文是基于 CentOS7 3 系统环境 进行 Flume 的学习和使用 CentOS7 3 一 Flume 的简介 1 1Flume 基本概念 1 什么是 FlumeFlume 是 Cloudera 提供的一个高可用的 高可靠的 分布式的海量日志采集 聚合和传输的系统 2 Flume 的目的 Flume 最主要的作业就是 实时读取服务器本地磁盘的数据 将数据写入 HDFS1 2Flume 基本组件 0 Flume 工作流程 Source 采集数据并包装成 Event 并将 Event

    2026年3月18日
    3
  • snmpwalk命令常用方法

    snmpwalk命令常用方法SNMPWALK是一个通过SNMPGET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作。命令行:[html] viewplain copysnmpwalk [选项] agent [oid]  选项参数:由于SNMP协议中,不同的协议版本存在不同的参数选项,以下参数按协议分开说明。

    2022年6月29日
    32
  • 怎么用音频转换器转换成mp3格式_音频格式转换软件哪个好

    怎么用音频转换器转换成mp3格式_音频格式转换软件哪个好怎样用MP3转换器转换音频格式

    2022年4月21日
    57
  • ldc java_java – LDC指令代码的负值是什么意思?

    ldc java_java – LDC指令代码的负值是什么意思?我是 java 字节码世界的新手 我有一些涉及字节码的调试任务 经过时我注意到一些看起来很可疑的值 但我不确定 这是完整字节码的一部分 accessflags0 jacocoInit ZGETSTATICCl jacocoData ZDUPIFNONNUL

    2026年3月26日
    2
  • LCN框架介绍

    LCN框架介绍LCN 框架介绍一 基本概念 随着互联化的蔓延 各种项目都逐渐向分布式服务做转换 如今微服务已经普遍存在 本地事务已经无法满足分布式的要求 由此分布式事务问题诞生 分布式事务被称为世界性的难题 目前分布式事务存在两大理论依据 CAP 定律 BASE 理论 1 CAP 理论 这个定理的内容是指的是在一个分布式系统中 Consistency 一致性 Availability

    2026年3月26日
    3
  • 《chkconfig命令》-linux命令五分钟系列之四

    《chkconfig命令》-linux命令五分钟系列之四

    2021年9月8日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号