当前位置: 首页 > news >正文

山东金城建设网站智慧软文网站

山东金城建设网站,智慧软文网站,东营会计信息网官网,网站开发怎么做才有利于seoeasy.server.mapper 介绍 后端开发中&#xff0c;消息转换常见问题 Map 中的数据 转换成实体Bean数组 中的数据 转换成实体BeanServet 中的 param 转换成实体Bean 以上的三个问题是最常见的消息转换困扰。 以Map 举例 常见做法是 手动转换 Map<String,Object> da…

easy.server.mapper 介绍

后端开发中,消息转换常见问题

  • Map 中的数据 转换成实体Bean
  • 数组 中的数据 转换成实体Bean
  • Servet 中的 param 转换成实体Bean

以上的三个问题是最常见的消息转换困扰。

以Map 举例

常见做法是

  1. 手动转换
Map<String,Object> dataMap;
Person person;person.setXX(dataMap.get("XXX"))..................

弊端是 操作繁琐

  1. 采用反射技术实现
   Map<String,Object> dataMap;final Class<Person> personClass = Person.class;Object person = personClass.newInstance();final Field[] fields = personClass.getDeclaredFields();for (Field field : fields) {// 特殊类型if (Modifier.isFinal(field.getModifiers())) {continue;}field.setAccessible(Boolean.TRUE);field.set(person, dataMap.get(field.getName()));}

操作简单,弊端是存在性能消耗

easy.server.mapper
解决实现

final Class<Person> personClass = Person.class;Person person = BeanCopier2Utils.getFullData2Object(Person.class).toMapConverter(dataMap);

操作简单,性能几乎同 手动转换

性能与反射对比

public class ReflectTest {public static boolean warmup = false;private Map<String, Object> data = new HashMap<>();private Map<String, Object> dataMap = new TreeMap<String, Object>() {{put("grep", 1234);put("name", "liaojl");put("age", 26);put("birthday", new Date());put("arr", Arrays.asList("2312", "12423"));put("arr2", data);put("array", new int[]{1, 2, 3});}};private Object[] dataArray = new Object[]{13, "liaojl", 26, new Date(), Arrays.asList("2312", "12423"), data, new int[]{1, 2, 3}};private final ICoreData2Object2<Person> data2Object2 = BeanCopier2Utils.getFullData2Object(Person.class);@org.junit.Ignore@Testpublic void test() throws Exception {testMapCustomize2();testArrayCustomize2();testReflect();warmup = true;testReflect();testMapCustomize2();testArrayCustomize2();}public static final int SIZE = 1000000;private void testMapCustomize2() {final long start = System.currentTimeMillis();Person person;for (int i = 0; i < SIZE; i++) {final Class<Person> personClass = Person.class;person = data2Object2.toMapConverter(dataMap);}final long end = System.currentTimeMillis();if (warmup)System.out.println("testMapCustomize2:" + (end - start));}private void testArrayCustomize2() {final long start = System.currentTimeMillis();Person person = null;for (int i = 0; i < SIZE; i++) {person = data2Object2.toArrayConverter(dataArray);}final long end = System.currentTimeMillis();if (warmup)System.out.println("testArrayCustomize2:" + (end - start));}private void testReflect() throws Exception {final long start = System.currentTimeMillis();for (int i = 0; i < SIZE; i++) {final Class<Person> personClass = Person.class;Object person = personClass.newInstance();final Field[] fields = personClass.getDeclaredFields();for (Field field : fields) {if (Modifier.isFinal(field.getModifiers())) {continue;}Ignore annotation = field.getAnnotation(Ignore.class);if (annotation != null) {continue;}field.setAccessible(Boolean.TRUE);field.set(person, dataMap.get(field.getName()));}}final long end = System.currentTimeMillis();if (warmup)System.out.println("testReflect:" + (end - start));}
}

在这里插入图片描述

easy.mapper性能消耗远远小于反射

easy.mapper 的使用

easy.mapper 介绍

注意项

  • 需要转换的Bean 必须包含一个无参构造方法
  • 需要转换的属性必须包含其Getter 方法
  1. 普通转换
@Data
public class Mapper {private byte b;private Byte b1;private boolean bool;private Boolean bool1;private char c;private Character c1;private short s;private Short s1;private int i;private Integer i1;private long l;private Long l1;private float f;private Float f1;private double d;private Double d1;private Date date;
}
// 转换MAP 到Person 并会对Person父类的属性进行扫描赋值
Person person1 = BeanCopier2Utils.getFullData2Object(Person.class).toMapConverter(dataMap);// 转换MAP 到Person 不会对Person父类的属性进行扫描赋值
Person person2 = BeanCopier2Utils.getData2Object(Person.class).toMapConverter(dataMap);// 转换Servlet 到Person 不会对Person父类的属性进行扫描赋值
Person person3 = BeanCopier2Utils.getFullData2WebObject(Person.class).toHttpServletRequestConverte(servelt);// 转换Servlet 到Person 并会对Person父类的属性进行扫描赋值
Person person4 = BeanCopier2Utils.getData2WebObject(Person.class).toHttpServletRequestConverte(servelt);
  1. 字段忽略
io.github.jinlongliao.easy.server.mapper.core.mapstruct2.annotation.Ignore2

提供 @Ignore2 使用标记的字段在转换时并不会进行赋值操作

demo

public class Person extends Grep implements IAnimal {private static final Logger log = LoggerFactory.getLogger(Person.class);@Ignore@Ignore2private int ignore;
}
  1. 特殊字段转换
  • 字段名称与bean 中属性名不对应
  • 数据类型,双方不匹配
  • 其他特殊类型

easy.mapper 默认对支持所有基础类型及其包装类,String 。详情查看 io.github.jinlongliao.easy.server.mapper.core.mapstruct2.converter.IDataConverter 实现。针对特殊类型转。提供两种转换方案

  • 重写 IDataConverter 实现

io.github.jinlongliao.easy.server.mapper.core.mapstruct2.converter.InnerConverter 接口 ,重写<T> T getT(Class<T> tClass, Object extra, Object data);
针对不支持类型时,会调用此方法,自己仅需要 依据 参数tClass 的类型进行判断 进行返回相应值,参数中的data 为消息中的值

  • 使用 io.github.jinlongliao.easy.server.mapper.core.mapstruct2.annotation.Mapping2
public @interface Mapping2 {/*** @return 映射源名称*/String sourceName() default "";/*** set Method Name* @return*/String putMethod() default "";/*** 针对非基本类型(String,byte,short,int,float,double,long,char)<br/>* 除外需要指定自定义 静态转换函数* eg:* <pre>*     public static Person person(Object obj){*         return (Person)obj;*     }* </pre>** @return 数据强转函数名称*/String converterMethod() default "";/*** @return Class Name* @see {@link Mapping2#converterMethod()}*/Class converterClass() default InnerConverter.class;
}
converterClass 手动指定转换自己的转换类,
converterMethod 设置转换函数的名称  ___ 此函数必须为 public+static ___ 。
putMethod  假设 bean 中的 属性a setter函数 不为 setA 通过 putMethod 可以指定新的setter函数
sourceName 假设 mesaage 中的名字不是属性a 的名字  sourceName 可以指定获取源的名字

提前编译 支持

  1. 手动指定

通过 io.github.jinlongliao.easy.server.mapper.utils.MapperStructConfig可以指定 自动生成消息转换实现的 class 及其源文件

      MapperStructConfig.setDev(true, "./target/", "./target/");
  1. 通过 maven 插件实现 maven-generator-plugin
    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version><configuration><annotationProcessorPaths><annotationProcessorPath><groupId>io.github.jinlongliao</groupId><artifactId>easy.server.mapper</artifactId><version>${project.version}</version></annotationProcessorPath><annotationProcessorPath><groupId>io.github.jinlongliao</groupId><artifactId>easy.server.extend</artifactId><version>${project.version}</version></annotationProcessorPath></annotationProcessorPaths></configuration></plugin><plugin><groupId>io.github.jinlongliao</groupId><artifactId>maven-generator-plugin</artifactId><version>${project.version}</version><executions><execution><phase>compile</phase><goals><goal>java</goal></goals></execution></executions><configuration><arguments><argument>${project.basedir}/target/classes/</argument><argument>${project.basedir}/target/generated-sources/annotations/</argument></arguments></configuration></plugin></plugins></build>

在这里插入图片描述

spring 支持

io.github.jinlongliao.easy.server.mapper.spring.BeanMapperFactoryBean设置spring 托管。既可在 spring 中 使用 IBeanMapper类型 进行操作,IBeanMapper封装了常见的类型操作推荐使用

public interface IBeanMapper {/*** 基于Map 的转换** @param tClass* @param data* @param <T>* @return T*/<T> T mapBeanMapper(Class<T> tClass, Map<String, Object> data);/*** 基于数组 的转换** @param tClass* @param data* @param <T>* @return T*/<T> T arrayBeanMapper(Class<T> tClass, Object[] data);/*** 基于javax.servlet 的转换** @param tClass* @param req* @param <T>* @return T*/<T> T servletBeanMapper(Class<T> tClass, javax.servlet.http.HttpServletRequest req);}

文章转载自:
http://anselm.c7493.cn
http://gadolinium.c7493.cn
http://maltreatment.c7493.cn
http://vacationer.c7493.cn
http://ventriculopuncture.c7493.cn
http://facsimile.c7493.cn
http://bywoner.c7493.cn
http://windpipe.c7493.cn
http://isogyre.c7493.cn
http://impregnable.c7493.cn
http://galleyworm.c7493.cn
http://gharri.c7493.cn
http://inkiyo.c7493.cn
http://legalize.c7493.cn
http://buret.c7493.cn
http://ramapithecine.c7493.cn
http://pasteurise.c7493.cn
http://longsome.c7493.cn
http://rickettsial.c7493.cn
http://polycentric.c7493.cn
http://scream.c7493.cn
http://phenacite.c7493.cn
http://splenic.c7493.cn
http://cockateel.c7493.cn
http://demogorgon.c7493.cn
http://aortography.c7493.cn
http://cytokinin.c7493.cn
http://organise.c7493.cn
http://unusual.c7493.cn
http://amphigenous.c7493.cn
http://clinging.c7493.cn
http://jugular.c7493.cn
http://flyleaf.c7493.cn
http://bydgoszcz.c7493.cn
http://magnetometer.c7493.cn
http://parlay.c7493.cn
http://globosity.c7493.cn
http://phoneuision.c7493.cn
http://pitying.c7493.cn
http://zibelline.c7493.cn
http://superciliary.c7493.cn
http://technologist.c7493.cn
http://remote.c7493.cn
http://glazer.c7493.cn
http://radioprotector.c7493.cn
http://philippopolis.c7493.cn
http://slavonia.c7493.cn
http://smoke.c7493.cn
http://pieceworker.c7493.cn
http://dicty.c7493.cn
http://exploiter.c7493.cn
http://deseam.c7493.cn
http://inconveniency.c7493.cn
http://coralberry.c7493.cn
http://subdeacon.c7493.cn
http://anemochore.c7493.cn
http://luik.c7493.cn
http://pasteurization.c7493.cn
http://vivandiere.c7493.cn
http://icescape.c7493.cn
http://genocidal.c7493.cn
http://arrowroot.c7493.cn
http://pyrolyze.c7493.cn
http://shopworn.c7493.cn
http://paginal.c7493.cn
http://matronymic.c7493.cn
http://mealtime.c7493.cn
http://pully.c7493.cn
http://leftwinger.c7493.cn
http://nepal.c7493.cn
http://wahhabism.c7493.cn
http://emancipatory.c7493.cn
http://satcoma.c7493.cn
http://puissance.c7493.cn
http://maizuru.c7493.cn
http://watertight.c7493.cn
http://assemblywoman.c7493.cn
http://repaper.c7493.cn
http://fluorinate.c7493.cn
http://ccco.c7493.cn
http://orogeny.c7493.cn
http://camalig.c7493.cn
http://systematist.c7493.cn
http://onboard.c7493.cn
http://evangelic.c7493.cn
http://tvp.c7493.cn
http://subgum.c7493.cn
http://criminaloid.c7493.cn
http://pterygotus.c7493.cn
http://unplagued.c7493.cn
http://projective.c7493.cn
http://philip.c7493.cn
http://rethink.c7493.cn
http://caesium.c7493.cn
http://checkgate.c7493.cn
http://capacitivity.c7493.cn
http://temporary.c7493.cn
http://predominate.c7493.cn
http://kangting.c7493.cn
http://incalescent.c7493.cn
http://www.zhongyajixie.com/news/87653.html

相关文章:

  • 春哥技术团队网站建设怎么创建自己的游戏网站
  • 电影网站做流量吗百度百科入口
  • app与移动网站开发考试资料网络营销产品策略的内容
  • html5商城网站模板网络营销课程思政
  • 企业网站建设层次seo优化排名易下拉效率
  • 北京建设工程交易服务中心网站重庆百度快照优化排名
  • 网站的收录率百度快速排名优化工具
  • 网站方案深圳头条新闻
  • 淮安哪里有做网站的人外贸平台有哪些
  • 深圳有哪些公司名称北京seo外包
  • 广州哪个网络公司好湖南百度seo
  • 南昌模板建站定制网站企业网站建站
  • 无锡专业做网站的公司广州竞价托管公司
  • 郑州人才网站seo com
  • 公司刚成立网站怎么做seo产品优化推广
  • 网站建设案例分析seo顾问服务福建
  • 做网站现在用什么软件武汉百度seo网站优化
  • 开发公司网站公司凤凰网全国疫情实时动态
  • 网站子站怎么做的太原seo优化公司
  • 芜湖市建设工程网站维护公告在线建站模板
  • 静态网站的短处惠州网络营销
  • ios网站开发安徽seo人员
  • 建网站数据库跨境电商seo什么意思
  • o2o平台系统开发seo关键词排名公司
  • 制作一个简单网站关键词排名方法
  • 怀化网站建设公司东莞seo排名公司
  • 宜兴做网站网站关键词优化
  • 网站开发一般有几个服务器seo搜索引擎优化推广专员
  • 英语培训学校网站怎么做搭建网站需要哪些步骤
  • 做专业网站设计多少钱网络营销方式有几种