博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
11.Bean2Document-BEAN转document
阅读量:6207 次
发布时间:2019-06-21

本文共 3414 字,大约阅读时间需要 11 分钟。

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
{ 20 21 //字段前缀 22 private static final char COLUMN_PREFIX = 'F'; 23 //单词分隔符 24 private static final char UNDER_LINE = '_'; 25 //字段属性映射 26 private transient Map
mappedFields; 27 28 private static Map
, Bean2Document> mapperMap = new ConcurrentHashMap<>(); 29 30 public Bean2Document(Class
mappedClass) { 31 initialize(mappedClass); 32 } 33 34 /** 35 * 创建一个新的Bean2Document类 36 * 37 * @param mappedClass 需要映射的实体类 38 */ 39 @SuppressWarnings("unchecked") 40 public static
Bean2Document
newInstance(Class
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
) mapper; 47 } 48 49 /** 50 * 将实体属性初始化到mappedFields中 51 * 52 * @param mappedClass 需要初始化的实体类 53 */ 54 @SuppressWarnings("Duplicates") 55 protected void initialize(Class
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时都带上租户Id113 long tenantId = TenantContext.getCurrent()114 .getTenantId();115 116 document.put("F_TENANT_ID", tenantId);117 return document;118 }119 }

 

转载于:https://www.cnblogs.com/sharpest/p/7868879.html

你可能感兴趣的文章
Atitit.数据采集器 dataspider
查看>>
[Ramda] Pluck & Props: Get the prop(s) from object array
查看>>
Oracle高级查询之CONNECT BY
查看>>
C#进阶系列——WebApi 接口参数不再困惑:传参详解
查看>>
Django 学习笔记之三 数据库输入数据
查看>>
spring错误汇总
查看>>
springboot整合redis
查看>>
JPQL的关联查询
查看>>
Mac安装WineHQ
查看>>
JAVA & Android 等待线程池内任务全部完成后退出
查看>>
spring-boot-starter大力出奇迹
查看>>
sqlitManager
查看>>
mysql使用druid监控配置
查看>>
python操作网站攫取相关链接资源
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
EntityFramework之领域驱动设计实践(七)(转)
查看>>
【jquery模仿net控件】简单分页控件1.0,附上gridview使用测试
查看>>
Spring中的数据源配置
查看>>
在Mac OS X Lion 安装 XCode 3.2
查看>>
Python中的继承
查看>>