package com.freetmp.mbg.plugin;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import java.lang.reflect.Field;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.apache.commons.lang3.StringUtils.*;
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
import static org.mybatis.generator.internal.util.messages.Messages.getString;
/**
* 数据库表列名转换插件,根据指定的正则表达式从列名中提取单词元组
* 生成符合Java命名规范的驼峰命名格式
*
* @author Pin Liu
*/
public class ColumnNameConversionPlugin extends PluginAdapter {
public static final String COLUMN_PATTERN_NAME = "columnPattern";
private Pattern columnPattern; //匹配数据库列名的模式
private Field baseColumnsField;
private Field blobColumnsField;
@Override
public boolean validate(List<String> warnings) {
String column = properties.getProperty(COLUMN_PATTERN_NAME);
boolean valid = stringHasValue(column);
//System.out.println(column);
if (valid) {
columnPattern = Pattern.compile(column);
} else {
warnings.add(getString("ValidationError.18", "ColumnNameConversionPlugin", "columnPattern"));
}
return valid;
}
@Override
public void initialized(IntrospectedTable introspectedTable) {
//print("before calculate",introspectedTable.getAllColumns());
convertUseReflect(introspectedTable);
//print("after calculate",introspectedTable.getAllColumns());
}
@SuppressWarnings("unchecked")
protected void convertUseReflect(IntrospectedTable introspectedTable) {
if (baseColumnsField == null || blobColumnsField == null) {
baseColumnsField = FieldUtils.getField(IntrospectedTable.class, "baseColumns", true);
blobColumnsField = FieldUtils.getField(IntrospectedTable.class, "blobColumns", true);
}
List<IntrospectedColumn> introspectedColumns = null;
try {
introspectedColumns = (List<IntrospectedColumn>) baseColumnsField.get(introspectedTable);
convertForAll(introspectedColumns);
//print("after calculate for base", introspectedColumns);
baseColumnsField.set(introspectedTable, introspectedColumns);
introspectedColumns = (List<IntrospectedColumn>) blobColumnsField.get(introspectedTable);
convertForAll(introspectedColumns);
//print("after calculate for blob", introspectedColumns);
blobColumnsField.set(introspectedTable, introspectedColumns);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
protected void convertUseApi(IntrospectedTable introspectedTable) {
convertForAll(introspectedTable.getAllColumns());
}
protected void convertForAll(List<IntrospectedColumn> introspectedColumns) {
if (introspectedColumns != null) {
for (IntrospectedColumn introspectedColumn : introspectedColumns) {
//System.out.println("convert for column " + introspectedColumn + ", JDBC Type Name:"+introspectedColumn.getJdbcTypeName());
introspectedColumn.setJavaProperty(convert(introspectedColumn.getActualColumnName()));
}
}
}
public void print(String title, List<IntrospectedColumn> introspectedColumns) {
System.out.println("*******" + title + "********");
for (IntrospectedColumn column : introspectedColumns) {
System.out.println("ColumnName:" + column.getActualColumnName() + ", PropertyName:" + column.getJavaProperty());
}
}
public String convert(String actualColumnName) {
//System.out.println(actualColumnName);
Matcher matcher = columnPattern.matcher(actualColumnName);
StringBuilder sb = new StringBuilder();
while (matcher.find()) {
String word = matcher.group();
word = removePattern(word, "[^a-zA-Z]"); //去除word中所有非字母字符
sb.append(capitalize(word.toLowerCase()));
}
String result = sb.toString();
//System.out.println(result);
if (isAllUpperCase(result)) { //实际列名全为大写时则全部改为小写
result = result.toLowerCase();
} else {
result = uncapitalize(result);
}
//System.out.println(result);
return result;
}
public Pattern getColumnPattern() {
return columnPattern;
}
public void setColumnPattern(Pattern columnPattern) {
this.columnPattern = columnPattern;
}
}