由于时间长没有参与过mybatis的项目了,发现直接restType映射实体会有值映射不上去的情况,也不想写resultMap,话不多说,工具类奉上。
package com.app.admin.framework.menu.utils;
import com.app.admin.framework.menu.common.ProMenu;
import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author:
* @createTime: 2021/09/22 18:04
* @company:
* @description:
*/
public class MyBatisUtil {
private static Pattern humpPattern = Pattern.compile("[A-Z]");
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 "未知类型";
}
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(getResultMap(ProMenu.class));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118745.html