Java如何使用反射把对象转换成MongoDb的结构

  介绍

这篇文章给大家分享的是有关Java如何使用反射把对象转换成MongoDb的结构的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

反射是Java的一个高级技巧,大量地用在各种开源项目上。比如,春天,Tomcat、Jetty等等项目中,都大量地用到了反射。

作为Java程序员,我们如果用好反射,不但能提高自己的技术水平,还能开发出更好的项目。

然而,虽然很多人听说过反射,但却不知道应该用在哪里。

那么,我们就从实际工作出发,使用反射,把对象转换成MongoDb的数据结构。当你在搞懂这个例子后,就能明白反射是怎么个用法。

需求分析

在电商系统中,一些数据要保存到MongoDb中,以此来提高查询的性能。但在此之前,我们必须把数据先转换成MongoDb的结构,也就是把Java对象转换成文档。

比如,订单信息要存到MongoDb中,就得把订单对象转换成文档。

可这样一来,每个实体类都得开发一个2 doc()方法。这个方法毫无技术含量,就是把各种字段将到文档里面。而且一旦字段多了,一不留神就会写错代码,你感受一下。

public  class  Order  {   ,,,private  Long  id;   ,,,private  Long 标识;   ,,,private  String  orderNo;   ,,,private  BigDecimal 数量;   ,,,private  String  createTime;   ,,,private  String  updateTime;   ,,,//,省略无数字段   ,,,,   ,,,//,转换方法:订单转医生   ,,,public  Document  order2Doc (Order 顺序),{   ,,,,,,,Document  doc =, new 文档();      ,,,,,,,doc.put (“id",, order.getId ());   ,,,,,,,doc.put (“userId",, order.getUserId ());   ,,,,,,,doc.put (“orderNo",, order.getOrderNo ());   ,,,,,,,doc.put (“amount",, order.getAmount ());   ,,,,,,,doc.put (“createTime",, order.getCreateTime ());   ,,,,,,,doc.put (“updateTime",, order.getUpdateTime ());   ,,,,,,,//,省略无数把…      ,,,,,,,return 医生;   ,,,}   }

除此之外,我们还得从MongoDb中取数据,把文件转换回Java对象,你再感受一下。

public  class  Order  {   ,,,private  Long  id;   ,,,private  Long 标识;   ,,,private  String  orderNo;   ,,,private  BigDecimal 数量;   ,,,private  String  createTime;   ,,,private  String  updateTime;   ,,,//,省略无数字段   ,,,,   ,,,//,转换方法:医生转订单   ,,,public  Order  doc2Order (Document 医生),{   ,,,,,,,Order  Order =, new 订单();   ,,,,,,,   ,,,,,,,order.setId((长),doc.get (“id"));   ,,,,,,,order.setUserId((长),doc.get (“userId"));   ,,,,,,,order.setOrderNo((字符串),doc.get (“orderNo"));   ,,,,,,,order.setAmount ((BigDecimal), doc.get (“amount"));   ,,,,,,,order.setCreateTime((字符串),doc.get (“createTime"));   ,,,,,,,order.setUpdateTime((字符串),doc.get (“updateTime"));   ,,,,,,,//,省略无数设置…      ,,,,,,,return 秩序;   ,,,}   }

光是一个订单类都这么麻烦了,何况这样的类不止一个,而且项目总有新需求,如果一个字段改了,那你麻烦大了,说不定要把整个项目翻一遍。

因此,为了少出的错,必须优化这两个转换方法,而这次优化用到了Java的两个高级特性:反射,泛型。为了让大家更直观的了解,我将分成两个版本迭代。

第一版,利用反射,简化实体类的转换方法;

第二版,利用泛型,反射,提取MongoDb工具类;

接下来,我们就一步步迭代吧~

利用反射,简化实体类的转换方法

在第一版的迭代中,我们要简化实体类的两个转换方法。

我们先从Java对象转文档开始,还是顺序以类为例。

首先,我们通过反射,获取到订单类的所有字段信息,然后,使用循环遍历这些字段;最后,在循环中,我们放开字段的访问权限,把字段将到文档里面。

public  class  Order  {   ,,,//,…省略无数字段      ,,,public  Document  order2Doc (Order 顺序),throws  Exception  {   ,,,,,,,Document  doc =, new 文档();      ,,,,,,,//,获取所有字段:通过,getClass(),方法获取,Class 对象,然后获取这个类所有字段   ,,,,,,,现场[],fields =, order.getClass () .getDeclaredFields ();   ,,,,,,,for  (Field  Field :字段),{   ,,,,,,,,,,,//,开放字段操作权限   ,,,,,,,,,,,field.setAccessible(真正的);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Java如何使用反射把对象转换成MongoDb的结构