generator

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                                http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.whackon.generator</groupId>
	<artifactId>generator-mysql</artifactId>
	<version>1.0.0</version>
	<packaging>jar</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-maven-plugin</artifactId>
					<executions>
						<execution>
							<goals>
								<goal>repackage</goal>
							</goals>
						</execution>
					</executions>
				</plugin>
				<plugin>
					<artifactId>maven-clean-plugin</artifactId>
					<version>3.1.0</version>
				</plugin>
				<plugin>
					<artifactId>maven-resources-plugin</artifactId>
					<version>3.0.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.8.0</version>
				</plugin>
				<plugin>
					<artifactId>maven-surefire-plugin</artifactId>
					<version>2.22.1</version>
				</plugin>
				<plugin>
					<artifactId>maven-jar-plugin</artifactId>
					<version>3.0.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-install-plugin</artifactId>
					<version>2.5.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-deploy-plugin</artifactId>
					<version>2.8.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-site-plugin</artifactId>
					<version>3.7.1</version>
				</plugin>
				<plugin>
					<artifactId>maven-project-info-reports-plugin</artifactId>
					<version>3.0.0</version>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>
server:
  port: 80
spring:
  application:
    name: generator-mysql
  main:
    allow-bean-definition-overriding: true
  thymeleaf:
    cache: false
    encoding: UTF-8
    prefix: classpath:/view/
    suffix: .html

 generatorgenerator

 system.properties

###### Freemarker 模板路径
freemarker.template.path=templates
###### JDBC 连接信息
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url.prefix=jdbc:mysql://
jdbc.url.suffix=?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
package com.whackon.generator.controller;

import com.whackon.generator.pojo.vo.GeneratorVO;
import com.whackon.generator.service.GeneratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <b>生成器控制层类</b>
 * @author Arthur
 * @version 1.0.0
 */
@Controller("generatorController")
public class GeneratorController {
	@Autowired
	private GeneratorService generatorService;
	@Autowired
	private HttpServletRequest request;
	@Autowired
	private HttpServletResponse response;

	/**
	 * <b>转发到首页面</b>
	 * @return
	 * @throws Exception
	 */
	@GetMapping("/")
	public String forwardPage() throws Exception {
		return "generator_index";
	}

	/**
	 * <b>生成代码文件</b>
	 * @param generatorVO
	 * @return
	 * @throws Exception
	 */
	@PostMapping("/generate")
	@ResponseBody
	public boolean createCodeFile(GeneratorVO generatorVO) throws Exception {
		try {
			generatorService.generateCodeFile(generatorVO);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
}
package com.whackon.generator.dao;

import com.whackon.generator.pojo.entity.TableBean;

import java.sql.Connection;
import java.util.List;

/**
 * <b>生成器数据持久层接口</b>
 * @author Arthur
 * @version 1.0.0
 */
public interface GeneratorDao {
	/**
	 * <b>根据数据库名获得该库所有表字段信息</b>
	 * @param dbName
	 * @param connection
	 * @return
	 * @throws Exception
	 */
	List<TableBean> findTableBeanListByDBName(String dbName, Connection connection) throws Exception;
}
package com.whackon.generator.dao.impl;

import com.whackon.generator.dao.GeneratorDao;
import com.whackon.generator.pojo.entity.ColumnProperty;
import com.whackon.generator.pojo.entity.TableBean;
import com.whackon.generator.util.DataTypeUtil;
import com.whackon.generator.util.NameUtil;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * <b>生成器数据持久层接口实现类</b>
 * @author Arthur
 * @version 1.0.0
 */
@Component("generatorDao")
public class GeneratorDaoImpl implements GeneratorDao {
	/**
	 * <b>根据数据库名获得该库所有表字段信息</b>
	 * @param dbName
	 * @param connection
	 * @return
	 * @throws Exception
	 */
	@Override
	public List<TableBean> findTableBeanListByDBName(String dbName, Connection connection) throws Exception {
		List<TableBean> tableBeanList = new ArrayList<TableBean>();
		// 根据数据库名查询所有的数据表信息
		String SQL = "select table_name tableName, table_comment tableComment from information_schema.tables " +
				"where table_schema=?";
		// 使用 Connection 创建 PreparedStatement 对象
		PreparedStatement statement = connection.prepareStatement(SQL);
		statement.setString(1, dbName);
		// 查询获得结果
		ResultSet resultSet = statement.executeQuery();
		while (resultSet.next()) {
			// 创建 TableBean 对象
			TableBean tableBean = new TableBean();
			// 分别设定属性
			tableBean.setTableName(resultSet.getString("tableName"));
			tableBean.setTableComment(resultSet.getString("tableComment"));
			tableBean.setTableAlias(NameUtil.getTableAliasNameFromTable(tableBean.getTableName()));
			tableBean.setBeanName(NameUtil.getBeanNameFromTable(tableBean.getTableName()));

			// 根据数据库表,获得该表的所有字段
			findColPropListByTable(dbName, tableBean, connection);

			tableBeanList.add(tableBean);
		}
		return tableBeanList;
	}

	private void findColPropListByTable(String dbName, TableBean tableBean, Connection connection)
			throws Exception {
		List<ColumnProperty> colPropList = new ArrayList<ColumnProperty>();
		String SQL = "select table_name tableName, column_name columnName, data_type dataType, " +
				"column_comment columnComment from information_schema.columns " +
				"where table_schema=? and table_name=? order by ordinal_position asc";
		// 使用 Connection 创建 PreparedStatement 对象
		PreparedStatement statement = connection.prepareStatement(SQL);
		statement.setString(1, dbName);
		statement.setString(2, tableBean.getTableName());
		// 进行查询
		ResultSet resultSet = statement.executeQuery();
		while (resultSet.next()) {
			ColumnProperty colProp = new ColumnProperty();
			colProp.setColName(resultSet.getString("columnName"));
			colProp.setColDataType(resultSet.getString("dataType"));
			colProp.setColComment(resultSet.getString("columnComment"));
			colProp.setTableName(resultSet.getString("tableName"));
			colProp.setTableAlias(tableBean.getTableAlias());
			colProp.setPropName(NameUtil.getPropertyNameFromColumn(colProp.getColName()));
			DataTypeUtil.getPropertyDataTypeFromColumn(colProp, tableBean);
			colProp.setGetterMethodName("get" + colProp.getPropName().substring(0,1).toUpperCase()
					+ colProp.getPropName().substring(1, colProp.getPropName().length()));
			colProp.setSetterMethodName("set" + colProp.getGetterMethodName().substring(
					3, colProp.getGetterMethodName().length()));
			colProp.setBeanName(tableBean.getBeanName());

			colPropList.add(colProp);
		}

		tableBean.setColPropList(colPropList);
	}
}
package com.whackon.generator.pojo.entity;

import java.io.Serializable;

/**
 * <b>字段属性信息</b>
 */
public class ColumnProperty implements Serializable {
	private String colName;                     // 字段名
	private String colDataType;                 // 字段类型
	private String colComment;                  // 字段注释
	private String tableName;                   // 数据表名
	private String tableAlias;                  // 数据表别名
	private String propName;                    // 属性名
	private String propFullDataType;            // 属性类型全限定名
	private String propShortDataType;           // 属性类型短命
	private String getterMethodName;            // get 方法名
	private String setterMethodName;            // set 方法名
	private String beanName;                    // 实体类名

	public String getColName() {
		return colName;
	}

	public void setColName(String colName) {
		this.colName = colName;
	}

	public String getColDataType() {
		return colDataType;
	}

	public void setColDataType(String colDataType) {
		this.colDataType = colDataType;
	}

	public String getColComment() {
		return colComment;
	}

	public void setColComment(String colComment) {
		this.colComment = colComment;
	}

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	public String getTableAlias() {
		return tableAlias;
	}

	public void setTableAlias(String tableAlias) {
		this.tableAlias = tableAlias;
	}

	public String getPropName() {
		return propName;
	}

	public void setPropName(String propName) {
		this.propName = propName;
	}

	public String getPropFullDataType() {
		return propFullDataType;
	}

	public void setPropFullDataType(String propFullDataType) {
		this.propFullDataType = propFullDataType;
	}

	public String getPropShortDataType() {
		return propShortDataType;
	}

	public void setPropShortDataType(String propShortDataType) {
		this.propShortDataType = propShortDataType;
	}

	public String getGetterMethodName() {
		return getterMethodName;
	}

	public void setGetterMethodName(String getterMethodName) {
		this.getterMethodName = getterMethodName;
	}

	public String getSetterMethodName() {
		return setterMethodName;
	}

	public void setSetterMethodName(String setterMethodName) {
		this.setterMethodName = setterMethodName;
	}

	public String getBeanName() {
		return beanName;
	}

	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}
}
package com.whackon.generator.pojo.entity;

import java.io.Serializable;
import java.util.List;

/**
 * <b>数据表对象实体信息</b>
 */
public class TableBean implements Serializable {
	private static final long serialVersionUID = 1360869488379493240L;
	private String tableName;                       // 数据库表明
	private String tableComment;                    // 数据库表注释
	private String tableAlias;                      // 数据表别名
	private String beanName;                        // 类名
	private boolean hasDate;                        // 是否包含有 Date 类型
	private List<ColumnProperty> colPropList;       // 对应字段属性列表

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	public String getTableComment() {
		return tableComment;
	}

	public void setTableComment(String tableComment) {
		this.tableComment = tableComment;
	}

	public String getTableAlias() {
		return tableAlias;
	}

	public void setTableAlias(String tableAlias) {
		this.tableAlias = tableAlias;
	}

	public String getBeanName() {
		return beanName;
	}

	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}

	public boolean getHasDate() {
		return hasDate;
	}

	public void setHasDate(boolean hasDate) {
		this.hasDate = hasDate;
	}

	public List<ColumnProperty> getColPropList() {
		return colPropList;
	}

	public void setColPropList(List<ColumnProperty> colPropList) {
		this.colPropList = colPropList;
	}
}
package com.whackon.generator.pojo.enums;

/**
 * <b>名称类型枚举信息</b>
 * @author Arthur
 * @version 1.0.0
 */
public enum NameTypeEnum {
	NAME_ENTITY,
	NAME_PROPERTY,
	NAME_GET_METHOD,
	NAME_SET_METHOD
}
package com.whackon.generator.pojo.vo;

import java.io.Serializable;

/**
 * <b>代码生成视图对象</b>
 */
public class GeneratorVO implements Serializable {
	private static final long serialVersionUID = 5342443082452383889L;
	private String dbIP;                        // 数据库连接 IP 地址
	private String dbPort;                      // 数据库连接端口号
	private String dbName;                      // 数据库名
	private String dbUser;                      // 数据库登录用户名
	private String dbPassword;                  // 数据库登录密码
	private String outFolderPath;               // 生成文件文件夹

	public String getDbIP() {
		return dbIP;
	}

	public void setDbIP(String dbIP) {
		this.dbIP = dbIP;
	}

	public String getDbPort() {
		return dbPort;
	}

	public void setDbPort(String dbPort) {
		this.dbPort = dbPort;
	}

	public String getDbName() {
		return dbName;
	}

	public void setDbName(String dbName) {
		this.dbName = dbName;
	}

	public String getDbUser() {
		return dbUser;
	}

	public void setDbUser(String dbUser) {
		this.dbUser = dbUser;
	}

	public String getDbPassword() {
		return dbPassword;
	}

	public void setDbPassword(String dbPassword) {
		this.dbPassword = dbPassword;
	}

	public String getOutFolderPath() {
		return outFolderPath;
	}

	public void setOutFolderPath(String outFolderPath) {
		this.outFolderPath = outFolderPath;
	}
}
package com.whackon.generator.service;

import com.whackon.generator.pojo.vo.GeneratorVO;

/**
 * <b>生成器业务层接口</b>
 * @author Arthur
 * @version 1.0.0
 */
public interface GeneratorService {
	/**
	 * <b>根据用户信息生成代码文件</b>
	 * @param generatorVO
	 * @return
	 * @throws Exception
	 */
	boolean generateCodeFile(GeneratorVO generatorVO) throws Exception;
}
package com.whackon.generator.service.impl;

import com.whackon.generator.dao.GeneratorDao;
import com.whackon.generator.pojo.entity.TableBean;
import com.whackon.generator.pojo.vo.GeneratorVO;
import com.whackon.generator.service.GeneratorService;
import com.whackon.generator.util.ConnectionUtil;
import com.whackon.generator.util.FileUtil;
import com.whackon.generator.util.FreemarkerUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.sql.Connection;
import java.util.List;

/**
 * <b>生成器业务层接口</b>
 * @author Arthur
 * @version 1.0.0
 */
@Component("generatorService")
public class GeneratorServiceImpl implements GeneratorService {
	@Autowired
	private GeneratorDao generatorDao;

	/**
	 * <b>根据用户信息生成代码文件</b>
	 * @param generatorVO
	 * @return
	 * @throws Exception
	 */
	@Override
	public boolean generateCodeFile(GeneratorVO generatorVO) throws Exception {
		// 获得数据库连接对象
		Connection connection = ConnectionUtil.getConnection(generatorVO.getDbIP(), generatorVO.getDbPort()
				, generatorVO.getDbName(), generatorVO.getDbUser(), generatorVO.getDbPassword());
		// 查询数据库信息
		List<TableBean> tableBeanList = generatorDao.findTableBeanListByDBName(generatorVO.getDbName(), connection);
		// 循环数据库表信息,生成相关文件
		for (TableBean tableBean : tableBeanList) {
			// 生成实体类文件
			FileUtil.createFolder(generatorVO.getOutFolderPath() + File.separator + "entity");
			File entityFile = FileUtil.createFile(generatorVO.getOutFolderPath()
					+ File.separator + "entity" + File.separator + tableBean.getBeanName() + ".java");
			FreemarkerUtil.generateCodeFile(tableBean, entityFile, "entity");

			// 生成视图类文件
			FileUtil.createFolder(generatorVO.getOutFolderPath() + File.separator + "vo");
			File voFile = FileUtil.createFile(generatorVO.getOutFolderPath()
					+ File.separator + "vo" + File.separator + tableBean.getBeanName() + "VO.java");
			FreemarkerUtil.generateCodeFile(tableBean, voFile, "vo");

			// 生成 DAO 接口文件
			FileUtil.createFolder(generatorVO.getOutFolderPath() + File.separator + "dao");
			File daoFile = FileUtil.createFile(generatorVO.getOutFolderPath()
					+ File.separator + "dao" + File.separator + tableBean.getBeanName() + "Dao.java");
			FreemarkerUtil.generateCodeFile(tableBean, daoFile, "dao");

			// 生成 Mapper 映射文件
			FileUtil.createFolder(generatorVO.getOutFolderPath() + File.separator + "mapper");
			File mapperFile = FileUtil.createFile(generatorVO.getOutFolderPath()
					+ File.separator + "mapper" + File.separator + tableBean.getBeanName() + ".Mapper.xml");
			FreemarkerUtil.generateCodeFile(tableBean, mapperFile, "mapper");
		}
		return true;
	}
}
package com.whackon.generator.util;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * <b>数据库连接工具类</b>
 * @author Arthur
 * @version 1.0.0
 */
public class ConnectionUtil {
	static {
		try {
			Class.forName(SystemConstants.JDBC_DRIVER);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * <b>根据用户所给定连接信息,获得 Connection 对象</b>
	 * @param dbIP
	 * @param dbPort
	 * @param dbName
	 * @param dbUser
	 * @param dbPassword
	 * @return
	 */
	public static Connection getConnection(String dbIP, String dbPort, String dbName,
	                                       String dbUser, String dbPassword) {
		// 根据用户信息拼接完整的 URL
		//jdbc.driverClass=com.mysql.cj.jdbc.Driver
		//jdbc.url=jdbc:mysql://localhost:3306/ums_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&AllowPublicKeyRetrieval=true
		//jdbc.username=root
		//jdbc.password=1234
		String url = SystemConstants.JDBC_URL_PREFIX + dbIP + ":" + dbPort + "/" + dbName + SystemConstants.JDBC_URL_SUFFIX;

		try {
			// 根据连接信息创建连接对象
			return DriverManager.getConnection(url, dbUser, dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
}
package com.whackon.generator.util;

import com.whackon.generator.pojo.entity.ColumnProperty;
import com.whackon.generator.pojo.entity.TableBean;

/**
 * <b>数据类型工具类</b>
 * @author Arthur
 * @version 1.0.0
 */
public class DataTypeUtil {
	/**
	 * <b>根据数据库字段获得属性类型</b>
	 * @param colProp
	 * @param tableBean
	 */
	public static void getPropertyDataTypeFromColumn(ColumnProperty colProp, TableBean tableBean) {
		if ("int".equalsIgnoreCase(colProp.getColDataType())) {
			colProp.setPropShortDataType("Integer");
			colProp.setPropFullDataType("java.lang.Integer");
		} else if ("varchar".equalsIgnoreCase(colProp.getColDataType())) {
			colProp.setPropShortDataType("String");
			colProp.setPropFullDataType("java.lang.String");
		} else if ("decimal".equalsIgnoreCase(colProp.getColDataType())) {
			colProp.setPropShortDataType("Double");
			colProp.setPropFullDataType("java.lang.Double");
		} else if ("date".equalsIgnoreCase(colProp.getColDataType())
				|| "timestamp".equals(colProp.getColDataType())) {
			colProp.setPropShortDataType("Date");
			colProp.setPropFullDataType("java.util.Date");
			tableBean.setHasDate(true);
		}
	}
}
package com.whackon.generator.util;

import java.io.File;

/**
 * <b>文件操作工具类</b>
 * @author Arthur
 * @version 1.0.0
 */
public class FileUtil {

	/**
	 * <b>根据目录路径创建目录 File 对象</b>
	 * @param folderPath
	 * @return
	 */
	public static File createFolder(String folderPath) {
		try {
			// 根据路径创建 File 对象
			File folder = new File(folderPath);
			if (!folder.exists()) {
				folder.mkdirs();
			}
			return folder;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * <b>根据文件路径创建文件 File 对象</b>
	 * @param filePath
	 * @return
	 */
	public static File createFile(String filePath) {
		try {
			// 根据路径创建 File 对象
			File file = new File(filePath);
			if (!file.exists()) {
				file.createNewFile();
			}
			return file;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
package com.whackon.generator.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.util.ResourceUtils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

/**
 * <b>Freemarker 工具类</b>
 * @author Arthur
 * @version 1.0.0
 */
public class FreemarkerUtil {

	/**
	 * <b>根据用户参数、输出文件夹路径、输出文件和模板生成代码文件</b>
	 * @param param
	 * @param outFile
	 * @param templateName
	 * @return
	 */
	public static boolean generateCodeFile(Object param, File outFile, String templateName) {
		// 创建 Freemarker 的 Configuration 对象
		Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
		try {
			String templatePath = ResourceUtils.getURL("classpath:").getPath()
					+ SystemConstants.FREEMARKER_TEMPLATE_PATH;
			// 加载模板所在路径
			configuration.setDirectoryForTemplateLoading(new File(templatePath));
			// 设置编码格式为 UTF-8
			configuration.setDefaultEncoding("UTF-8");
			// 根据生成所使用的模板名称获得模板对象
			Template template = configuration.getTemplate(templateName + ".ftl");
			// 根据输出文件 File 对象,创建输出流
			BufferedWriter bw = new BufferedWriter(new FileWriter(outFile));
			// 生成代码文件
			template.process(param, bw);
			bw.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
}
package com.whackon.generator.util;

/**
 * <b>名称工具类</b>
 */
public class NameUtil {
	/**
	 * <b>根据数据库表名获得表的别名</b>
	 * @param tableName
	 * @return
	 */
	public static String getTableAliasNameFromTable(String tableName) {
		// 使用 “_” 对数据库表名进行切割
		String[] tableNameArys = tableName.split("_");
		StringBuffer sb = new StringBuffer();
		for (String tableNamePart : tableNameArys) {
			sb.append(tableNamePart.substring(0, 1).toLowerCase());
		}
		return sb.toString();
	}

	/**
	 * <b>根据数据表名获得类名</b>
	 * @param tableName
	 * @return
	 */
	public static String getBeanNameFromTable(String tableName) {
		// 使用 “_” 对数据库表名进行切割
		String[] tableNameArys = tableName.split("_");
		if (tableNameArys.length == 1) {
			// 此时数据表只有一个名字
			return tableName.substring(0,1).toUpperCase() + tableName.substring(1, tableName.length());
		} else {
			// 数据库表有若*分组成
			// 去掉第一个部分的前缀信息
			StringBuffer sb = new StringBuffer();
			for (int i = 1; i < tableNameArys.length; i++) {
				sb.append(tableNameArys[i].substring(0, 1).toUpperCase());
				sb.append(tableNameArys[i].substring(1, tableNameArys[i].length()));
			}
			return sb.toString();
		}
	}

	public static String getPropertyNameFromColumn(String colName) {
		String[] colNameArys = colName.split("_");
		StringBuffer sb = new StringBuffer();
		// 生成属性名
		sb.append(colNameArys[0].substring(0,1).toLowerCase());
		sb.append(colNameArys[0].substring(1,colNameArys[0].length()));
		if (colNameArys.length > 1) {
			for (int i = 1; i < colNameArys.length; i++) {
				sb.append(colNameArys[i].substring(0, 1).toUpperCase());
				sb.append(colNameArys[i].substring(1, colNameArys[i].length()));
			}
		}
		return sb.toString();
	}
}
package com.whackon.generator.util;

import java.util.Properties;

/**
 * <b>系统常量工具类</b>
 * @author Arthur
 * @version 1.0.0
 */
public class SystemConstants {
	private static Properties props = new Properties();

	static {
		try {
			props.load(SystemConstants.class.getClassLoader().getResourceAsStream("props/system.properties"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * <b>Freemarker 模板路径</b>
	 */
	public static final String FREEMARKER_TEMPLATE_PATH = props.getProperty("freemarker.template.path");

	/**
	 * <b>JDBC 连接信息:连接驱动类</b>
	 */
	public static final String JDBC_DRIVER = props.getProperty("jdbc.driver");

	/**
	 * <b>JDBC 连接信息:链接地址前缀</b>
	 */
	public static final String JDBC_URL_PREFIX = props.getProperty("jdbc.url.prefix");

	/**
	 * <b>JDBC 连接信息:链接地址后缀</b>
	 */
	public static final String JDBC_URL_SUFFIX = props.getProperty("jdbc.url.suffix");
}
package com.whackon.generator;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * <b>代码生成器 MySQL 版启动类</b>
 * @author Arthur
 * @version 1.0.0
 */
@SpringBootApplication
public class GeneratorStarter {
	public static void main(String[] args) {
		SpringApplication.run(GeneratorStarter.class, args);
	}
}

 模板

import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * <b>${tableComment}数据持久层接口</b>
 * @author lenovo
 * @version 1.0.0
 */
@Repository
public interface ${beanName}Dao {
	/**
	 * <b>根据查询对象查询列表</b>
	 * @param query
	 * @return
	 * @throws Exception
	 */
	List<${beanName}> findListByQuery(${beanName} query) throws Exception;

	/**
	 * <b>保存对象信息</b>
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	int save(${beanName} entity) throws Exception;

	/**
	 * <b>修改对象信息</b>
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	int update(${beanName} entity) throws Exception;
}
<#if hasDate>
import java.util.Date;
</#if>

/**
 * <b>${tableComment}实体信息</b>
 * @author lenovo
 * @version 1.0.0
 */
public class ${beanName} extends BaseEntity {
<#list colPropList as colProp>
    private ${colProp.propShortDataType} ${colProp.propName};                      // ${colProp.colComment}
</#list>

	public static ${beanName} getEntity(${beanName}VO vo) {
		// 将视图属性切换为实体属性
		${beanName} entity = new ${beanName}();
		// 使用 Spring 的 beanUtils 对普通属性进行切换
		BeanUtils.copyProperties(vo, entity);
		// 切换关联属性


		entity.setStatus(vo.getStatus());
		entity.setCreateAdmin(vo.getCreateAdmin());
		entity.setCreateTime(vo.getCreateTime());
		entity.setUpdateAdmin(vo.getUpdateAdmin());
		entity.setUpdateTime(vo.getUpdateTime());
		return entity;
	}
}
<?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="com.ekgc.medial.clinic.admin.dao.${beanName}Dao">
	<select id="findListByQuery" parameterType="${beanName}" resultMap="resultMap">
		select
		<#list colPropList as colProp>
		    ${tableAlias}.${colProp.colName},
		</#list>
		from
			${tableName} ${tableAlias}
		<where>
			<trim suffixOverrides="and">
            <#list colPropList as colProp>
                <if test="${colProp.propName} != null and ${colProp.propName} != ''">${tableAlias}.${colProp.colName}=<#noparse>#{</#noparse>${colProp.propName}<#noparse>}</#noparse> and </if>
			</#list>
			</trim>
		</where>
	</select>

	<insert id="save" parameterType="${beanName}">
		insert into ${tableName}(
			<trim suffixOverrides=",">
	        <#list colPropList as colProp>
		        <if test="${colProp.propName} != null and ${colProp.propName} != ''">${colProp.colName}, </if>
			</#list>
			</trim>
		) values(
			<trim suffixOverrides=",">
	        <#list colPropList as colProp>
				<if test="${colProp.propName} != null and ${colProp.propName} != ''"><#noparse>#{</#noparse>${colProp.propName}<#noparse>}</#noparse>, </if>
	        </#list>
			</trim>
		)
	</insert>

	<update id="update" parameterType="${beanName}">
		update ${tableName}
		<set>
			<trim suffixOverrides=",">
            <#list colPropList as colProp>
				<if test="${colProp.propName} != null and ${colProp.propName} != ''">${colProp.colName}=<#noparse>#{</#noparse>${colProp.propName}<#noparse>}</#noparse>, </if>
            </#list>
			</trim>
		</set>
		<where>
			<trim suffixOverrides="and">
				<if test="id != null and id != ''">id=<#noparse>#{</#noparse>id<#noparse>}</#noparse> and </if>
			</trim>
		</where>
	</update>

	<resultMap id="resultMap" type="${beanName}">
		<id property="id" javaType="java.lang.String" column="id"/>
    <#list colPropList as colProp>
	    <result property="${colProp.propName}" javaType="${colProp.propFullDataType}" column="${colProp.colName}"/>
	</#list>
	</resultMap>
</mapper>
<#if hasDate>
	import java.util.Date;
</#if>

/**
 * <b>${tableComment}视图信息</b>
 * @author lenovo
 * @version 1.0.0
 */
@ApiModel(value = "急诊功能模块 - ${tableComment}视图信息")
public class ${beanName}VO extends BaseVO {
<#list colPropList as colProp>
	@ApiModelProperty(value = "${colProp.colComment}")
	private ${colProp.propShortDataType} ${colProp.propName};                      // ${colProp.colComment}
</#list>

	public static ${beanName}VO getVO(${beanName} entity) {
		// 将实体属性切换为视图属性
		${beanName}VO vo = new ${beanName}VO();
		// 使用 Spring 的 beanUtils 对普通属性进行切换
		BeanUtils.copyProperties(entity, vo);
		// 切换关联属性



		vo.setStatus(entity.getStatus());
		vo.setCreateAdmin(entity.getCreateAdmin());
		vo.setCreateTime(entity.getCreateTime());
		vo.setUpdateAdmin(entity.getUpdateAdmin());
		vo.setUpdateTime(entity.getUpdateTime());
		return vo;
	}
}
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Title</title>
		<link rel="stylesheet" type="text/css" href="/css/font-awesome.min.css">
		<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
		<script type="application/javascript" src="/js/jquery-3.6.0.min.js"></script>
		<script type="application/javascript" src="/js/bootstrap.min.js"></script>
		<style rel="stylesheet" type="text/css">
			div {
				width: 642px;
				height: 590px;
				border-radius: 30px;
				padding: 50px;
				margin: auto;
				position: absolute;
				top: 0;
				bottom: 0;
				left: 0;
				right: 0;
			}

			caption {
				text-align: center;
			}

			table {
				border-collapse: separate;
				border-spacing: 10px;
			}

			.columntd {
				text-align: right;
				font: bold normal 18px 微软雅黑;
			}
		</style>
		<script type="application/javascript">
			function createFile() {
				var formData = $("#myForm").serialize();
				$.ajax({
					url: "/generate",
					type: "post",
					data: formData,
					dataType: "json",
					success: function (data) {
						if (data) {
							alert("生成成功!");
						} else {
							alert("生成失败!");
						}
					}
				});
			}
		</script>
	</head>
	<body>
		<div>
			<form id="myForm">
				<table>
					<caption>
						<h1>Stupid 代码生成器</h1>
						<span>【MySQL 版 v1.0.0】</span>
					</caption>
					<tr>
						<td class="columntd">
							<span>数据库 IP 地址:</span>
						</td>
						<td>
							<input type="text" id="dbIP" name="dbIP" class="form-control" style="width: 300px;" placeholder="请填写您的数据库连接 IP 地址"/>
						</td>
					</tr>
					<tr>
						<td class="columntd">
							<span>数据库连接端口号:</span>
						</td>
						<td>
							<input type="text" id="dbPort" name="dbPort" class="form-control" style="width: 300px;" placeholder="请填写您的数据库连接端口号"/>
						</td>
					</tr>
					<tr>
						<td class="columntd">
							<span>连接数据库名:</span>
						</td>
						<td>
							<input type="text" id="dbName" name="dbName" class="form-control" style="width: 300px;" placeholder="请填写您要连接的数据库名"/>
						</td>
					</tr>
					<tr>
						<td class="columntd">
							<span>数据库登录用户名:</span>
						</td>
						<td>
							<input type="text" id="dbUser" name="dbUser" class="form-control" style="width: 300px;" placeholder="请填写您的数据库登录用户名"/>
						</td>
					</tr>
					<tr>
						<td class="columntd">
							<span>数据库登录密码:</span>
						</td>
						<td>
							<input type="text" id="dbPassword" name="dbPassword" class="form-control" style="width: 300px;" placeholder="请填写您的数据库登录密码"/>
						</td>
					</tr>
					<tr>
						<td class="columntd">
							<span>生成文件夹路径:</span>
						</td>
						<td>
							<input type="text" id="outFolderPath" name="outFolderPath" class="form-control" style="width: 300px;" placeholder="请填写生成文件的存放路径"/>
						</td>
					</tr>
					<tr>
						<td colspan="2" class="columntd">
							<a href="javascript:createFile();" class="btn btn-success">
								<i class="fa fa-check"></i>&nbsp;
								<span>生成文件</span>
							</a>
						</td>
					</tr>
				</table>
			</form>
		</div>
	</body>
</html>

上一篇:022.集成Mybatis官方代码生成器


下一篇:七、Data Augmentation技巧