一个java代码生成器的简单实现

MyBatis Generator 代码自动生成器,从此解放你的双手 2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。BAT面试经验实战系列:Spring全家桶+Redis等其他相关的电子书:源码+调优总结我的面试经验。 阅读详情

最近,一直跟着公司技术牛人在搞大数据相关的东西,主要涉及的是环境搭建,同时也了解下整个hadoop生态系统相关的东西,真是让我大开眼界,这个在之后的博文中再来与大家分享。 
今天,笔者给大家介绍一个代码生成器,这个是笔者的主管写的,写的确实不错,主要是基于公司的jquery easyUI + springMVC + myBatis这套框架写的,可以根据一个数据库表生成model、mapper.xml、dao接口以及service、controller、jsp页面等相关的东西,包含增删改查等操作,节省开发时间。然后,笔者在此代码生成器上修改了几个bug,同时兼容了一下mysql。 
这个代码生成器工具使用的核心是freemarker,一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。 
下面,笔者开始进行核心代码的介绍。 
首先,我们必须指定哪张表,然后通过jdbc获取这个表的信息以及表字段相关的信息。 
这里,将所有的配置写入config.properties:

###数据库表与model的映射
taskhistory=TaskHistory

###数据源配
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://172.31.26.156:3306/test
username=root
password=root
db=mysql

###每个用户对应一个同名的schema,注意配置,不然会搜索每个schema
schemaPattern=root
tableNamePattern=%taskhistory
sEQNamePattern=%TM0101_SE

###model包名
modelPackage=com.qiyongkang.sys.model
###model保存文件路径
modelSavePath=D:\\develop\\model\\

###mapper接口包名
mapperPackage=com.qiyongkang.sys.dao
###mapper接口保存文件路径
mapperSavePath=D:\\develop\\dao\\

###mapper.xml的文件路径
mapperXmlSavePath=D:\\develop\\mapping\\oracle\\

###service的包名
servicePackage=com.qiyongkang.sys.service.impl

###service的保存文件路径
serviceSavePath=D:\\develop\\service\\impl\\

###service interface的包名
serviceInterfacePackage=com.qiyongkang.sys.service
###service interface的保存文件路径
serviceInterfaceSavePath=D:\\develop\\service\\

###control包名
controllerPackage=com.qiyongkang.sys.ctrl

###control文件路径
controllerSavePath=D:\\develop\\ctrl\\

###junit包名
junitPackage=com.qiyongkang.test.system.service

###junit文件路径
junitSavePath=D:\\develop\\test\\java\\com\\qiyongkang\\test\\system\\service\\

###js文件路径
jsHomeSavePath=D:\\develop\\WebContent\\js\\modules\\system\\

###jsp文件路径
jspHomeSavePath=D:\\develop\\WebContent\\WEB-INF\\views\\system\\

###是否生成model
modelFlag=true

###是否生成mapper
mapperFlag=true

###是否生成mapper.xml
mapperXmlFlag=true

###是否生成service
serviceFlag=true

###是否生成service接口
serviceImplFlag=true

###是否生成control
controlFlag=true

###是否生成junit
junitFlag=false

###是否生成easyUIJs
easyUIJsFlag=false

###是否生成easyUIJsp
easyUIJspFlag=false

###是否生成extJs
extJsFlag=false

###备份文件路径
fileBakPath=D:\\develop\\bakFile\\

##项目名称
projectName=qyk_testSpringMVC
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

然后,再来看看获取数据库信息相关的代码:

package com.codegenerator.framework.service.impl;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import com.codegenerator.core.utils.ConfigUtil;
import com.codegenerator.framework.model.ColumnInfo;
import com.codegenerator.framework.model.ConnectConfig;
import com.codegenerator.framework.model.ModelInfo;
import com.codegenerator.framework.model.TableInfo;
import com.codegenerator.framework.service.DataBaseService;

public class DataBaseServiceImpl implements DataBaseService {
    private static Logger logger = LogManager.getLogger(DataBaseServiceImpl.class);

    @Override
    public List<ModelInfo> loadModelInfo(ConnectConfig connectConfig) {
        ModelInfo.tableNamePex = connectConfig.getTableNamePattern();
        logger.info("表前缀:{}", ModelInfo.tableNamePex);

        ModelInfo.sEQNamePex = connectConfig.getsEQNamePattern();
        logger.info("序列前缀:{}", ModelInfo.sEQNamePex);

        List<ModelInfo> mList = new ArrayList<ModelInfo>();
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        logger.info("驱动类:{}", connectConfig.getDriverClassName());
        dataSource.setDriverClassName(connectConfig.getDriverClassName());

        logger.info("url:{}", connectConfig.getUrl());
        dataSource.setUrl(connectConfig.getUrl());

        logger.info("userName:{}", connectConfig.getUsername());
        dataSource.setUsername(connectConfig.getUsername());

        logger.info("password:{}", connectConfig.getPassword());
        dataSource.setPassword(connectConfig.getPassword());

        Properties pro = connectConfig.getConnectionPros();

        logger.info("设置连接属性:{}", pro.stringPropertyNames());
        dataSource.setConnectionProperties(pro);

        Connection conn = null;
        //表查询结果集
        ResultSet tableRS = null;

        try {
            conn = dataSource.getConnection();
            DatabaseMetaData dbMetaData = conn.getMetaData();

            logger.info("Catalog:{}", connectConfig.getCatalog());
            logger.info("SchemaPattern:{}", connectConfig.getSchemaPattern());
            logger.info("TableNamePattern:{}", connectConfig.getTableNamePattern());
            logger.info("Types:{}", Arrays.toString(connectConfig.getTypes()));

            //获取表的结果集
            tableRS = dbMetaData.getTables(connectConfig.getCatalog(), connectConfig.getSchemaPattern(), connectConfig.getTableNamePattern(),
                    connectConfig.getTypes());

            while (tableRS.next()) {
                String tableName = tableRS.getString("TABLE_NAME");
                logger.info("tableName:{}", tableName);
                if (tableName.indexOf("$") == -1 && !connectConfig.getExclusionMap().containsKey(tableName)) {
                    if (ConfigUtil.getConfig(tableName) == null) {
                        continue;
                    }
                    ModelInfo modelInfo = new ModelInfo();
                    TableInfo tableInfo = new TableInfo();
                    tableInfo.setName(tableName);

                    logger.info("表{}的注释:{}", tableName, tableRS.getString("REMARKS"));
                    tableInfo.setRemark(tableRS.getString("REMARKS"));

                    logger.info("表{}的类型:{}", tableName, tableRS.getString("TABLE_TYPE"));
                    tableInfo.setType(tableRS.getString("TABLE_TYPE"));

                    //获取列的结果集
                    ResultSet columnRS = dbMetaData.getColumns(null, connectConfig.getSchemaPattern(), tableName, "%");

                    List<ColumnInfo> ciList = new ArrayList<ColumnInfo>();
                    while (columnRS.next()) {
                        String columnName = columnRS.getString("COLUMN_NAME");
                        logger.info("字段名称:{}", columnName);

                        String columnType = columnRS.getString("TYPE_NAME").toUpperCase();
                        logger.info("字段类型:{}", columnType);

                        String columnRemark = columnRS.getString("REMARKS");
                        logger.info("字段注释:{}", columnRemark);

                        int len = columnRS.getInt("COLUMN_SIZE");
                        logger.info("字段长度:{}", len);

                        int precision = columnRS.getInt("DECIMAL_DIGITS");
                        logger.info("字段类型精度:{}", precision);

                        if (columnName == null || "".equals(columnName)) {
                            continue;
                        }

                        ColumnInfo ci = new ColumnInfo();
                        ci.setName(columnName);
                        ci.setType(columnType);
                        ci.setRemark(columnRemark);
                        ci.setLen(len);
                        ci.setPrecision(precision);

                        ciList.add(ci);
                    }
                    tableInfo.setColumnList(ciList);
                    modelInfo.setmTable(tableInfo, connectConfig.getIdMap());
                    mList.add(modelInfo);
                    columnRS.close();
                }
            }
            tableRS.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("获取表、字段相关信息异常。。", e);
        } finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return mList;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142

这里,是将获取到的信息用ModelInfo.java这个实体封装:

package com.codegenerator.framework.model;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.codegenerator.core.utils.ConfigUtil;
import com.codegenerator.core.utils.StringUtil;
import com.codegenerator.framework.flt.service.ModelFtlService;
import com.codegenerator.framework.service.TypeHandler;

public class ModelInfo implements ModelFtlService {
    private String className;
    private String packageName;
    private String savePath;
    private TableInfo mTable;
    private String fileName;
    private String remark;
    public static String tableNamePex;
    public static String sEQNamePex;
    private String idCol;
    private String idPro;
    private String idColType;
    private String idProType;
    private String[] cols;
    private String[] pros;
    private String[] jdbcTypes;
    private String[] javaTypes;
    private Map<String, TypeHandler> dtoProMap = new HashMap<String, TypeHandler>();
    private Map<String, TypeHandler> modelProMap = new HashMap<String, TypeHandler>();
    private String name;
    private String sEQName;
    private String dtoFileName;

    public Map<String, TypeHandler> getDtoProMap() {
        return dtoProMap;
    }

    public void setDtoProMap(Map<String, TypeHandler> dtoProMap) {
        this.dtoProMap = dtoProMap;
    }

    public String getDtoFileName() {
        return dtoFileName;
    }

    public void setDtoFileName(String dtoFileName) {
        this.dtoFileName = dtoFileName;
    }

    public String[] getJdbcTypes() {
        return jdbcTypes;
    }

    public void setJdbcTypes(String[] jdbcTypes) {
        this.jdbcTypes = jdbcTypes;
    }

    public String[] getJavaTypes() {
        return javaTypes;
    }

    public void setJavaTypes(String[] javaTypes) {
        this.javaTypes = javaTypes;
    }

    public static String getsEQNamePex() {
        return sEQNamePex;
    }

    public static void setsEQNamePex(String sEQNamePex) {
        ModelInfo.sEQNamePex = sEQNamePex;
    }

    public String getsEQName() {
        return sEQName;
    }

    public void setsEQName(String sEQName) {
        this.sEQName = sEQName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String[] getCols() {
        return cols;
    }

    public void setCols(String[] cols) {
        this.cols = cols;
    }

    public String[] getPros() {
        return pros;
    }

    public void setPros(String[] pros) {
        this.pros = pros;
    }

    public void setmTable(TableInfo mTable) {
        this.mTable = mTable;
    }

    public static String getTableNamePex() {
        return tableNamePex;
    }

    public static void setTableNamePex(String tableNamePex) {
        ModelInfo.tableNamePex = tableNamePex;
    }

    public String getIdColType() {
        return idColType;
    }

    public void setIdColType(String idColType) {
        this.idColType = idColType;
    }

    public String getIdProType() {
        return idProType;
    }

    public void setIdProType(String idProType) {
        this.idProType = idProType;
    }

    public void setIdCol(String idCol) {
        this.idCol = idCol;
    }

    public void setIdPro(String idPro) {
        this.idPro = idPro;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getSavePath() {
        return savePath;
    }

    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }

    public TableInfo getmTable() {
        return mTable;
    }

    public void setmTable(TableInfo mTable, Map<String, String> idMap) {

        String tableName = ConfigUtil.getConfig(mTable.getName());
        if (tableName == null || "".equals(tableName)) {
            return;
        }
        this.mTable = mTable;
        if (this.className == null) {
            setClassName(StringUtil.getClassName(mTable.getName(), tableNamePex));
        }
        if (this.sEQName == null) {
            setsEQName(StringUtil.getSEQName(mTable.getName(), tableNamePex, sEQNamePex));
        }
        if (this.fileName == null) {
            setFileName(getClassName() + ".java");
        }
        if (this.dtoFileName == null) {
            setDtoFileName(getClassName() + "Dto.java");
        }
        if (this.remark == null) {
            setRemark(mTable.getRemark());
        }
        if (this.name == null) {
            setName(StringUtil.getClassAlias(mTable.getName(), tableNamePex));
        }
        ColumnInfo col = null;
        boolean hasConfig = idMap.containsKey(mTable.getName());
        List<ColumnInfo> colList = mTable.getColumnList();
        int len = colList.size() - 1;
        cols = new String[len];
        pros = new String[len];
        jdbcTypes = new String[len];
        javaTypes = new String[len];
        len = 0;
        for (ColumnInfo ci : colList) {
            if ((hasConfig && idMap.get(mTable.getName()).equalsIgnoreCase(ci.getName()))
                    || ci.getName().equalsIgnoreCase("id")) {
                //主键
                col = ci;
            } else {
                if (ci.getName() != null) {
                    cols[len] = ci.getName();
                    pros[len] = ci.getPropertyInfo().getName();
//                    jdbcTypes[len] = ci.getPropertyInfo().getJdbcType();
                    javaTypes[len] = ci.getPropertyInfo().getClassName();
//                    if ("TIMESTAMP".equalsIgnoreCase(jdbcTypes[len])) {
//                        TypeHandler mHandler = new DateHandler(ci.getPropertyInfo(), ci);
//                        dtoProMap.put(cols[len], mHandler);
//                        modelProMap.put(pros[len], mHandler);
//                    }
                    len++;
                }
            }
        }
        if (col != null) {
            setIdCol(col.getName());
            setIdPro(col.getPropertyInfo().getName());
            setIdColType(col.getType());
            setIdProType(col.getPropertyInfo().getClassName());
        }

    }

    public void setClassName(String className) {
        this.className = className;
    }

    @Override
    public String getPackageStr() {
        return "package " + getPackageName() + ";";
    }

    @Override
    public String getImportStr() {
        StringBuffer sb = new StringBuffer("\r\n");
        Map<String, String> imMap = new HashMap<String, String>();
        List<ColumnInfo> cifs = mTable.getColumnList();
        for (ColumnInfo cif : cifs) {
            PropertyInfo pi = cif.getPropertyInfo();
            String imStr = "import " + pi.getPackageName() + "." + pi.getClassName() + ";\r\n";
            if (pi.getPackageName() != null && !imMap.containsKey(imStr)) {
                sb.append(imStr);
                imMap.put(imStr, imStr);
            }
        }

        String imStr = "import java.util.Date;\r\n";
        if (modelProMap.size() > 0 && !imMap.containsKey(imStr)) {
            sb.append(imStr);
            imMap.put(imStr, imStr);
        }
        return sb.length() > 0 ? sb.toString() : null;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public String getPropertiesStr() {
        StringBuffer sb = new StringBuffer("\r\n");
        List<ColumnInfo> cifs = mTable.getColumnList();
        for (ColumnInfo cif : cifs) {
            PropertyInfo pi = cif.getPropertyInfo();
            sb.append(" /**\r\n");
            sb.append("  *" + pi.getRemark() + "\r\n");
            sb.append("  */\r\n");
            sb.append(" private " + pi.getClassName() + " " + pi.getName() + ";\r\n");

        }

        Set set = modelProMap.keySet();
        Iterator it = set.iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            sb.append(" /**\r\n");
            sb.append("  *查询起始时间\r\n");
            sb.append("  */\r\n");
            sb.append(" private Date " + key + "Before;\r\n");
            sb.append(" /**\r\n");
            sb.append("  *查询截止时间\r\n");
            sb.append("  */\r\n");
            sb.append(" private Date " + key + "After;\r\n");

        }
        return sb.length() > 0 ? sb.toString() : null;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public String getMethodStr() {
        StringBuffer sb = new StringBuffer("\r\n");
        List<ColumnInfo> cifs = mTable.getColumnList();
        for (ColumnInfo cif : cifs) {
            PropertyInfo pi = cif.getPropertyInfo();
            sb.append("\r\n /**  \r\n    *设置 :" + pi.getRemark() + "\r\n     */\r\n");
            sb.append(" public void set" + StringUtils.capitalize(pi.getName()) + "(" + pi.getClassName() + " "
                    + pi.getName() + ") {\r\n");
            sb.append("     this." + pi.getName() + " = " + pi.getName() + ";\r\n");
            sb.append(" }\r\n");
            sb.append("\r\n /**  \r\n    *获取 :" + pi.getRemark() + "\r\n     */\r\n");
            if ("boolean".equalsIgnoreCase(pi.getClassName())) {
                sb.append(" public " + pi.getClassName() + " is" + StringUtils.capitalize(pi.getName()) + "() {\r\n");
            } else {
                sb.append(" public " + pi.getClassName() + " get" + StringUtils.capitalize(pi.getName()) + "() {\r\n");
            }
            sb.append("     return this." + pi.getName() + ";\r\n");
            sb.append(" }\r\n");
        }

        Set set = modelProMap.keySet();
        Iterator it = set.iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            getMetStr(key, sb);
        }
        return sb.length() > 0 ? sb.toString() : null;
    }

    @Override
    public String getClassName() {
        return this.className;
    }

    @Override
    public String getIdCol() {
        return this.idCol;
    }

    @Override
    public String getIdPro() {
        return this.idPro;
    }

    @Override
    public String getDtoClassBody() {
        StringBuilder proStr = new StringBuilder();
        StringBuilder metStr = new StringBuilder();
        for (Entry<String, TypeHandler> entry : dtoProMap.entrySet()) {
            proStr.append(entry.getValue().getProStr());
            metStr.append(entry.getValue().getMetStr());
        }
        return proStr.toString() + "\r\n" + metStr.toString();
    }

    public String getDtoSavePath() {
        return getSavePath() + "Dto\\";
    }

    public String getAuthorStr() {
        return System.getProperty("user.name");
    }

    public String getMetStr(String key, StringBuffer sb) {
        sb.append("\r\n /**  \r\n    *获取 :" + key + "Before\r\n  */\r\n");
        sb.append("    public Date get" + StringUtils.capitalize(key) + "Before() {\r\n");
        sb.append("        return this." + key + "Before;\r\n");
        sb.append("    }\r\n");
        sb.append("\r\n /**  \r\n    *设置 :" + key + "Before\r\n  */\r\n");
        sb.append("    public void set" + StringUtils.capitalize(key) + "Before(Date " + key + "Before) {\r\n");
        sb.append("        this." + key + "Before = " + key + "Before;\r\n");
        sb.append("    }\r\n\r\n");
        sb.append("\r\n /**  \r\n    *获取 :" + key + "After\r\n   */\r\n");
        sb.append("    public Date get" + StringUtils.capitalize(key) + "After() {\r\n");
        sb.append("        return this." + key + "After;\r\n");
        sb.append("    }\r\n");
        sb.append("\r\n /**  \r\n    *设置 :" + key + "After\r\n   */\r\n");
        sb.append("    public void set" + StringUtils.capitalize(key) + "After(Date " + key + "After) {\r\n");
        sb.append("        this." + key + "After = " + key + "After;\r\n");
        sb.append("    }\r\n");
        return sb.toString();
    }

    @Override
    public String toString() {
        return "ModelInfo [className=" + className + ", packageName=" + packageName + ", savePath=" + savePath
                + ", mTable=" + mTable + ", fileName=" + fileName + ", remark=" + remark + ", idCol=" + idCol
                + ", idPro=" + idPro + ", idColType=" + idColType + ", idProType=" + idProType + ", cols="
                + Arrays.toString(cols) + ", pros=" + Arrays.toString(pros) + ", jdbcTypes="
                + Arrays.toString(jdbcTypes) + ", javaTypes=" + Arrays.toString(javaTypes) + ", dtoProMap=" + dtoProMap
                + ", modelProMap=" + modelProMap + ", name=" + name + ", sEQName=" + sEQName + ", dtoFileName="
                + dtoFileName + "]";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406

然后,还有一点笔者需要说明一下,就是代码生成器 jdbc类型和数据库类型的对应。 
我们可以统一起来,像什么char可以用varchar或者int代替,bool可以用int代替,浮点型可以用varchar代替 
oracle: 
NUMBER -> Long 
LONG -> Long 
VARCHAR2->String 
Date->Date java.uti.Date

mysql: 
bigint -> Long 
int -> Long 
varchar -> String 
DateTime -> Date java.uti.Date

这样便统一起来了。 
接下来,获取到数据库表和字段的信息后,就要生成代码了,这里笔者就介绍一下如何生成Mapper.xml这个文件的,因为这个代码生成器的东西比较多,无法一一列举,但是核心思想都是一样的。 
首先,必须准备一个模板,也是就是说,你想生成啥,就得准备一个相应的模板。 
mapperXml.ftl.mysql:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="${m.packageName}.${m.className}">

    <resultMap type="${m.resMapClsName}" id="${m.resBeaName}ResultMap">
        ${m.resMapStr}
    </resultMap>

    <insert id="addEntity" parameterType="${m.resMapClsName}" useGeneratedKeys="true" keyProperty="${m.idPro}">
        INSERT INTO ${m.tableName}
          (${m.insertColsStr})
        VALUES
          (${m.insertColsVal})
    </insert>

    <delete id="delEntity" parameterType="long">
        delete from ${m.tableName}
        <where>
            ${m.idCol} = ${m.escape}{${m.idPro}}
        </where>
    </delete>

    <delete id="delBatchEntity" parameterType="String">
        delete from ${m.tableName}
        <where>
            <if test="ids != null">
                ${m.idCol} in 
                (
                    <foreach collection="ids" index="index" separator="," item="item" >
                        ${m.escape}{item}
                    </foreach>
                )
            </if>
        </where>
    </delete>

    <update id="editEntity" parameterType="${m.resMapClsName}">
        update ${m.tableName}
        <set>
            ${m.editSetStr}
        </set>
        where ${m.idCol} = ${m.escape}{${m.idPro}}
    </update>


    <select id="count" resultType="long" parameterType="${m.resMapClsName}">
        SELECT count(1) from ${m.tableName}
        <where>
            ${m.countWhereStr}
        </where>
    </select>

    <select id="list" resultMap="${m.resBeaName}ResultMap" parameterType="${m.resMapClsName}">
        SELECT 
            ${m.listColsStr}
        FROM
            ${m.tableName} t
        <where> 
            ${m.listWhereStr}
        </where>
        <if test="sort !=null and sort !=''">
            ORDER BY ${m.escapeNew}{sort} ${m.escapeNew}{order}
        </if>
    </select>

    <select id="getEntityById" parameterType="long" resultType="${m.resMapClsName}">
        SELECT 
            ${m.listColsStr}
        FROM ${m.tableName} t
        WHERE ${m.idCol} = ${m.escape}{${m.idPro}}
    </select>
</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

然后,${}中的内容就是要使用freemark这个jar来为我们实现,这里只要按照它的方法进行操作,便可将这些数据填充进去。其实,$中的m代表一个传入进来的对象,m.后边的东西就是此对象的属性或者方法。 
下面,我们来看看相应的代码:

package com.codegenerator.framework.model;

import com.codegenerator.core.utils.ConfigUtil;
import com.codegenerator.framework.flt.service.MapperFtlService;

public class MapperInfo implements MapperFtlService {
    private String className;
    private String packageName;
    private String savePath;
    private String xmlSavePath;
    private String fileName;
    private String remark;
    private ModelInfo modelInfo;

    public static MapperInfo loadFrom(ModelInfo modelInfo) {
        MapperInfo mapInfo = new MapperInfo();
        mapInfo.setSavePath(ConfigUtil.getConfig("mapperSavePath"));
        mapInfo.setXmlSavePath(ConfigUtil.getConfig("mapperXmlSavePath"));
        mapInfo.setPackageName(ConfigUtil.getConfig("mapperPackage"));
        mapInfo.setModelInfo(modelInfo);
        return mapInfo;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public ModelInfo getModelInfo() {
        return modelInfo;
    }

    @Override
    public String getXmlFileName() {
        return getFileName().replace("Mapper.java", "Mapper.xml");
    }

    @Override
    public String getPackageStr() {
        return "package " + getPackageName() + ";";
    }

    // @Override
    // public String getResMapStr() {
    // StringBuffer sb = new StringBuffer();
    // sb.append("<id property=\""+getIdPro()+"\" column=\""+getIdCol()+"\"
    // />\r\n");
    // String[] cols = this.modelInfo.getCols();
    // String[] pros = this.modelInfo.getPros();
    // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
    // int len = cols.length;
    // for(int i=0;i<len;i++){
    // if(pros[i] !=null){
    // sb.append(" <result property=\""+pros[i]+"\" column=\""+cols[i]+"\"
    // />\r\n");
    // }
    // }
    // return sb.toString();
    // }

    @Override
    public String getResMapStr() {
        StringBuffer sb = new StringBuffer();
        sb.append("<id property=\"" + getIdPro() + "\" column=\"" + getIdPro() + "\" />\r\n");
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            if (pros[i] != null) {
                sb.append("     <result property=\"" + pros[i] + "\" column=\"" + pros[i] + "\" />\r\n");
            }
        }
        return sb.toString();
    }

    @Override
    public String getTableName() {
        return this.modelInfo.getmTable().getName();
    }

    @Override
    public String getSeqName() {
        return this.modelInfo.getsEQName();
    }

    @Override
    public String getInsertColsStr() {
        StringBuffer sb = new StringBuffer();
        //判断数据库
        String db = ConfigUtil.getConfig("db");
        //mysql是不需要加主键
        if ("oracle".equalsIgnoreCase(db)) {
            sb.append(getIdCol());
        }

        String[] cols = this.modelInfo.getCols();
        // String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        // String[] javaTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            if (cols[i] != null) {
                if (i == 0) {
                    sb.append(cols[i]);
                } else {
                    sb.append("," + cols[i]);
                }
            }
        }
        return sb.toString();
    }

    @Override
    public String getInsertColsVal() {
        StringBuffer sb = new StringBuffer();
        //判断数据库
        String db = ConfigUtil.getConfig("db");
        //mysql是不需要加主键
        if ("oracle".equalsIgnoreCase(db)) {
            sb.append("#{" + this.modelInfo.getIdPro() + "}");
        }
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
//        String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        // String[] javaTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            if (pros[i] != null) {
                if (i == 0) {
                    sb.append("#{" + pros[i] + "}");
                } else {
                    sb.append("," + "#{" + pros[i] + "}");
                }

            }
        }
        return sb.toString();
    }

    @Override
    public String getDelWhereStr() {
        StringBuffer sb = new StringBuffer();
        sb.append("<if test=\"" + getIdPro() + " != null\">");
        sb.append(getIdCol() + " = #{" + getIdPro() + "}");
        sb.append("</if>\r\n");
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        // String[] javaTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            String handStr = null;
            if (this.modelInfo.getDtoProMap().containsKey(cols[i])) {
                handStr = this.modelInfo.getDtoProMap().get(cols[i]).getWhereStr("          ", null);
            }
            if (handStr != null) {
                sb.append(handStr);
            } else {
                sb.append("         <if test=\"" + pros[i] + " != null\">");
                sb.append(" AND " + cols[i] + " = #{" + pros[i] + "}");
                sb.append("</if>\r\n");
            }
        }
        return sb.toString();
    }

    @Override
    public String getIdCol() {
        return this.modelInfo.getIdCol();
    }

    @Override
    public String getIdPro() {
        return this.modelInfo.getIdPro();
    }

    @Override
    public String getEscape() {
        return "#";
    }

    @Override
    public String getEscapeNew() {
        return "$";
    }

    @Override
    public String getEditSetStr() {
        StringBuffer sb = new StringBuffer();
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        // String[] javaTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            if (pros[i] != null) {
                sb.append((i == 0 ? "" : "          ") + "<if test=\"" + pros[i] + " != null\">" + cols[i] + "=#{"
                        + pros[i] + "}" + (i == (len - 1) ? "" : ",") + "</if>\r\n");
            }
        }
        return sb.toString();
    }

    @Override
    public String getEditsSetStr() {
        StringBuffer sb = new StringBuffer();
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        // String[] javaTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            sb.append((i == 0 ? "" : "          ") + "<if test=\"" + getMbeanName() + "." + pros[i] + " != null\">"
                    + cols[i] + "=#{" + getMbeanName() + "." + pros[i] + "}" + (i == (len - 1) ? "" : ",")
                    + "</if>\r\n");
        }
        return sb.toString();
    }

    @Override
    public String getListWhereStr() {
        StringBuffer sb = new StringBuffer();
        sb.append("<if test=\"" + getIdPro() + " != null\">");
        sb.append(getIdCol() + " = #{" + getIdPro() + "}");
        sb.append("</if>\r\n");
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        String[] javaTypes = this.modelInfo.getJavaTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {

            if (cols[i] != null) {

                String handStr = null;
                if (this.modelInfo.getDtoProMap().containsKey(cols[i])) {
                    handStr = this.modelInfo.getDtoProMap().get(cols[i]).getWhereStr("          ", null);
                }
                if (handStr != null) {
                    sb.append(handStr);
                } else {
                  //这里注意,如果属性类型为String类型,才需要加!=''
                    if (javaTypes[i].equalsIgnoreCase("String")) {
                        sb.append("         <if test=\"" + pros[i] + " != null and " + pros[i] + " !='' \">");
                        sb.append(" AND " + cols[i] + " = #{" + pros[i] + "}");
                        sb.append("</if>\r\n");
                    } else {
                        sb.append("         <if test=\"" + pros[i] + " != null\">");
                        sb.append(" AND " + cols[i] + " = #{" + pros[i] + "}");
                        sb.append("</if>\r\n");
                    }
                }
            }
        }
        sb.append("         <if test=\"isExport !=null and isExport =='true'\">\r\n");
        sb.append("              AND t.COMMAND_FILE_ID IN (\r\n");
        sb.append(
                "                   <foreach collection=\"ids\" index=\"index\" separator=\",\" item=\"item\" >\r\n");
        sb.append("                         ${item}\r\n");
        sb.append("                 </foreach>\r\n");
        sb.append("              )\r\n");
        sb.append("         </if>\r\n");

        return sb.toString();
    }

    @Override
    public String getListColsStr() {
        StringBuffer sb = new StringBuffer();
        sb.append("t." + getIdCol() + " AS " + getIdPro() + ",\r\n");
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        // String[] javaTypes = this.modelInfo.getJdbcTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            if (cols[i] != null) {
                sb.append("         t." + cols[i] + " AS " + pros[i] + (i == (len - 1) ? "" : ",\r\n"));
            }
        }
        return sb.toString();
    }

    @Override
    public String getCountWhereStr() {
        StringBuffer sb = new StringBuffer();
        sb.append("<if test=\"" + getIdPro() + " != null\">");
        sb.append(getIdCol() + " = #{" + getIdPro() + "}");
        sb.append("</if>\r\n");
        String[] cols = this.modelInfo.getCols();
        String[] pros = this.modelInfo.getPros();
        // String[] jdbcTypes = this.modelInfo.getJdbcTypes();
        String[] javaTypes = this.modelInfo.getJavaTypes();
        int len = cols.length;
        for (int i = 0; i < len; i++) {
            if (cols[i] != null) {

                String handStr = null;
                if (this.modelInfo.getDtoProMap().containsKey(cols[i])) {
                    handStr = this.modelInfo.getDtoProMap().get(cols[i]).getWhereStr("          ", null);
                }
                if (handStr != null) {
                    sb.append(handStr);
                } else {
                    //这里注意,如果属性类型为String类型,才需要加!=''
                    if (javaTypes[i].equalsIgnoreCase("String")) {
                        sb.append("         <if test=\"" + pros[i] + " != null and " + pros[i] + " !='' \">");
                        sb.append(" AND " + cols[i] + " = #{" + pros[i] + "}");
                        sb.append("</if>\r\n");
                    } else {
                        sb.append("         <if test=\"" + pros[i] + " != null\">");
                        sb.append(" AND " + cols[i] + " = #{" + pros[i] + "}");
                        sb.append("</if>\r\n");
                    }

                }
            }
        }
        return sb.toString();
    }

    @Override
    public String getMclssName() {
        return this.modelInfo.getClassName() + "Dto";
    }

    @Override
    public String getMbeanName() {
        return this.modelInfo.getClassName().toLowerCase();
    }

    @Override
    public String getMclssFullName() {
        return this.modelInfo.getPackageName() + ".dto." + this.modelInfo.getClassName() + "Dto";
    }

    @Override
    public String getResMapClsName() {
        return this.modelInfo.getPackageName() + "." + this.modelInfo.getClassName();
    }

    @Override
    public String getResClsName() {
        return this.modelInfo.getClassName();
    }

    @Override
    public String getResBeaName() {
        String resBeaName = this.modelInfo.getClassName();
        resBeaName = resBeaName.toLowerCase().substring(0, 1) + resBeaName.substring(1);
        return resBeaName;
    }

    @Override
    public String getAuthorStr() {
        return System.getProperty("user.name");
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public void setModelInfo(ModelInfo modelInfo) {
        this.modelInfo = modelInfo;
        if (this.className == null) {
            setClassName(modelInfo.getClassName() + "Mapper");
        }
        if (this.fileName == null) {
            setFileName(modelInfo.getFileName().replace(".java", "Mapper.java"));
        }
        if (this.remark == null) {
            setRemark(modelInfo.getRemark());
        }
    }

    public String getXmlSavePath() {
        return xmlSavePath;
    }

    public void setXmlSavePath(String xmlSavePath) {
        this.xmlSavePath = xmlSavePath;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getSavePath() {
        return savePath;
    }

    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }

    @Override
    public String getImportStr() {
        StringBuilder sb = new StringBuilder();
        sb.append("import " + this.modelInfo.getPackageName() + "." + this.modelInfo.getClassName() + ";\r\n");
        // sb.append("import
        // "+this.modelInfo.getPackageName()+".dto."+this.modelInfo.getClassName()+"Dto;");
        return sb.toString();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426

这个就是传入给m的对象,然后,再来看看是如何传的,首先我们必须把这个model的属性值根据获取的数据库表字段信息给设置好。

package com.codegenerator.framework.service.impl;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import com.codegenerator.core.utils.ConfigUtil;
import com.codegenerator.core.utils.FileUtil;
import com.codegenerator.core.utils.StringUtil;
import com.codegenerator.framework.model.MapperInfo;
import com.codegenerator.framework.service.MapperService;

public class MapperServiceImpl implements MapperService {
    private final static String MAPPER_FTL = "mapper.ftl";
    private final static String MAPPER_XML_FTL = "mapperXml.ftl";
    private final static String MAPPER_XML_FTL_MYSQL = "mapperXml.ftl.mysql";

    @Override
    public String createMapper(MapperInfo mapInfo) {
        String temp = FileUtil.loadFtlStr(MAPPER_FTL, this.getClass());
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("m", mapInfo);
        paramMap.put("time", Calendar.getInstance().getTime());
        String modelStr = StringUtil.getProcessValue(paramMap, temp);
        return modelStr;
    }

    @Override
    public void saveMapper(MapperInfo mapInfo) {
        FileUtil.writeFile(mapInfo.getSavePath(), mapInfo.getFileName(), createMapper(mapInfo));
    }

    @Override
    public String createMapperXml(MapperInfo mapInfo) {
        String temp = null;
        //判断数据库
        String db = ConfigUtil.getConfig("db");
        if ("mysql".equalsIgnoreCase(db)) {
            temp = FileUtil.loadFtlStr(MAPPER_XML_FTL_MYSQL, this.getClass());
        } else {
            temp = FileUtil.loadFtlStr(MAPPER_XML_FTL, this.getClass());
        }
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("m", mapInfo);
        paramMap.put("time", Calendar.getInstance().getTime());
        String modelStr = StringUtil.getProcessValue(paramMap, temp);
        return modelStr;
    }

    @Override
    public void saveMapperXml(MapperInfo mapInfo) {

        FileUtil.writeFile(mapInfo.getXmlSavePath(), mapInfo.getXmlFileName(), createMapperXml(mapInfo));
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

这里我们可以看到有一个put的方法把m放入到map中去了,这个m就是之前的那个对象。然后,我们再来看看StringUtil.getProcessValue(paramMap, temp)这个方法干了啥。

public static String getProcessValue(Map<String, Object> parms, String temp) {
        try {
            Template template = new Template("", new StringReader("<#escape x as (x)!>" + temp + "</#escape>"),
                    configuration);
            StringWriter sw = new StringWriter();
            template.process(parms, sw);
            return sw.toString();
        } catch (Exception ex) {
            return null;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这个就是利用了freemarker的功能,它会自动将属性值以及方法返回的值替换到${m.*}对应的地方。 
接下来,只要将此得到的String写入文件即可。 
好了,核心的步骤就说到这儿啦。不同的项目框架,都要修改模板和相应的代码,所以此代码生成器也有它的局限性,但是核心的思想是一样的。 
这个项目代码,笔者的主管好像放在taocode上共享了,叫codeGenarator吧,有兴趣的小伙伴可以去了解下。

转自:http://blog.youkuaiyun.com/qiyongkang520/article/details/50822010


里面的properties文件内容直接考过来出现显示不了汉字可以如

下处理:


eclipse的.properties文件,默认的编码方式是iso-8859-1.

所以中文显示有问题。


按照下面的方式,把Default Encoding修改成UTF-8就可以了。





Java培训:自定义代码生成器 需求:遍历学生集合,显示集合总条数,id不要逗号隔开,显示学生的生日(只显示年月日),钱包显示整数并显示单位`元`,用户姓名做脱敏处理(如果是两个字第二个字显示为星号,例如张三显示为`张*`,如果大于两个字,中间字显示为星号,例如成吉思汗显示为`成*汗`,诸葛亮显示为`诸*亮`)在代码中可以由JDBC的Connection对象通过getMetaData方法获取而来,主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等。存着其他数据库的信息。 阅读详情

相关推荐

Java代码生成器:提升开发效率的利器

然而,在使用代码生成器时,我们需要注意正确编写配置文件、定制代码模板,并在生成的代码上进行维护和修改。代码生成器可以根据用户的需求生成各种类型的代码,包括实体类、数据访问对象(DAO)、业务逻辑层(Service)、控制器(Controller)等。在软件开发过程中,代码的编写是一个耗时且容易出错的任务。在实际使用时,可以根据项目的需求进行配置文件的修改,以生成所需的代码。执行代码生成器后,它将根据配置文件中的信息连接到数据库,分析表结构,然后自动生成实体类、DAO接口和Mapper映射文件等代码。

IulGrads的博客 637

Java代码一键生成神器,支持Jpa/Mybatis/plus多种ORM框架,亲测好用

基于模板引擎实现,具有非常高的自由度,可随意修改为适合你的代码风格

欢迎光临 6947

Java字符生成器简单例子:打造个性化的文本工具

通过使用随机选择的形容词和名词,我们可以生成个性化的字符。你可以根据自己的需求扩展和改进这个例子,以满足特定的文本生成需求。在Java编程中,字符生成器是一种非常实用的工具,它可以帮助你生成具有个性化的文本内容。本文将介绍一个简单的Java字符生成器例子,并提供相应的源代码。这是一个简单的例子,但你可以根据自己的需求扩展和改进字符生成器。你可以增加更多的形容词和名词,或者根据特定的主题定制字符生成器,以生成特定类型的字符。方法将随机选择一个形容词和一个名词,并将它们拼接起来返回一个生成的字符。

ByteEchoX的博客 140

Java代码生成器(开源版本)

Java代码生成器,在线代码生成器,Mybatis代码生成器,开源Java代码生成器

欢迎光临 1462

ThinkPad T14 Gen 2与T14P系列对比

表格您的需求推荐机型日常办公、出差、文档处理、视频会议✅(够用、轻便、便宜)视频剪辑、3D建模、编程编译、AI训练、高色准设计✅(性能强、屏幕好、扩展佳)想要未来 5 年不换机✅T14p预算低于 5000 元✅T14 Gen 2(或考虑 T14 Gen 3/4)T14p 2025 款 ≠ 小改款,而是架构级升级它从“高性能笔记本”进化为“AI 移动工作站”,核心差异在于NPU + Ultra 平台 + 全面屏显 + 超长续航。如果您从事AI 开发、视频创作、工程仿真、多任务编程。

tecoes的博客 2752

方差迭代计算公式

方差迭代计算过程推导术语约定递推公式过程推导 术语约定 (1)En=1n∑i=1nxi E_n =\frac{1}{n} \sum_{i=1}^{n}x_i \tag{1} En​=n1​i=1∑n​xi​(1) (2)F(n)=∑i=1n(x2−En) F(n) = \sum_{i=1}^{n}{(x^2-E_n)} \tag{2} F(n)=i=1∑n​(x2−En​)(2) (3)V(n)...

weixin_44479136的博客 7921

java字符生成器_Java实现简单字符生成器代码例子

创建成功的字符串对象,其长度是固定的,内容是不能被修改和编辑。虽然使用"+"可以达到增加新字符或字符串的目的,但"+"会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。J2SE自5.0增加了可变的字符序列String-Builder类,大大地提高了频繁增加字符串的效率。下面看个简单的例子。public class Jerque {/**...

weixin_39683021的博客 125

【BlueZ】编译产物详解:可执行文件/库文件/工具的生成路径与用途

BlueZ二次开发编译产物机制解析 摘要:在BlueZ蓝牙协议栈二次开发中,90%的报错源于对编译产物类型和路径的混淆。本文系统剖析BlueZ的三阶段编译机制:1)配置阶段生成Makefile;2)编译阶段在.libs目录下产生临时库和可执行文件(不可直接运行);3)安装阶段将产物部署到系统标准路径。重点解析守护进程、命令行工具、动态库的核心路径差异,并针对五大高频问题(如临时库运行崩溃、动态库不匹配、系统覆盖等)给出解决方案。

byte轻骑兵的技术小窝 1万+

java字符生成器,Java实现简单字符生成器代码例子

创建成功的字符串对象,其长度是固定的,内容是不能被修改和编辑。虽然使用"+"可以达到增加新字符或字符串的目的,但"+"会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。J2SE自5.0增加了可变的字符序列String-Builder类,大大地提高了频繁增加字符串的效率。下面看个简单的例子。?字符串1消耗时间:1210字符串2消耗时间:3...

weixin_30709043的博客 172

LVGL hal disp(porting display)

LVGL本身是没有对接最终的显示框架的,所以到具体的某个平台上,需要自行porting。

Bigan(安)的博客 2097

04 HCM CPI SF集成-员工集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 146

idea生成代码(二):实现java语言的增删改查功能(基于mybatis-plus代码生成器)自定义模板【非常简单】

Velocity引擎模板 < dependency > < groupId > org.apache.velocity < artifactId > velocity-engine-core < version > 2.2

lh155136的博客 8252

结构化数据特征构建神器openfe的实战代码

最近订阅专栏的几位同学一起参加了AI比赛,该比赛的数据形式是结构化的。随着特征和模型的不断迭代优化,达到了一个难以跨越的瓶颈。希望我能够给出一些有效的方法,帮助他们提高成绩。在个人的调研和体验后,向他们推荐了结构化数据特征构建神器openfe,最终也帮助他们提升了十来名的成绩,个人也感到十分的欣慰。特意写此博客,希望能够帮助更多的同学。 文章目录 1. 安装 2. 实战例子一 3. 实战例子二

herosunly的博客 3万+

JAVA语言设计一个简单的XML文档生成器

JAVA语言设计一个简单的XML文档生成器 最近做了一个公司的笔试题,使用Java语言设计一个简单xml文档生成器,自己尝试写了一遍。 题目 1、设计一个简单的XML文档生成器,它满足以下功能: 1)节点能够添加或者删除其它子节点, 操作同时要保证每个节点只能有一个父节点, 一个节点只能从属于一个父节点; 2) 节点能够获取父节点对象;节点能够获取所有子节点对象。 3)节点有添加或者读取XML属性的操作; 4)当前节点有方法能打印当前节点和所有子节点(包括子孙节点)的内容。 5)XML的encoding方式

weixin_45606029的博客 465

17、深入分析Freebase数据集:特征、挑战与类型系统构建

本文深入分析了Freebase数据集的特征、数据建模的挑战以及类型系统的构建方法。Freebase作为知识图谱的重要资源,以RDF三元组形式提供了丰富的结构化知识。文章重点探讨了反向三元组、中介节点(CVT节点)以及非主题三元组对链接预测任务的影响,并通过实验展示了不同类型处理策略对模型性能的作用。此外,文章详细介绍了如何构建一个显式的类型系统,以提升链接预测的准确性,并展望了未来可能的研究方向。

css33的专栏 290

SAP 替代关系完全替代简介

这里产生了成品物料的计划订单,我们查看计划订单中BOM的变化,如下图可以看到物料的需求仍然落在了优先级为1的这个302300005555这个物料上面,并没有考虑到302300006666的这个库存,和我们理解的MRP的完全替代不一样,按我们的理解需求应该是要落在302300006666这个物料料,但是MRP计算后并没有这样进行分配。最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。

我小时候很黑的博客 1749

java xml xslt_XML和XSLT实现代码生成器

comes from networkXML和XSLT实现代码生成器(I)摘要XML和XSLT为开发WEB应用提供了非常好的解决方案,然而,它们的能力不仅限制在WEB开发上,其实它们提供了很好的基于元数据(meta data)编程的模型,利用XML作为元数据并用XSLT就可以将它转换为任何想要的形式或其他数据。本文第一部分介绍了如何利用Java以及XML和XSLT实现代码生成器功能,,第二部分讨论了...

weixin_36294922的博客 460

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java如何编写网页代码生成器_如何在java中构建简单的代码生成器

对于快速简单的代码生成器:只需将java源代码写入StringBuilder并将其内容转储到.java文件即可.我从未将第三方库用于简单的自动生成器:StringBuilder sourceBuilder = new StringBuilder();sourceBuilder.append("package com.example.beans;\n\n");sourceBuilder.append...

weixin_36082987的博客 152

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Mybatis-Plus代码生成器CodeGenerator

根据官网和项目需要写了个CodeGenerator,一些需要根据自己项目进行更改 package szp.blog.xblog; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomi

qq_38024443的博客 1557

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java代码生成器_想做时间管理大师?你可以试试Mybatis Plus代码生成器

1. 前言对于写Crud的老司机来说时间非常宝贵,一些样板代码写不但费时费力,而且枯燥无味。经常有小伙伴问我,胖哥你怎么天天那么有时间去搞新东西,透露一下秘诀呗。好吧,今天就把Mybatis-plus的代码生成器分享出来,让你也成为一个优秀的时间管理大师。Java程序员danni:全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?​zhuanlan.zhihu.c...

weixin_39605004的博客 160

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

本文转自:https://blog.csdn.net/huangwenyi1010/article/details/71249258 开心一笑 【1.你以为我会眼睁睁的看着你去送死?我会闭着眼睛。2.给你讲个故事,从前有个笨蛋,他非常笨,别人问他问题他只会回答“没有”,这个故事你听过吗?】 视频教程 大家好,我录制的视频《Java之优雅编程之道》已经在...

s297485987的专栏 1474

Mybatis-plus代码生成器的快速使用

前言: 今天搭建项目的使用了Mybatis-plus的代码生成,所以进行一个总结,以便下次使用。官网也有相应教程! Mybatis-plus代码生成器的步骤 这里为了以后能够方便的复用,我把单独创建了一个项目用来生成代码,所以如果想要只在本项目中使用可以忽略创建项目的步骤。 创建项目 导入依赖 <!--mybatis-plus生成代码的依赖--> <dependency> <groupId>com.baomidou</groupId> <

I_AM_MAY的博客 694

mybatisplus代码生成器

mybatisplus代码生成器 1.创建Springboot项目 创建application.properties # 服务端口 server.port=8001 # 服务名 spring.application.name=service-edu # 环境设置:dev、test、prod spring.profiles.active=dev # mysql数据库连接 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.

爱笑的boy的博客 986

使用Velocity模板技术构建代码生成器

Velocity 是一个基于 Java 的模板引擎,它允许任何人仅仅简单的使用模板语言来引用由 Java 代码定义的对象,从而实现界面和 Java 代码的分离,使得界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点。但是在实际应用过程中,Velocity 又不仅仅被用在了 MVC 的架构中。 在如今特别流行的 MVC 架构模式中,软件各个层次的功

肖扬的专栏 1045
上一篇: eclipse的javabean快捷键
下一篇: 利用FreeMarker生成java源代码
ExceptionMapping
博客等级 码龄10年 30粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值