zoukankan      html  css  js  c++  java
  • java DMO及增删改查代码的自动生成

    在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

  • 相关阅读:
    thinkphp redis实现文章点赞功能并同步入mysql
    phpstorm2020.1最新版永久破解
    mysql修改sql_mode为宽松模式
    用为知发布博客到博客园、使用Wiz编写和发布博客园(cnblogs)博客
    Vim命令大全
    Vim教程
    GDB教程详解
    TCMalloc 对MYSQL 性能 优化的分析
    TCMalloc 安装和使用
    使用Tcmalloc进行堆栈分析
  • 原文地址:https://www.cnblogs.com/jarman/p/5180270.html
Copyright © 2011-2022 走看看