- 工作了一段时间,发现自己重复代码很多,不如写一个自动生成爽爽(真正原因其实自己明白),废话少说,注释都在代码里直接上代码吧
package com.qsk.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Scanner;
public class GenEntityUtil {
private final String myProjectPath = "";//空为当前项目路径(也可以自己指定绝对路径)
//数据库连接
private static final String DBNAME = "sjptdb"; //数据库多连接名,英文小写(不生成数据库连接就不用管)
private static final String URL ="jdbc:sqlserver://ip:1433;DatabaseName=";
private static final String NAME = "";
private static final String PASS = "";
private static final String DRIVER ="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private final String tablename = "";//表名
private final String entityName = "IQSRF"; //.java文件名
private final String authorName = "神转子"; //作者名字
private final String baseJavaUrl = "/src/main/java/";
private final String baseResourceUrl = "/src/main/resources/";
private final String COMMPATH = "com.qsk."; //项目总包路径
private final String ymlUrl = "config"; //配置路径,空就表示在resources目录下,否则请填 config
private final String mapperOutPath = "mappers"; //指定mapper.xml生成所在地,这里就放到resource下了
private final String entityPath = COMMPATH + "entity"; //指定实体生成所在包的路径
private final String controllerPath = COMMPATH + "controller"; //指定表现层生成包所在的路径
private final String servicePath = COMMPATH + "service"; //service层地址
private final String serviceImplPath = servicePath + ".impl"; //serviceImpl层地址
private final String mapperPath = COMMPATH + "mapper"; //mapper层地址
private final String configPath = COMMPATH + "core.config"; //配置文件地址
private final String resultPath = COMMPATH + "common.result";
private final String resultName = initUp("DataGridResultInfo"); //公共返回类名(首字母大写)
private final String connConfigPath = ".conndb"; //数据库配置路径(在配置文件地址下)
private final String dataName = ""; //表名注释
private final String requestMappingName = "/cost/"; //controller层跳转路径前缀
private final String divisionSymbol = "_"; //根据某个字符串进行分割
private boolean f_yml = false; //是否生成连接数据库的 yml 文件(建议多数据库连接时使用)生成完之后请关闭,否则会一直生成
private boolean f_dataSource = false; //是否在java中生成连接配置
private boolean f_util = true; //是否需要导入包java.util.*
private boolean f_sql = false; //是否需要导入包java.sql.*
private boolean f_data = true; //是否需要使用 @Data注解
private boolean f_divisionStr = false; //是否替换字段分割符号
private boolean f_generateMapper = true; //是否生成 mapper
private boolean f_service = false; //是否生成 service 服务层
private boolean f_controller = false; //是否生成 Controller 层
private boolean f_layuiHtml = false; //是否生成 layui 的html
private final String layuiUrl = baseResourceUrl +
"static/coststatic/frame/layui"; //配置 layui 文件路径,没有请从官网下载
private boolean f_sql_select = false; //是否需要查询(若不生成layui的html就不用管)
private String[] colnames; //列名数组
private String[] colTypes; //列名类型数组
private int[] colSizes; //列名大小数组
private String dbType;
private final File file = new File("");
private final String projectPath = file.getAbsolutePath();
/*
* g构造函数
*/
public GenEntityUtil(){
//创建连接
Connection con;
//查要生成实体类的表
String sql = "select * from " + tablename;
Statement pStemt = null;
try {
try {
//加载驱动
Class.forName(DRIVER);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
//链接数据库
con = DriverManager.getConnection(URL,NAME,PASS);
DatabaseMetaData metdata = con.getMetaData();
this.dbType = metdata.getDatabaseProductName();
pStemt = (Statement) con.createStatement();
ResultSet rs = pStemt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int size = rsmd.getColumnCount(); //统计列
colnames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
for (int i = 0; i < size; i++) {
colnames[i] = rsmd.getColumnName(i + 1);
colTypes[i] = rsmd.getColumnTypeName(i + 1);
if(colTypes[i].equalsIgnoreCase("date") || colTypes[i].equalsIgnoreCase("timestamp")){
f_util = true;
}
if(colTypes[i].equalsIgnoreCase("blob") || colTypes[i].equalsIgnoreCase("char")){
f_sql = true;
}
colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
}
System.out.println("自动生成中...");
init();
System.out.println("生成成功!");
} catch (SQLException e) {
e.printStackTrace();
} finally{
// try {
// con.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
}
}
private void init() {
if(f_yml) {
initYml();
}
if(f_dataSource) {
initDataSource();
}
InitEntity(colnames,colTypes,colSizes); //生成实体类
//是否生成 mapper
if(f_generateMapper) {
InitMapperService();
InitMapper(colnames,colTypes,colSizes); //生成 mapper.xml
}
if(f_service) {
InitService();
}
if(f_controller) {
InitController();
}
if(f_layuiHtml) {
String path = this.resultPath.replace(".", "/") + "/" + this.resultName;
if(!isFileExists(path)) {
InitResult();
}
}
}
/**
* s生成数据库yml文件
*/
private void initYml() {
String content = parseYml();
String outputPath = baseResourceUrl + this.ymlUrl + "/application-"+ DBNAME.toLowerCase() + ".yml";
commWrite("yml", content, outputPath);
}
/**
* s生成连接数据库java文件
*/
private void initDataSource() {
String dbname = DBNAME.toLowerCase();
String content = parseDataSource();
String dataSourceUrl = baseJavaUrl + this.configPath.replace(".", "/");
String outputPath = dataSourceUrl +"/" + "DataSourceConfig.java";
if(!isFileExists(outputPath)) {
commWrite("数据库连接", content, outputPath);
}else {
content = parseDBConfigAppend();
if(!"".equals(content)) {
commWrite("", content, outputPath);
}
}
String filePath = dataSourceUrl + this.connConfigPath.replace(".", "/") + "/Mybatis" + initUp(dbname) + "Config.java";
if(!isFileExists(filePath)) {
content = parseDBConfig();
commWrite("", content, filePath);
}
}
private String parseDBConfigAppend() {
StringBuffer sb = new StringBuffer();
String thisPath = myProjectPath.equals("") ? this.projectPath : myProjectPath;
File file = new File(thisPath + baseJavaUrl + configPath.replace(".", "/") + "/DataSourceConfig.java");
FileInputStream in = null;
try {
byte[] tembytes = new byte[1024];
int byteread = 0;
in = new FileInputStream(file);
showAvailableBytes(in);
while ((byteread = in.read(tembytes)) != -1) {
String str = new String(tembytes, 0, byteread);
sb.append(str);
}
String str = sb.toString();
if(str.indexOf(DBNAME) == -1) {
int index = str.lastIndexOf("}");
str = str.substring(0 , index) + str.substring(index + 1);
sb = new StringBuffer();
sb.append(str);
appendDataSource(sb);
sb.append("}");
return sb.toString();
};
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
private void showAvailableBytes(InputStream in) {
}
/**
* c初始化实体类
* @param colnames
* @param colTypes
* @param colSizes
*/
private void InitEntity(String[] colnames, String[] colTypes, int[] colSizes) {
String content = parseEntity(colnames,colTypes,colSizes);
String outputPath = baseJavaUrl + this.entityPath.replace(".", "/")+"/"+ entityName + ".java";
commWrite(entityName + "实体类", content, outputPath);
}
/**
* s生成表现层
*/
private void InitController() {
String index = "index";
String rest = "rest";
String path = baseJavaUrl + this.controllerPath.replace(".", "/");
String content = parseControllerIndex();
String outputPath = path + "/" + index + "/" + entityName + "Controller" + initUp(index) + ".java";
commWrite(entityName + "访问表现层", content, outputPath);
content = parseControllerRest();
outputPath = path + "/" + rest + "/" + entityName + "Controller" + initUp(rest) + ".java";
commWrite(entityName + "数据表现层", content, outputPath);
}
/**
* 生成逻辑层接口与业务
*/
private void InitService() {
String content = parseService();
String outputPath = baseJavaUrl + this.servicePath.replace(".", "/")+"/"+ entityName + "Service.java";
commWrite(entityName + "逻辑层接口", content, outputPath);
content = parseServiceImpl();
outputPath = baseJavaUrl + this.serviceImplPath.replace(".", "/")+"/"+ entityName + "ServiceImpl.java";
commWrite(entityName + "逻辑层实现", content, outputPath);
}
/**
* c初始化 Mapper 服务层
*/
private void InitMapperService() {
String content = parseMapperService();
String outputPath = baseJavaUrl + this.mapperPath.replace(".", "/")+"/"+ entityName + "Mapper.java";
commWrite(entityName + "Mapper层", content, outputPath);
}
/**
* c初始化 Mapper
* @param colnames
* @param colTypes
* @param colSizes
*/
private void InitMapper(String[] colnames, String[] colTypes, int[] colSizes) {
String content = parseMapper(colnames,colTypes,colSizes);
String outputPath = baseResourceUrl + this.mapperOutPath +"/"+ entityName + "Mapper" + ".xml";
commWrite(entityName + "Mapper.xml", content, outputPath);
}
/**
* 初始化公共返回类
*/
private void InitResult() {
String content = parseResult();
String outputPath = baseJavaUrl + this.resultPath.replace(".", "/") + "/" + this.resultName + ".java";
commWrite(entityName + "公共返回类", content, outputPath);
}
public void commWrite(String fileName, String content, String outputPath) {
String thisPath = myProjectPath.equals("") ? this.projectPath : myProjectPath;
System.out.println(thisPath);
/*if(isFileExists(outputPath) && !"".equals(fileName)) {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
System.out.print(fileName + "文件已存在!是否重新生成?(Y是,N否)");
String str = scanner.next();
while(str == null || str.equals("")) {
System.out.println();
System.out.print("请重新输入:");
str = scanner.next();
}
if(!str.equalsIgnoreCase("Y")) {
return;
}
}*/
try {
outputPath = thisPath + outputPath;
File directory = new File(outputPath);
if(!directory.getParentFile().exists()) {
directory.getParentFile().mkdirs();
}
FileWriter fw = new FileWriter(outputPath);
PrintWriter pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* s功能:生成 yml 主体代码
* @return
*/
private String parseYml() {
StringBuffer sb = new StringBuffer();
sb.append("spring:\r\n");
sb.append(" datasource:\r\n");
sb.append(" " + DBNAME.toLowerCase() + ":\r\n");
sb.append(" name: " + DBNAME.toLowerCase() + "\r\n");
sb.append(" jdbc-url: " + URL + "\r\n");
sb.append(" username: " + NAME + "\r\n");
sb.append(" password: " + PASS + "\r\n");
//使用druid数据源
sb.append(" type: com.alibaba.druid.pool.DruidDataSource\r\n");
sb.append(" driver-class-name: " + DRIVER + "\r\n");
sb.append(" filters: stat\r\n");
sb.append(" maxActive: 20\r\n");
sb.append(" initialSize: 1\r\n");
sb.append(" maxWait: 60000\r\n");
sb.append(" minIdle: 1\r\n");
sb.append(" timeBetweenEvictionRunsMillis: 60000\r\n");
sb.append(" minEvictableIdleTimeMillis: 300000\r\n");
sb.append(" validationQuery: select 'x'\r\n");
sb.append(" testWhileIdle: true\r\n");
sb.append(" testOnBorrow: false\r\n");
sb.append(" testOnReturn: false\r\n");
sb.append(" poolPreparedStatements: true\r\n");
sb.append(" maxOpenPreparedStatements: 20\r\n");
return sb.toString();
}
/**
* 生成数据库基础配置
* @return
*/
private String parseDataSource() {
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.configPath + ";\r\n\r\n");
sb.append("import javax.sql.DataSource;\r\n\r\n");
sb.append("import org.springframework.boot.context.properties.ConfigurationProperties;\r\n");
sb.append("import org.springframework.boot.jdbc.DataSourceBuilder;\r\n");
sb.append("import org.springframework.context.annotation.Bean;\r\n");
sb.append("import org.springframework.context.annotation.Configuration;\r\n\r\n");
sb.append("@Configuration\r\n");
sb.append("public class DataSourceConfig {\r\n\r\n");
appendDataSource(sb);
sb.append("}");
return sb.toString();
}
private void appendDataSource(StringBuffer sb) {
sb.append(" @Bean(name = \"" + DBNAME.toLowerCase() + "\")\r\n");
sb.append(" @ConfigurationProperties(prefix = \"spring.datasource." + DBNAME.toLowerCase() + "\")\r\n");
sb.append(" public DataSource dataSource" + initUp(DBNAME) + "() {\r\n");
sb.append(" return DataSourceBuilder.create().build();\r\n");
sb.append(" }\r\n");
}
/**
* 生成数据连接主体代码
* @return
*/
private String parseDBConfig() {
StringBuffer sb = new StringBuffer();
String dbname = DBNAME.toLowerCase();
String sqlSessionFactory = "sqlSessionFactory" + dbname;
String transactionManager = dbname + "TransactionManager";
sb.append("package " + this.configPath + this.connConfigPath + ";\r\n\r\n");
sb.append("import javax.sql.DataSource;\r\n\r\n");
sb.append("import org.apache.ibatis.session.SqlSessionFactory;\r\n");
sb.append("import org.mybatis.spring.SqlSessionFactoryBean;\r\n");
sb.append("import org.mybatis.spring.SqlSessionTemplate;\r\n");
sb.append("import org.mybatis.spring.annotation.MapperScan;\r\n");
sb.append("import org.springframework.beans.factory.annotation.Autowired;\r\n");
sb.append("import org.springframework.beans.factory.annotation.Qualifier;\r\n");
sb.append("import org.springframework.context.annotation.Bean;\r\n");
sb.append("import org.springframework.context.annotation.Configuration;\r\n");
sb.append("import org.springframework.core.io.support.PathMatchingResourcePatternResolver;\r\n");
sb.append("import org.springframework.jdbc.datasource.DataSourceTransactionManager;\r\n\r\n");
sb.append("@Configuration\r\n");
sb.append("@MapperScan(basePackages = {\"" + mapperPath + "\"}, sqlSessionFactoryRef = \"" + sqlSessionFactory + "\")\r\n");
sb.append("public class Mybatis" + initUp(dbname) + "Config {\r\n\r\n");
sb.append(" @Autowired\r\n");
sb.append(" @Qualifier(\"" + dbname + "\")\r\n");
sb.append(" private DataSource " + dbname + ";\r\n\r\n");
sb.append(" @Bean\r\n");
sb.append(" public SqlSessionFactory " + sqlSessionFactory + "() throws Exception {\r\n");
sb.append(" SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();\r\n");
sb.append(" factoryBean.setDataSource(" + dbname + ");\r\n");
sb.append(" factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(\"classpath*:" + mapperOutPath + "/*.xml\"));\r\n");
sb.append(" return factoryBean.getObject();\r\n");
sb.append(" }\r\n\r\n");
sb.append(" @Bean\r\n");
sb.append(" public SqlSessionTemplate sqlSessionTemplate" + dbname + "() throws Exception {\r\n");
sb.append(" SqlSessionTemplate template = new SqlSessionTemplate(" + sqlSessionFactory + "());\r\n");
sb.append(" return template;\r\n");
sb.append(" }\r\n\r\n");
sb.append(" @Bean(name = \"" + transactionManager + "\")\r\n");
sb.append(" public DataSourceTransactionManager " + transactionManager + "(@Qualifier(\"" + dbname + "\") DataSource dataSource) {\r\n");
sb.append(" return new DataSourceTransactionManager(dataSource);\r\n");
sb.append(" }\r\n");
sb.append("}\r\n");
return sb.toString();
}
/**
* g功能:生成实体类主体代码
* @param colnames
* @param colTypes
* @param colSizes
* @return
*/
private String parseEntity(String[] colnames, String[] colTypes, int[] colSizes) {
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.entityPath + ";\r\n\r\n");
//判断是否导入工具包
if(f_util) {
sb.append("import java.util.Date;\r\n");
}
if(f_data) {
sb.append("import lombok.Data;\r\n");
}
if(f_sql) {
sb.append("import java.sql.*;\r\n");
}
sb.append("\r\n");
//注释部分
sb.append(" /**\r\n");
sb.append(" * "+ dataName +"\r\n");
sb.append(" * "+ entityName +" 实体类\r\n");
sb.append(" * "+new Date()+" "+this.authorName+"\r\n");
sb.append(" */ \r\n");
//实体部分
sb.append("\r\n");
if(f_data) {
sb.append("@Data");
}
sb.append("\r\npublic class " + this.entityName + " {\r\n");
processAllAttrs(sb);//属性
//processAllMethod(sb);//get set方法
//processAllConstructor(sb); //生成有参和无参构造方法
sb.append("}\r\n");
return sb.toString();
}
/**
* s生成表现层代码
* @return
*/
private String parseControllerIndex() {
String type = "index";
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.controllerPath + "." + type + ";\r\n\r\n");
sb.append("import org.springframework.beans.factory.annotation.Autowired;\r\n");
sb.append("import org.springframework.stereotype.Controller;\r\n");
sb.append("import org.springframework.web.bind.annotation.RequestMapping;\r\n\r\n");
sb.append("import " + this.servicePath + "." + this.entityName + "Service;\r\n\r\n");
sb.append("@Controller\r\n");
sb.append("@RequestMapping(\"" + requestMappingName + "\")\r\n");
sb.append("public class " + this.entityName + "Controller" + initUp(type) + " {\r\n\r\n");
sb.append(" @Autowired\r\n");
sb.append(" private " + this.entityName + "Service " + initLower(this.entityName) + "Service;\r\n\r\n");
sb.append("}\r\n");
return sb.toString();
}
/**
* s生成表现层代码
* @return
*/
private String parseControllerRest() {
String type = "rest";
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.controllerPath + "." + type + ";\r\n\r\n");
sb.append("import org.springframework.beans.factory.annotation.Autowired;\r\n");
sb.append("import org.springframework.web.bind.annotation.RequestMapping;\r\n");
if(importResult()) {
sb.append("import org.springframework.web.bind.annotation.RequestParam;\r\n");
sb.append("import " + this.resultPath + "." + resultName + ";\r\n");
}
sb.append("import org.springframework.web.bind.annotation.RestController;\r\n");
sb.append("import " + this.servicePath + "." + this.entityName + "Service;\r\n\r\n");
sb.append("@RestController\r\n");
sb.append("@RequestMapping(\"" + requestMappingName + "\")\r\n");
sb.append("public class " + this.entityName + "Controller" + initUp(type) + " {\r\n\r\n");
sb.append(" @Autowired\r\n");
sb.append(" private " + this.entityName + "Service " + initLower(this.entityName) + "Service;\r\n\r\n");
allControllerRest(sb);
sb.append("}\r\n");
return sb.toString();
}
private void allControllerRest(StringBuffer sb) {
if(f_sql_select) {
sb.append(" @RequestMapping(\"/selectList\")\r\n");
sb.append(" public " + this.resultName + " getBaseDictList(\r\n");
sb.append(" @RequestParam(\"page\") Integer page,\r\n");
sb.append(" @RequestParam(\"limit\") Integer limit,\r\n");
sb.append(" @RequestParam(value = \"keyword\", required = false) String keyword) {\r\n\r\n");
sb.append(" return " + initLower(this.entityName) + "Service.selectList(\r\n");
sb.append(" page, limit, keyword);\r\n");
sb.append(" }\r\n\r\n");
}
}
/**
* 生成逻辑层接口代码
* @return
*/
private String parseService() {
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.servicePath + ";\r\n\r\n");
sb.append("import java.util.List;\r\n\r\n");
if(importResult()) {
sb.append("import " + this.resultPath + "." + resultName + ";\r\n\r\n");
}
sb.append("import " + this.entityPath + "." + entityName + ";\r\n\r\n");
//注释部分
sb.append(" /**\r\n");
sb.append(" * "+ dataName +"\r\n");
sb.append(" * "+ entityName +" 逻辑层接口\r\n");
sb.append(" * "+new Date()+" "+this.authorName+"\r\n");
sb.append(" */ \r\n");
sb.append("\r\npublic interface " + entityName + "Service {\r\n\r\n");
allService(sb);
sb.append("}\r\n");
return sb.toString();
}
private void allService(StringBuffer sb) {
if(f_sql_select) {
sb.append(" public DataGridResultInfo selectList(");
sb.append("Integer page, Integer limit, String keyword");
sb.append(");\r\n\r\n");
}
}
/**
* 生成逻辑层业务代码
* @return
*/
private String parseServiceImpl() {
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.serviceImplPath + ";\r\n\r\n");
sb.append("import org.springframework.beans.factory.annotation.Autowired;\r\n");
sb.append("import org.springframework.stereotype.Service;\r\n\r\n");
sb.append("import com.github.pagehelper.Page;\r\n");
sb.append("import com.github.pagehelper.PageHelper;\r\n");
if(importResult()) {
sb.append("import " + this.resultPath + "." + resultName + ";\r\n");
}
sb.append("import " + this.entityPath + "." + this.entityName + ";\r\n");
sb.append("import " + this.mapperPath + "." + this.entityName + "Mapper;\r\n");
sb.append("import " + this.servicePath + "." + this.entityName + "Service;\r\n\r\n");
sb.append("@Service\r\n");
sb.append("public class " + this.entityName + "ServiceImpl implements " + this.entityName + "Service {\r\n\r\n");
sb.append(" @Autowired\r\n");
sb.append(" private " + this.entityName + "Mapper " + initLower(this.entityName) + "Mapper;\r\n\r\n");
allServiceImpl(sb);
sb.append("}");
return sb.toString();
}
private void allServiceImpl(StringBuffer sb) {
if(f_sql_select) {
sb.append(" @Override\r\n");
sb.append(" public " + resultName + " selectList(\r\n");
sb.append(" Integer page, Integer limit, String keyword) {\r\n");
sb.append(" " + this.resultName + " " + initLower(this.resultName) + " =\r\n");
sb.append(" " + this.resultName + ".get" + this.resultName + "();\r\n");
sb.append(" try {\r\n");
sb.append(" Page<" + this.entityName + "> pageHelper =\r\n");
sb.append(" PageHelper.startPage(page, limit);\r\n");
sb.append(" "+ initLower(this.entityName) +"Mapper.selectList(keyword);\r\n");
sb.append(" "+ initLower(this.resultName) +".setData(pageHelper.getResult());\r\n");
sb.append(" "+ initLower(this.resultName) +".setTotal((int)pageHelper.getTotal());\r\n");
sb.append(" return "+ initLower(this.resultName) +";\r\n");
sb.append(" } catch (Exception e) {\r\n");
sb.append(" e.printStackTrace();\r\n");
sb.append(" }\r\n\r\n");
sb.append(" return "+ initLower(this.resultName) +";\r\n");
sb.append(" }\r\n");
}
}
/**
* 生成 mapper 服务层主体代码
* @return
*/
private String parseMapperService() {
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.mapperPath + ";\r\n\r\n");//导入包名
sb.append("import java.util.List;\r\n\r\n");
sb.append("import org.apache.ibatis.annotations.Param;\r\n\r\n");
sb.append("import " + this.entityPath + "." + entityName + ";\r\n\r\n");
sb.append(" /**\r\n");
sb.append(" * "+ dataName +"\r\n");
sb.append(" * "+ entityName +" 服务层\r\n");
sb.append(" * "+new Date()+" "+this.authorName+"\r\n");
sb.append(" */ \r\n");
sb.append("\r\npublic interface " + entityName + "Mapper {\r\n");
allMapper(sb);
sb.append("}\r\n");
return sb.toString();
}
/**
* 生成所有的 mapper
* @param sb
*/
private void allMapper(StringBuffer sb) {
if(f_sql_select) {
sb.append("\r\n List<" + this.entityName + "> selectList(\r\n");
sb.append(" @Param(\"keyword\") String keyword\r\n");
sb.append(" );\r\n\r\n");
}
}
/**
* g功能:生成mapper主体代码
* @param colnames
* @param colTypes
* @param colSizes
* @return
*/
private String parseMapper(String[] colnames, String[] colTypes, int[] colSizes) {
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");
sb.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\r\n");
sb.append("<mapper namespace=\"" + mapperPath + "." + entityName + "Mapper\" >\r\n");
sb.append(" <resultMap type=\"" + this.entityPath + "." + entityName + "\" id=\"" + initLower(entityName) + "Map" + "\">\r\n");
processAllResult(sb);
sb.append(" </resultMap>\r\n");
processAllSql(sb);
sb.append("</mapper>\r\n");
return sb.toString();
}
/**
* 生成公共返回类
* @return
*/
private String parseResult() {
StringBuffer sb = new StringBuffer();
//导入包名
sb.append("package " + this.resultPath + ";\r\n\r\n");
sb.append("import java.util.List;\r\n");
sb.append("import java.util.Map;\r\n\r\n");
sb.append("import lombok.Data;\r\n\r\n");
sb.append("@Data\r\n");
sb.append("public class " + this.resultName + " {\r\n\r\n");
sb.append(" private volatile static " + resultName + " " + initLower(resultName) + ";\r\n\r\n");
sb.append(" private " + resultName + "() {}\r\n\r\n");
sb.append(" public static " + this.resultName + " get" + this.resultName + "() {\r\n");
sb.append(" if(" + initLower(this.resultName) + " == null) {\r\n");
sb.append(" synchronized (" + resultName + ".class) {\r\n");
sb.append(" if(" + initLower(this.resultName) + " == null)\r\n");
sb.append(" " + initLower(this.resultName) + " = new " + this.resultName + "();\r\n");
sb.append(" }\r\n");
sb.append(" }\r\n");
sb.append(" return " + initLower(this.resultName) + ";\r\n");
sb.append(" }\r\n\r\n");
sb.append(" private int total;\r\n");
sb.append(" private List rows;\r\n");
sb.append(" private List data;\r\n");
sb.append(" private Object objData;\r\n");
sb.append(" private boolean success;\r\n");
sb.append(" private boolean error;\r\n");
sb.append(" private String msg;\r\n");
sb.append(" private Map<String, ?> dataMap;\r\n");
sb.append(" private String code;\r\n\r\n");
sb.append("}\r\n");
return sb.toString();
}
/**
* 生成所有的 sql 语句
* @param sb
*/
private void processAllSql(StringBuffer sb) {
// 生成查询语句
if(f_sql_select) {
selectList(sb);
}
}
private void selectList(StringBuffer sb) {
sb.append(" <select id=\"selectList\" resultMap=\"" + initLower(entityName) + "Map\">\r\n");
sb.append(" SELECT\r\n");
sb.append(" ");
for (int i = 0; i < colnames.length; i++) {
// 是否替换
if(i == 0) {
sb.append(colnames[i].toUpperCase());
} else if(i % 5 == 0){
sb.append(",\r\n " + colnames[i].toUpperCase());
} else {
sb.append(", " + colnames[i].toUpperCase());
}
}
sb.append("\r\n FROM " + tablename + "\r\n");
sb.append(" <where>\r\n");
sb.append(" <if test=\"keyword != null and keyword != ''\"></if>");
sb.append(" </where>");
sb.append(" </select>\r\n\r\n");
}
/**
* g功能:生成所有result
* @param sb
*/
private void processAllResult(StringBuffer sb) {
String colname = "";
for (int i = 0; i < colnames.length; i++) {
sb.append(" <result column=\"" + colnames[i] + "\" ");
colname = colnames[i].toLowerCase();
if(f_divisionStr) {
colname = replaceSymbol(colname);
}
sb.append("property=\"" + colname + "\" ");
sb.append("jdbcType=\"" + sql2Mybatis(colTypes[i]) + "\" />\r\n");
}
}
/**
* g功能:生成所有属性
* @param sb
*/
private void processAllAttrs(StringBuffer sb) {
String colname = "";
for (int i = 0; i < colnames.length; i++) {
// 是否替换
colname = replaceSymbol(colnames[i].toLowerCase());
sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colname + ";\r\n");
}
//换行
sb.append("\r\n");
}
// 替换符号
private String replaceSymbol(String colname) {
if(f_divisionStr) {
String str = "";
String[] split = colname.split(divisionSymbol);
for (int i = 0; i < split.length; i++) {
if(i > 0) {
str += initUp(split[i]);
} else if(i == 0) {
str += split[i];
}
}
return str;
}
return colname;
}
/**
* g功能:生成所有方法
* @param sb
*/
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colnames.length; i++) {
//生成set方法
sb.append("\tpublic void set" + initUp(colnames[i].toLowerCase()) + "(" + sqlType2JavaType(colTypes[i]) + " " +
colnames[i].toLowerCase() + "){\r\n");
sb.append("\t\tthis." + colnames[i].toLowerCase() + "=" + colnames[i].toLowerCase() + ";\r\n");
sb.append("\t}\r\n\r\n");
//生成get方法
sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initUp(colnames[i].toLowerCase()) + "(){\r\n");
sb.append("\t\treturn " + colnames[i].toLowerCase() + ";\r\n");
sb.append("\t}\r\n\r\n");
}
}
/**
* g功能:生成无参和有参构造方法
* @param sb
*/
private void processAllConstructor(StringBuffer sb){
//生成无参构造方法
sb.append("\tpublic " + entityName + "(){\r\n");
sb.append("\t\tsuper();\r\n");
sb.append("\t}\r\n\r\n");
//生成有参构造函数
sb.append("\tpublic " + entityName + "(");
for (int i = 0; i < colnames.length; i++) {
if(i == colnames.length - 1){
sb.append(sqlType2JavaType(colTypes[i].toLowerCase()) + " " + colnames[i].toLowerCase() + "){\r\n");
}else{
sb.append(sqlType2JavaType(colTypes[i].toLowerCase()) + " " + colnames[i].toLowerCase() + ", ");
}
}
//函数内容
for (int i = 0; i < colnames.length; i++) {
sb.append("\t\tthis." + colnames[i].toLowerCase() + " = " + colnames[i].toLowerCase() + ";\r\n");
}
sb.append("\t}");
//换行
sb.append("\r\n");
}
/**
* g功能:将输入字符串的首字母改成大写
* @param str
* @return
*/
private String initUp(String str) {
char[] ch = str.toCharArray();
if(ch[0] >= 'a' && ch[0] <= 'z'){
ch[0] = (char)(ch[0] - 32);
}
return new String(ch);
}
/**
* g功能:将输入字符串的首字母改成小写
* @param str
* @return
*/
private String initLower(String s){
if(Character.isLowerCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
}
/**
* g功能:获得列的数据类型 ,转化为java中的类型
* @param sqlType
* @return
*/
private String sqlType2JavaType(String sqlType) {
if(this.dbType.indexOf("SQL Server") != -1) {
return sqlServereJavaType(sqlType);
}else if(this.dbType.indexOf("Oracle") != -1) {
return oracleJavaType(sqlType);
}
return "String";
}
private String sqlServereJavaType(String sqlType) {
// TODO Auto-generated method stub
if(sqlType.equalsIgnoreCase("char")
|| sqlType.equalsIgnoreCase("varchar")
|| sqlType.equalsIgnoreCase("nchar")
|| sqlType.equalsIgnoreCase("nvarchar")
|| sqlType.equalsIgnoreCase("ntext")
|| sqlType.equalsIgnoreCase("uniqueidentifier")
|| sqlType.indexOf("varchar") != -1) {
return "String";
}else if(sqlType.equalsIgnoreCase("int")) {
return "int";
}else if(sqlType.equalsIgnoreCase("bigint")) {
return "Long";
}else if(sqlType.equalsIgnoreCase("float")) {
return "double";
}else if(sqlType.equalsIgnoreCase("image")) {
return "char[]";
}else if(sqlType.equalsIgnoreCase("date")
|| sqlType.equalsIgnoreCase("datetime2")) {
return "Date";
}
return "String";
}
private String oracleJavaType(String sqlType) {
// TODO Auto-generated method stub
if(sqlType.equalsIgnoreCase("binary_double")){
return "double";
}else if(sqlType.equalsIgnoreCase("binary_float")){
return "float";
}else if(sqlType.equalsIgnoreCase("blob")){
return "byte[]";
}else if(sqlType.equalsIgnoreCase("blob")){
return "byte[]";
}else if(sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar2")
|| sqlType.equalsIgnoreCase("varchar2")){
return "String";
}else if(sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("timestamp")
|| sqlType.equalsIgnoreCase("timestamp with local time zone")
|| sqlType.equalsIgnoreCase("timestamp with time zone")){
return "Date";
}else if(sqlType.equalsIgnoreCase("number")){
return "Long";
}
return "String";
}
/**
* 数据库类型转换成 mybatis 看得懂的类型
* @param dataType
* @return
*/
private String sql2Mybatis(String dataType) {
if(this.dbType.indexOf("SQL Server") != -1) {
sqlServerMybatis(dataType);
}else if(this.dbType.indexOf("Oracle") != -1) {
return oracleMybatis(dataType);
}
return dataType;
}
private String sqlServerMybatis(String dataType) {
if(dataType.equalsIgnoreCase("char")
|| dataType.equalsIgnoreCase("varchar")
|| dataType.equalsIgnoreCase("nchar")
|| dataType.equalsIgnoreCase("nvarchar")
|| dataType.equalsIgnoreCase("ntext")
|| dataType.equalsIgnoreCase("uniqueidentifier")
|| dataType.indexOf("varchar") != -1) {
dataType = "VARCHAR";
}else if(dataType.equalsIgnoreCase("int")) {
dataType = "INTEGER";
}else if(dataType.equalsIgnoreCase("bigint")) {
dataType = "BIGINT";
}else if(dataType.equalsIgnoreCase("float")) {
dataType = "DOUBLE";
}else if(dataType.equalsIgnoreCase("image")) {
dataType = "LONGVARBINARY";
}else if(dataType.equalsIgnoreCase("date")
|| dataType.equalsIgnoreCase("datetime2")) {
dataType = "DATE";
}
return dataType;
}
private String oracleMybatis(String dataType) {
if (dataType.equalsIgnoreCase("VARCHAR2") ||
dataType.equalsIgnoreCase("CHAR") ||
dataType.equalsIgnoreCase("VARCHAR")) {
dataType = "VARCHAR";
} else if(dataType.equalsIgnoreCase("NUMBER")
|| dataType.equalsIgnoreCase("INT")) {
dataType = "INTEGER";
} else if(dataType.equalsIgnoreCase("DATETIME")) {
dataType = "DATETIME";
} else if(dataType.equalsIgnoreCase("FLOAT")) {
dataType = "DOUBLE";
} else if(dataType.equalsIgnoreCase("CHAR")) {
dataType = "CHAR";
}
return dataType;
}
/**
* 是否引进公共返回类
* @return
*/
private boolean importResult() {
if(f_sql_select) {
return true;
}
return false;
}
private boolean isFileExists(String path) {
String thisPath = myProjectPath.equals("") ? this.projectPath : myProjectPath;
path = thisPath + path;
File file = new File(path);
return file.exists();
}
/**
* c出口
* @param args
*/
public static void main(String[] args) {
new GenEntityUtil();
}
}
- 这个自动生成只针对 springboot,多数据连接,然后准备用 layui 框架进行生成,现在只写完了实体,mapper,service,controller,后面会继续更新生成 layui 界面,最后会进行拆分,组成一个完整的项目
- 用法很简单,给个连接和表名就可以生成实体类,现在只支持 sqlserver 和 oracle,剩下自己看
- 我的项目是 2.1.4 的版本,以下是 sqlserver 和 oracle 的 pom
-
<dependency> <groupId>com.microsoft</groupId> <artifactId>sqljdbc4</artifactId> <version>3.0</version> </dependency>
-
<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>10.2.0.4.0</version> </dependency>