groovy generate entity classes

Needs of the project wrote a generated class, there is a need of change can be looked at.

import java.util.regex.Matcher
import java.util.regex.Pattern
import groovy.sql.Sql

class _genGenTable {

	//需要改动的参数 
	def JDBCNAME = "jdbc:mysql://xxxxx:13306/xxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&nullNamePatternMatchesAll=true&nullNamePatternMatchesAll=true";
	def USERNAME ="root";
	def PASSWORD ='xxx';
	def DIR = "src/main/java/com/xxx/entity/";
	
	
	def TABLE_SCHEMA = "xxxxxx";
	public static void main(String[] args) {
		new _genGenTable()._generateDataBase();
	}

	def _generateDataBase(){
		def fields = [];
		def mySql = _getMySql();
		mySql.eachRow(ALLTABLESQL){
			def typeStr = typeMapping.find {p, t -> p.matcher(it.data_type).find() }.value;
			fields += [[
					name : it.column_name,
					table_name: _getLumpName(it.table_name),
					real_table_name: it.table_name,
					real_data_type: it.data_type,
					extra: it.extra,
					type    : typeStr,
					comment : it.column_comment,
					column_key:it.column_key
				]];
		}
		mySql.close();
		if(fields.empty){
			println("没有对应的表");
			return;
		}
		new File(DIR).deleteDir();
		new File(DIR).mkdir();
		def map = _getTableMap(fields);
		for(m in map){
			new File(DIR, "${m.key}.java").withPrintWriter { out ->
				_generate(out, m.key,m.value);
			}
		}
		println("创建完毕:"+map.size());
		return true;
	}
	def _getMySql(){
		def mySql= Sql.newInstance(JDBCNAME,USERNAME,PASSWORD,"com.mysql.jdbc.Driver");
		return mySql;
	}
	def _getTableMap(fields){
		Map map = new HashMap();
		fields.each() {
			def table_fields = map.get(it.table_name);
			if(table_fields==null){
				table_fields = new ArrayList();
			}
			table_fields.add(it);
			map.put(it.table_name, table_fields);
		}
		return map;
	}

	def _getLumpName(name){
		//包名驼峰
		name = name.toLowerCase();
		Pattern linePattern = Pattern.compile("_(\\w)");
		Matcher matcher = linePattern.matcher(name);
		StringBuffer sb = new StringBuffer();
		while(matcher.find()){
			matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
		}
		matcher.appendTail(sb);
		return sb.toString().substring(0, 1).toUpperCase()+sb.toString().substring(1, sb.toString().length());
	}
	def _getPackageName(isF) {
		def packageName = DIR.toString().replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "");
		if(isF==1){
			return packageName.substring(0, packageName.length()-1)+ ";";
		}
		return packageName.substring(0, packageName.length()-1);
	}
	def _getBasePackageName(isF) {
		def packageName = DIR.toString().replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "");
		if(isF==1){
			return packageName.substring(0, packageName.length()-1)+ ";";
		}
		def pack = packageName.replaceAll("entity", "");
		def value = pack.toString().substring(0, pack.toString().length()-2);
		return value;
	}

	def _generate(out,className, fields) {
		out.println "package ${_getPackageName(1)}"
		out.println ""
		
		out.println "import com.hcloud.entity.base.Mode;"

		Set types = new HashSet()
		
		fields.each() {
			types.add(it.type)
		}
		
		if (types.contains("Date")) {
			out.println "import java.util.Date;"
		}else if (types.contains("InputStream")) {
			out.println "import java.io.InputStream;"
		}
		if (types.contains("BigDecimal")) {
			out.println "import java.math.BigDecimal;"
		}
		
		out.println "import java.util.ArrayList;"
		out.println "import java.util.List;"
		out.println "import com.alibaba.fastjson.annotation.JSONField;"
		
		
		out.println ""
		out.println "public class $className extends Mode {"
		fields.each() {
//			out.println ""

			// 输出注释
			if (isNotEmpty(it.comment)) {
				out.println "\t/**"
				out.println "\t * ${it.comment}"
				out.println "\t */"
			}
			// 输出成员变量
//			out.println "\tprivate ${it.type} ${it.name};\r\n"
		}
		
		def primarykeys = "\t\tList<String> pris = new ArrayList<String>();\r\n";
		def setFields = "\t\tList<String> fields = new ArrayList<String>();\r\n";
		def autokeys = "\t\tList<String> autokeys = new ArrayList<String>();\r\n";
		def table_name = "";
		
		// 输出get/set方法
		fields.each() {
			out.println ""
			
			def fieldType = "";
			
			def itType = it.type.toString();
			def data_type = it.real_data_type.toString();
			if (data_type.contentEquals("date")) {
				fieldType = "getDate";
			}else if (data_type.contentEquals("datetime")) {
				fieldType = "getDateTime";
			}else if (itType.contains("Integer")) {
				fieldType = "getInt";
			}else if (itType.contains("Boolean")) {
				fieldType = "getBoolean";
			}else if (itType.contains("BigDecimal")) {
				fieldType = "get";
			}else if (itType.contains("String")) {
				fieldType = "getStr";
			}
			if(it.column_key.toString().contains("PRI")){
				primarykeys += "\t\tpris.add(\"${it.name}\");";
			}
			if(it.extra.toString().contains("auto_increment")){
				autokeys += "\t\tautokeys.add(\"${it.name}\");";
			}
			setFields += "\t\tfields.add(\"${it.name}\");\r\n";
			table_name = "\"${it.real_table_name}\"";
			
			if (isNotEmpty(it.comment)) {
				out.println "\t/**"
				out.println "\t * 获取${it.comment}"
				out.println "\t */"
			}
			def actionName = "Boolean".equals(it.type.toString()) ? "is" : "get"
			out.println "\t@JSONField(name=\"${it.name}\") "
			out.println "\tpublic ${it.type} ${actionName}${_getLumpName(it.name).capitalize()}() {"
			out.println "\t\treturn ${fieldType}(\"${it.name}\"); "
//			out.println "\t\treturn ${it.name};"
			
			out.println "\t}"
			out.println ""
			
			if (isNotEmpty(it.comment)) {
				out.println "\t/**"
				out.println "\t * ${it.comment}"
				out.println "\t */"
			}
			out.println "\tpublic void set${_getLumpName(it.name).capitalize()}(${it.type} ${it.name}) {"
			out.println "\t\tset(\"${it.name}\", ${it.name});"
			out.println "\t}"
		}
		out.println("");
		//输出构造方法
		out.println "\t@Override"
		out.println "\tpublic void initAttrs() {"
		out.println "${primarykeys} "
		out.println "${setFields}"
		out.println "${autokeys}"
		out.println "\t\tsetPrimarykeys(pris);"
		out.println "\t\tsetFields(fields);"
		out.println "\t\tsetAutokeys(autokeys);"
		out.println "\t\tsetTableName(${table_name});"
		out.println "\t}"
		
		out.println("}");
	}
	def isNotEmpty(content) {
		return content != null && content.toString().trim().length() > 0;
	}
	def ALLTABLESQL = "select * from information_schema.columns where table_schema = '${TABLE_SCHEMA}' ";//查询表结构SQL
	def typeMapping = [
       (~/(?i)bool|bit|tinyint/)                        : "Boolean",
		(~/(?i)int/)                             : "Integer",
		(~/(?i)float|double|decimal|real/)       : "BigDecimal",
		(~/(?i)datetime|timestamp|date|time/)    : "Date",
		(~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
		(~/(?i)/):"String"
	];
}

 

Published 50 original articles · won praise 20 · views 20000 +

Guess you like

Origin blog.csdn.net/lhf214111967/article/details/103732255