专栏首页cwl_Java快速学习-代码生成器搭建环境

快速学习-代码生成器搭建环境

4 代码生成器搭建环境

4.1 思路分析

工具的执行逻辑如下图所示:

如上分析,得知完成代码生成器需要以下几个操作:

  1. 用户填写的数据库信息,工程搭建信息需要构造到实体类对象中方便操作
  2. 数据库表信息,数据库字段信息需要构造到实体类中
  3. 构造Freemarker数据模型,将数据库表对象和基本配置存入到Map集合中
  4. 借助Freemarker完成代码生成
  5. 自定义公共代码模板

4.2 搭建环境

4.2.1 配置坐标

<dependencies>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>

4.2.2 配置实体类

(1) UI页面获取的数据库配置,封装到数据库实体类中

//数据库实体类
public class DataBase {
    private static String mysqlUrl = "jdbc:mysql://[ip]:[port]/[db]?
useUnicode=true&amp;characterEncoding=UTF8";
    private static String oracleUrl = "jdbc:oracle:thin:@[ip]:[port]:[db]";
    private String dbType;//数据库类型
    private String driver;
    private String userName;
    private String passWord;
    private String url;
    public DataBase() {}
    public DataBase(String dbType) {
        this(dbType,"127.0.0.1","3306","");
   }
    public DataBase(String dbType,String db) {
        this(dbType,"127.0.0.1","3306",db);
   }
    public DataBase(String dbType,String ip,String port,String db) {
        this.dbType = dbType;
        if("MYSQL".endsWith(dbType.toUpperCase())) {
            this.driver="com.mysql.jdbc.Driver";
            this.url=mysqlUrl.replace("[ip]",ip).replace("[port]",port).replace("
[db]",db);
       }else{
            this.driver="oracle.jdbc.driver.OracleDriver";
            this.url=oracleUrl.replace("[ip]",ip).replace("[port]",port).replace("
[db]",db);
       }
   }
    public String getDbType() {
        return dbType;
   }
    public void setDbType(String dbType) {
        this.dbType = dbType;
   }
    public String getDriver() {
        return driver;
         }
    public void setDriver(String driver) {
        this.driver = driver;
   }
    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;
   }
    public String getUrl() {
        return url;
   }
    public void setUrl(String url) {
        this.url = url;
   }
}

(2) UI页面获取的自动生成工程配置,封装到设置实体类中

public class Settings {
    private String project="example";
    private String pPackage="com.example.demo";
    private String projectComment;
    private String author;
    private String path1="com";
    private String path2="example";
    private String path3="demo";
    private String pathAll;
    public Settings(String project, String pPackage, String projectComment, String
author) {
        if(StringHelper.isNotBlank(project)) {
            this.project = project;
       }
        if(StringHelper.isNotBlank(pPackage)) {
            this.pPackage = pPackage;
       }
        this.projectComment = projectComment;
         this.author = author;
        String[] paths = pPackage.split("\\.");
        path1 = paths[0];
        path2 = paths.length>1?paths[1]:path2;
        path3 = paths.length>2?paths[2]:path3;
        pathAll = pPackage.replaceAll(".","/");
   }
    public Map<String, Object> getSettingMap(){
        Map<String, Object> map = new HashMap<>();
        Field[] declaredFields = Settings.class.getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            try{
                map.put(field.getName(), field.get(this));
           }catch (Exception e){}
       }
        return map;
   }
    public String getProject() {
        return project;
   }
    public void setProject(String project) {
        this.project = project;
   }
    public String getpPackage() {
        return pPackage;
   }
    public void setpPackage(String pPackage) {
        this.pPackage = pPackage;
   }
    public String getProjectComment() {
        return projectComment;
   }
    public void setProjectComment(String projectComment) {
        this.projectComment = projectComment;
   }
    public String getAuthor() {
        return author;
   }
    public void setAuthor(String author) {
        this.author = author;
   }
    public String getPath1() {
     return path1;
   }
    public void setPath1(String path1) {
        this.path1 = path1;
   }
    public String getPath2() {
        return path2;
   }
    public void setPath2(String path2) {
        this.path2 = path2;
   }
    public String getPath3() {
        return path3;
   }
    public void setPath3(String path3) {
        this.path3 = path3;
   }
    public String getPathAll() {
        return pathAll;
   }
    public void setPathAll(String pathAll) {
        this.pathAll = pathAll;
   }
}

(3) 将查询数据表的元数据封装到Table实体类

public class Table {
 
 private String name;//表名称
 private String name2;//处理后的表名称
 private String comment;//介绍
 private String key;// 主键列
 private List<Column> columns;//列集合
 public String getName() {
	 return name;
 }
 public void setName(String name) {
	 this.name = name;
 }
 public String getName2() {
	 return name2;
 }
 public void setName2(String name2) {
	 this.name2 = name2;
 }
 public String getComment() {
	 return comment;
 }
 public void setComment(String comment) {
	 this.comment = comment;
 }
 public String getKey() {
	 return key;
 }
 public void setKey(String key) {
	 this.key = key;
 }
 public List<Column> getColumns() {
	 return columns;
 }
 public void setColumns(List<Column> columns) {
	 this.columns = columns;
 }
}

(4)将查询数据字段的元数据封装到Column实体类

/**
* 列对象
*/
public class Column {
 
	 private String columnName;//列名称
	 private String columnName2;//列名称(处理后的列名称)
	 private String columnType;//列类型
	 private String columnDbType;//列数据库类型
	 private String columnComment;//列备注D
	 private String columnKey;//是否是主键
	 public String getColumnName() {
		 return columnName;
	 }
	 public void setColumnName(String columnName) {
		 this.columnName = columnName;
	 }
	 public String getColumnName2() {
	 	return columnName2;
	 }
	 public void setColumnName2(String columnName2) {
		 this.columnName2 = columnName2;
	 }
	 public String getColumnType() {
		 return columnType;
	 }
	 public void setColumnType(String columnType) {
		 this.columnType = columnType;
	 }
	 public String getColumnDbType() {
		 return columnDbType;
	 }
	 public void setColumnDbType(String columnDbType) {
		 this.columnDbType = columnDbType;
	 }
	 public String getColumnComment() {
		 return columnComment;
	 }
	 public void setColumnComment(String columnComment) {
		 this.columnComment = columnComment;
	 }
	 public String getColumnKey() {
		 return columnKey;
	 }
	 public void setColumnKey(String columnKey) {
		 this.columnKey = columnKey;
	 }
}

4.2.3 导入工具类

导入资料中提供的工具类

FileUtils:文件处理工具类:

  1. getRelativePath:获取文件的相对路径
  2. searchAllFile :查询文件夹下所有文件
  3. mkdir :创建文件目录

PropertiesMaps:

  1. 加载所有properties并存入Map集合中:
  2. 加载代码生成器的基本配置文件
  3. 加载用户的自定义配置文件
  4. 所有配置文件需要放置到"/properties"文件夹下

StringHelper:

  1. 字符串处理工具类

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 性能优化-测试for循环中的反射操作

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • 商城项目-已登录购物车

    购物车系统只负责登录状态的购物车处理,因此需要添加登录校验,我们通过JWT鉴权即可实现。

    cwl_java
  • JDK1.9-集合综合案例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • Android开发使用json实现服务器与客户端数据的交互功能示例

    本文实例讲述了Android开发使用json实现服务器与客户端数据的交互功能。分享给大家供大家参考,具体如下:

    砸漏
  • 创建型设计模式:Builder Pattern示例介绍

    在此之前,我们了解了工厂和抽象工厂模式。这些模式很有用。然而,有几个案例需要创建一个非常复杂的对象,它需要不同的步骤和操作。在这种情况下,Builder Pat...

    程序你好
  • 使用javascript让项目支持热插拔 原

        突然想起之前做过的一个小项目,项目虽小,需求却不小,要求解析特定格式的字符串,并且特定格式并非一成不变,想要一套系统能够支持解析多变的规则且更改规则时不...

    尚浩宇
  • SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    EalenXie
  • 微信扫码支付、网站接入微信支付-Java

    码农笔录
  • 微信扫码支付、网站接入微信支付-java

    用户2235302
  • 泛型

    葆宁

扫码关注云+社区

领取腾讯云代金券