ResultMapUtils快速生成mybatis resultMap

2024-08-24 14:48

本文主要是介绍ResultMapUtils快速生成mybatis resultMap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package com.zy.platform.common.core.utils;import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author javachen* @description 根据实体类,生成mybatis的resultMap*/
public class ResultMapUtils {private static Pattern humpPattern = Pattern.compile("[A-Z]");//使用方法,在具体的微服务模块System.out.println(getResultMap(Student.class));public static String getUpdateSelective(Class<?> clazz){Object obj = null;try{obj = clazz.newInstance();}catch (Exception e){return "#Exception.反射生成实体异常#";}String clazzName = clazz.getSimpleName();String resultMapId = Character.toLowerCase(clazzName.charAt(0))+clazzName.substring(1)+"Map";String pkgName = clazz.getName();StringBuilder resultMap = new StringBuilder();resultMap.append("<update id=\"updateSelective\" parameterType=\"");resultMap.append(pkgName);resultMap.append("\">\n");resultMap.append("UPDATE X_TABLE");resultMap.append("\n<set>\n");Field[] fields = clazz.getDeclaredFields();for(Field f : fields){String property = f.getName();String javaType = f.getType().getName();if("serialVersionUID".equals(property)){continue;//忽略掉这个属性}resultMap.append("    <if test=\"");resultMap.append(property+"!=null\">");resultMap.append(property2Column(property).toUpperCase());resultMap.append("=#{"+property+", jdbcType="+javaType2jdbcType(javaType.toLowerCase())+"},</if>\n");}resultMap.append("</set>\n");resultMap.append("where id = #{id,jdbcType=VARCHAR}\n");resultMap.append("</update>");return resultMap.toString();}public static void getInsert(Class<?> clazz){String text = getUpdateSelective(clazz);Pattern p = Pattern.compile("#\\{[^}]+}");Matcher m = p.matcher(text);while (m.find()){System.out.println(m.group()+",");}}/*** 获取表的字段* @param clazz*/public void getColumns(Class<?> clazz){String text = getResultMap(clazz);Pattern p = Pattern.compile("column=[\"\\w\"]+");Matcher m = p.matcher(text);while (m.find()) {Pattern p1 = Pattern.compile("[\"\\w\"]+$");Matcher m1 = p1.matcher(m.group());while (m1.find()) {Pattern p2 = Pattern.compile("[\\w]+");Matcher m2 = p2.matcher(m1.group());while (m2.find()) {System.err.println(m2.group().toUpperCase());}}}}/*** 获取ResultMap* @param clazz 实体类的Class* @return String*/public static String getResultMap(Class<?> clazz){Object obj = null;try{obj = clazz.newInstance();}catch (Exception e){return "#Exception.反射生成实体异常#";}String clazzName = clazz.getSimpleName();String resultMapId = Character.toLowerCase(clazzName.charAt(0))+clazzName.substring(1)+"Map";String pkgName = clazz.getName();StringBuilder resultMap = new StringBuilder();resultMap.append("<resultMap id=\"");resultMap.append(resultMapId);resultMap.append("\" type=\"");resultMap.append(pkgName);resultMap.append("\">\n");Field[] fields = clazz.getDeclaredFields();for(Field f : fields){String property = f.getName();String javaType = f.getType().getName();if("serialVersionUID".equals(property)){continue;//忽略掉这个属性}resultMap.append("    <result column=\"");resultMap.append(property2Column(property).toUpperCase());resultMap.append("\" jdbcType=\"");resultMap.append(javaType2jdbcType(javaType.toLowerCase()));resultMap.append("\" property=\"");resultMap.append(property);resultMap.append("\" />\n");}resultMap.append("</resultMap>");return resultMap.toString();}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();}private static String javaType2jdbcType(String javaType){if(javaType.contains("string")){return "VARCHAR";}else if(javaType.contains("boolean")){return "BIT";}else if(javaType.contains("byte")){return "TINYINT";}else if(javaType.contains("short")){return "SMALLINT";}else if(javaType.contains("int")){return "INTEGER";}else if(javaType.contains("long")){return "BIGINT";}else if(javaType.contains("double")){return "DOUBLE";}else if(javaType.contains("float")){return "REAL";}else if(javaType.contains("date")){return "DATE";}else if(javaType.contains("timestamp")){return "TIMESTAMP";}else if(javaType.contains("time")){return "TIME";}else if(javaType.contains("bigdecimal")){return "DECIMAL";}else{return "未知类型";}}}

这篇关于ResultMapUtils快速生成mybatis resultMap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102784

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅