public class Generator {
private static final String FORMAT_ERROR = "数据格式错误";
/**
* resultMap拼接词缀
*/
private static final String QUOTATION_MARK = "\"";
private static final String RESULT_PREFIX = "<result property=";
private static final String RESULT_COLUMN = " column=";
private static final String RESULT_JDBCTYPE = " jdbcType=";
private static final String RESULT_SUFFIX = "/>";
/**
* jdbc类型映射,java类型 - mybatis类型
*/
private static Map<String, String> jdbcTypeMap;
/**
* 生成resultMap下单行result
*
* @param formatData 格式化数据,格式为 private type field; 只解析field,根据type转换
* @return 格式化结果,格式为 <result property="java_field" column="database_field" jdbcType="JType"></result>
* column为数据库字段,大写字母转换成_ , jdbcType按照MyBatis内置格式转换
*/
public static String singleResultMapGenerator(String formatData) {
if (formatData == null || formatData.length() == 0) return formatData;
//按照空格格式化
String[] splits = formatData.split(" ");
if (splits.length < 2) return FORMAT_ERROR;
//初始化map
initJdbcTypeMap();
StringBuilder result = new StringBuilder(RESULT_PREFIX);
//只取最后两个数据,注意符号;
splits[splits.length - 1] = splits[splits.length - 1].substring(0, splits[splits.length - 1].length() - 1);
result.append(QUOTATION_MARK).append(splits[splits.length - 1]).append(QUOTATION_MARK)
.append(RESULT_COLUMN).append(QUOTATION_MARK).append(humpConvertUnderline(splits[splits.length - 1])).append(QUOTATION_MARK);
if (!jdbcTypeMap.containsKey(splits[splits.length - 2])) {
return FORMAT_ERROR;
}
result.append(RESULT_JDBCTYPE).append(QUOTATION_MARK).append(jdbcTypeMap.get(splits[splits.length - 2])).append(QUOTATION_MARK)
.append(RESULT_SUFFIX);
return result.toString();
}
/**
* 多行resultMap生成result
*
* @param formatData 格式化数据,有标准换行
* @return 有标准换行的result标签
*/
public static String multiResultMapGenerator(String formatData) {
if (formatData == null || formatData.length() == 0) return formatData;
String[] splits = formatData.split("\n");
StringBuilder result = new StringBuilder();
for (String s : splits) {
result.append(singleResultMapGenerator(s)).append("\n");
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(multiResultMapGenerator(" private Integer id;\n" +
" private String applyId;"));
}
/**
* 将驼峰命名转换为下划线命名
*/
private static String humpConvertUnderline(String humpData) {
if (humpData == null || humpData.length() <= 1) return humpData;
StringBuilder result = new StringBuilder();
//寻找变换位置
for (int var1 = 0; var1 < humpData.length(); var1++) {
if ('A' <= humpData.charAt(var1) && humpData.charAt(var1) <= 'Z') {
result.append("_").append((char) (humpData.charAt(var1) + 32));
} else {
result.append(humpData.charAt(var1));
}
}
return result.toString();
}
/**
* 映射初始化,需要时使用
* 初始化,保证原子性
*/
private synchronized static void initJdbcTypeMap() {
if (jdbcTypeMap == null) {
jdbcTypeMap = new HashMap<>();
jdbcTypeMap.put("String", "VARCHAR");
jdbcTypeMap.put("BegDecimal", "DECIMAL");
jdbcTypeMap.put("boolean", "BOOLEAN");
jdbcTypeMap.put("Boolean", "BOOLEAN");
jdbcTypeMap.put("byte", "TINYINT");
jdbcTypeMap.put("Byte", "TINYINT");
jdbcTypeMap.put("short", "SMALLINT");
jdbcTypeMap.put("Short", "SMALLINT");
jdbcTypeMap.put("int", "INTEGER");
jdbcTypeMap.put("Integer", "INTEGER");
jdbcTypeMap.put("long", "LONG");
jdbcTypeMap.put("Long", "LONG");
jdbcTypeMap.put("float", "REAL");
jdbcTypeMap.put("Float", "REAL");
jdbcTypeMap.put("double", "DOUBLE");
jdbcTypeMap.put("Double", "DOUBLE");
jdbcTypeMap.put("byte[]", "BINARY");
jdbcTypeMap.put("Date", "DATE");
jdbcTypeMap.put("Time", "TIME");
jdbcTypeMap.put("Timestamp", "TIMESTAMP");
jdbcTypeMap.put("java.sql.Timestamp", "TIMESTAMP");
jdbcTypeMap.put("Clob", "CLOB");
jdbcTypeMap.put("Blob", "BLOB");
jdbcTypeMap.put("Array", "ARRAY");
jdbcTypeMap.put("Struct", "STRUCT");
jdbcTypeMap.put("Ref", "REF");
jdbcTypeMap.put("URL", "DATALINK");
}
}
}