zoukankan      html  css  js  c++  java
  • 11.Bean2Document-BEAN转document

    1.

      1 package com.glodon.gspm.adapter.plugin.common;
      2 
      3 import com.glodon.cloudt.tenancy.context.TenantContext;
      4 import org.bson.Document;
      5 import org.springframework.beans.BeanUtils;
      6 import org.springframework.beans.BeanWrapper;
      7 import org.springframework.beans.PropertyAccessorFactory;
      8 import org.springframework.util.StringUtils;
      9 
     10 import java.beans.PropertyDescriptor;
     11 import java.util.HashMap;
     12 import java.util.Map;
     13 import java.util.concurrent.ConcurrentHashMap;
     14 
     15 /**
     16  * 实体对象转Document类
     17  * Created by hezg on 2017/4/4.
     18  */
     19 public class Bean2Document<T> {
     20 
     21     //字段前缀
     22     private static final char COLUMN_PREFIX = 'F';
     23     //单词分隔符
     24     private static final char UNDER_LINE = '_';
     25     //字段属性映射
     26     private transient Map<String, PropertyDescriptor> mappedFields;
     27 
     28     private static Map<Class<?>, Bean2Document> mapperMap = new ConcurrentHashMap<>();
     29 
     30     public Bean2Document(Class<T> mappedClass) {
     31         initialize(mappedClass);
     32     }
     33 
     34     /**
     35      * 创建一个新的Bean2Document类
     36      *
     37      * @param mappedClass 需要映射的实体类
     38      */
     39     @SuppressWarnings("unchecked")
     40     public static <T> Bean2Document<T> newInstance(Class<T> mappedClass) {
     41         Bean2Document mapper = mapperMap.get(mappedClass);
     42         if (mapper == null) {
     43             mapper = new Bean2Document<>(mappedClass);
     44             mapperMap.put(mappedClass, mapper);
     45         }
     46         return (Bean2Document<T>) mapper;
     47     }
     48 
     49     /**
     50      * 将实体属性初始化到mappedFields中
     51      *
     52      * @param mappedClass 需要初始化的实体类
     53      */
     54     @SuppressWarnings("Duplicates")
     55     protected void initialize(Class<T> mappedClass) {
     56         this.mappedFields = new HashMap<>();
     57         PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass);
     58         for (PropertyDescriptor pd : pds) {
     59             if (pd.getWriteMethod() != null) {
     60                 this.mappedFields.put(pd.getName().toUpperCase(), pd);
     61             }
     62         }
     63     }
     64 
     65     /**
     66      * 将实体字段名转换为表字段名
     67      *
     68      * @param name 实体字段
     69      * @return 返回对应表字段名
     70      */
     71     @SuppressWarnings("Duplicates")
     72     private String underscoreName(String name) {
     73         if (!StringUtils.hasLength(name)) {
     74             return "";
     75         }
     76         // 添加字段前缀
     77         StringBuilder result = new StringBuilder();
     78         if (!StringUtils.isEmpty(COLUMN_PREFIX)) {
     79             result.append(COLUMN_PREFIX).append(UNDER_LINE);
     80         }
     81         result.append(name.substring(0, 1).toUpperCase());
     82         for (int i = 1; i < name.length(); i++) {
     83             String ss = name.substring(i, i + 1);
     84             String slc = ss.toUpperCase();
     85             if (ss.equals(slc)) {
     86                 result.append(UNDER_LINE).append(slc);
     87             } else {
     88                 result.append(slc);
     89             }
     90         }
     91         return result.toString();
     92     }
     93 
     94     /**
     95      * 将实体数据格式转换为Document格式
     96      *
     97      * @param data 实体数据
     98      * @return Document格式数据
     99      */
    100     public Document toDocument(T data) {
    101         if (data == null) {
    102             return null;
    103         }
    104 
    105         Document document = new Document();
    106         BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(data);
    107         for (PropertyDescriptor pd : this.mappedFields.values()) {
    108             Object value = bw.getPropertyValue(pd.getName());
    109             String underscoredName = underscoreName(pd.getName());
    110             document.put(underscoredName, value);
    111         }
    112         //Mongo同一接口,所有类转Document时都带上租户Id
    113         long tenantId = TenantContext.getCurrent()
    114                 .getTenantId();
    115 
    116         document.put("F_TENANT_ID", tenantId);
    117         return document;
    118     }
    119 }
  • 相关阅读:
    连接查询
    分组查询
    【转载】C语言 构建参数个数不固定函数
    【转载】vc编译exe的体积最小优化
    VC6微软正则表达式greta使用案例
    MultiByteToWideChar和WideCharToMultiByte
    【转载】VC操作剪切板
    VC/MFC分割字符串(SplitString)返回CStringArray
    【转载】实现UTF8与GB2312编码格式相互转换(VC)已经验证!
    VC6配置sqlite数据库
  • 原文地址:https://www.cnblogs.com/sharpest/p/7868879.html
Copyright © 2011-2022 走看看