resultMap 生成工具类
时间:2021-08-08
本文章向大家介绍resultMap 生成工具类,主要包括resultMap 生成工具类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
resultMap 生成工具类
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ResultMapGenerator {
/**
* //匹配大写字母的正则
*/
private static Pattern humpPattern = Pattern.compile("[A-Z]");
private static List<String> FIELD_TYPE = new ArrayList<>();
static {
FIELD_TYPE.add("String");
FIELD_TYPE.add("Integer");
FIELD_TYPE.add("String");
FIELD_TYPE.add("Date");
FIELD_TYPE.add("Double");
FIELD_TYPE.add("int");
FIELD_TYPE.add("double");
FIELD_TYPE.add("Float");
FIELD_TYPE.add("Instant");
FIELD_TYPE.add("Boolean");
FIELD_TYPE.add("boolean");
}
/**
* 生成ResultMap
*
* @param clazz 实体类的Class
* @return String
*/
public static String generate(Class<?> clazz) {
String pkgName = clazz.getName();
String clazzName = clazz.getSimpleName();
String resultMapId = Character.toLowerCase(clazzName.charAt(0)) + clazzName.substring(1) + "Map";
StringBuilder resultMap = new StringBuilder();
resultMap.append("<resultMap id=\"");
resultMap.append(resultMapId);
resultMap.append("\" type=\"");
resultMap.append(pkgName);
resultMap.append("\">\n");
result(clazz, resultMap, 1);
resultMap.append("</resultMap>");
return resultMap.toString();
}
public static void result(Class<?> clazz, StringBuilder resultMap, int level) {
Field[] fields = clazz.getDeclaredFields();
// 基础类型
for (Field curField : fields) {
// 设置字段可访问(必须,否则报错)
curField.setAccessible(true);
String property = curField.getName();
Class<?> curFieldType = curField.getType();
if ("serialVersionUID".equals(property)) {
continue;//忽略掉这个属性
}
String curFieldTypeSimpleName = curFieldType.getSimpleName();
if (FIELD_TYPE.contains(curFieldTypeSimpleName)) {
for (int i = 0; i < level; i++) {
resultMap.append("\t");
}
resultMap.append("<result column=\"");
resultMap.append(property2Column(property));
resultMap.append("\" property=\"");
resultMap.append(property);
resultMap.append("\" />\n");
}
}
// 自定义对象
for (Field curField : fields) {
// 设置字段可访问(必须,否则报错)
curField.setAccessible(true);
String property = curField.getName();
Class<?> curFieldType = curField.getType();
String curFieldTypeSimpleName = curFieldType.getSimpleName();
if (!FIELD_TYPE.contains(curFieldTypeSimpleName) && !curFieldType.equals(List.class) && !curFieldType.equals(Collection.class)) {
try {
// 得到泛型里的class类型对象
String className = curFieldType.getName();
if (className.equals(clazz.getName())) {
continue;
}
for (int i = 0; i < level; i++) {
resultMap.append("\t");
}
resultMap.append("<association property=\"");
resultMap.append(property);
resultMap.append("\" javaType=\"");
resultMap.append(className);
resultMap.append("\" >\n");
result(curFieldType, resultMap, level + 1);
for (int i = 0; i < level; i++) {
resultMap.append("\t");
}
resultMap.append("</association>\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
// list
for (Field curField : fields) {
// 设置字段可访问(必须,否则报错)
curField.setAccessible(true);
String property = curField.getName();
Class<?> curFieldType = curField.getType();
if (curFieldType.equals(List.class)) {
Type genericType = curField.getGenericType();
if (null == genericType) {
continue;
}
if (genericType instanceof ParameterizedType) {
try {
ParameterizedType pt = (ParameterizedType) genericType;
// 得到泛型里的class类型对象
Class<?> actualTypeArgument = (Class<?>) pt.getActualTypeArguments()[0];
Object actualType = actualTypeArgument.newInstance();
String className = actualTypeArgument.getName();
if (className.equals(clazz.getName())) {
continue;
}
for (int i = 0; i < level; i++) {
resultMap.append("\t");
}
resultMap.append("<collection property=\"");
resultMap.append(property);
resultMap.append("\" ofType=\"");
resultMap.append(className);
//....actualType字段处理
if (FIELD_TYPE.contains(actualTypeArgument.getSimpleName())) {
resultMap.append("\" column=\"");
resultMap.append(property2Column(property));
resultMap.append("\" >\n");
// 基本类型
for (int i = 0; i < level + 1; i++) {
resultMap.append("\t");
}
resultMap.append("<result column=\"");
resultMap.append(property2Column(property));
resultMap.append("\" />\n");
} else {
resultMap.append("\" >\n");
// 对象
result(Class.forName(actualTypeArgument.getName()), resultMap, level + 1);
}
for (int i = 0; i < level; i++) {
resultMap.append("\t");
}
resultMap.append("</collection>\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/**
* 驼峰转下划线命名
*
* @param property
* @return
*/
private static String property2Column(String property) {
Matcher matcher = humpPattern.matcher(property);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
}
原文地址:https://www.cnblogs.com/purple910/p/15115214.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ACM一年记,总结报告(希望自己可以走得很远)
- 移动端顺序问题上
- [USACO1.5]回文质数 Prime Palindromes
- 移动端上上(transform-translateZ注册)
- [USACO1.3]虫洞wormhole
- HTML--HTML入门篇(我想10分钟入门HTML,可以,交给我吧)
- 移动端初级知识点解析:translateZ translateY rotateY(上上上)
- new String() split详解
- XML--XML从入门到精通 Part 1 认识XML
- css的linear-gradient注意点
- css的linear-gradient
- 第十届山东省赛L题Median(floyd传递闭包)+ poj1975 (昨晚的课程总结错了,什么就出度出度,那应该是叫讨论一个元素与其余的关系)
- css中border-radius
- css的border-radius注意点
- js的join split startsWith endsWith