重点技术-20180831-Dozer对象映射

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/namelessfighter/article/details/82256664

Dozer:用于实现JavaBean之间的映射与转换

官网:https://github.com/DozerMapper/dozer

Maven引入

<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.4.0</version>
</dependency>

一、使用注解的方式

public class FromA
{
    private long id;
    @Mapping("value")
    private String name;
    private Date date;
    
    @Override
    public String toString()
    {
        return "FromA [id=" + id + ", name=" + name + ", date=" + date + "]";
    }
    
    public long getId()
    {
        return id;
    }
    public void setId(long id)
    {
        this.id = id;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }
}

public class FromB
{
    private long id;
    private String value;
    private Date date;
    
    @Override
    public String toString()
    {
        return "FromB [id=" + id + ", value=" + value + ", date=" + date + "]";
    }
    
    public long getId()
    {
        return id;
    }
    public void setId(long id)
    {
        this.id = id;
    }
    public String getValue()
    {
        return value;
    }
    public void setValue(String value)
    {
        this.value = value;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }
}

类FromA的字段name通过注解@Mapping("value")和类FromB的字段value进行关联。

    public static void main(String[] args)
    {
        DozerBeanMapper mapper = new DozerBeanMapper();

        //---------------------------------------对象转换
//        FromA fromA = new FromA();
//        fromA.setDate(new Date());
//        fromA.setId(5L);
//        fromA.setName("Aaaa");
//        
//        FromB fromB = mapper.map(fromA, FromB.class);
//        System.out.println(fromB);

        FromB fromB = new FromB();
        fromB.setDate(new Date());
        fromB.setId(5L);
        fromB.setValue("Aaaa");
        
        FromA fromA = mapper.map(fromB, FromA.class);
        System.out.println(fromA);
        
        //---------------------------------------列表转换
//        List<FromA> listA = new ArrayList<FromA>();
//        listA.add(fromA);
//        
//        List<FromB> listB = (List)listA.stream()
//        .map(objectA -> mapper.map(objectA, FromB.class))
//        .collect(Collectors.toList());
//        
//        System.out.println(listB);

        List<FromB> listB = new ArrayList<FromB>();
        listB.add(fromB);
        
        List<FromA> listA = (List)listB.stream()
                .map(objectB -> mapper.map(objectB, FromA.class))
                .collect(Collectors.toList());//通过JAVA8流的方式,实现FromA和FromB集合之间的转换。
        
        System.out.println(listA);
    }

二、使用映射文件的方式

public class FromA
{
    private long id;
    private String name;
    private Date date;
    
    @Override
    public String toString()
    {
        return "FromA [id=" + id + ", name=" + name + ", date=" + date + "]";
    }
    
    public long getId()
    {
        return id;
    }
    public void setId(long id)
    {
        this.id = id;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }
}

public class FromB
{
    private long id;
    private String value;
    private Date date;
    
    @Override
    public String toString()
    {
        return "FromB [id=" + id + ", value=" + value + ", date=" + date + "]";
    }
    
    public long getId()
    {
        return id;
    }
    public void setId(long id)
    {
        this.id = id;
    }
    public String getValue()
    {
        return value;
    }
    public void setValue(String value)
    {
        this.value = value;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }
}

配置文件dozer-mapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <mapping date-format="yyyy-MM-dd">
        <class-a>test.dozer.FromA</class-a>
        <class-b>test.dozer.FromB</class-b>
        <field>
            <a>name</a>
            <b>value</b>
        </field>
    </mapping>
</mappings>
 

类FromA的字段name通过配置文件“dozer-mapping.xml”和类FromB的字段value进行关联。

    public static void main(String[] args)
    {
        DozerBeanMapper mapper = new DozerBeanMapper();
        List<String> myMappingFiles = new ArrayList<String>();
        myMappingFiles.add("dozer-mapping.xml");//配置文件和@Mapping不可共用
        mapper.setMappingFiles(myMappingFiles);

        //---------------------------------------对象转换
//        FromA fromA = new FromA();
//        fromA.setDate(new Date());
//        fromA.setId(5L);
//        fromA.setName("Aaaa");
//        
//        FromB fromB = mapper.map(fromA, FromB.class);
//        System.out.println(fromB);

        FromB fromB = new FromB();
        fromB.setDate(new Date());
        fromB.setId(5L);
        fromB.setValue("Aaaa");
        
        FromA fromA = mapper.map(fromB, FromA.class);
        System.out.println(fromA);
        
        //---------------------------------------列表转换
//        List<FromA> listA = new ArrayList<FromA>();
//        listA.add(fromA);
//        
//        List<FromB> listB = (List)listA.stream()
//        .map(objectA -> mapper.map(objectA, FromB.class))
//        .collect(Collectors.toList());
//        
//        System.out.println(listB);

        List<FromB> listB = new ArrayList<FromB>();
        listB.add(fromB);
        
        List<FromA> listA = (List)listB.stream()
                .map(objectB -> mapper.map(objectB, FromA.class))
                .collect(Collectors.toList());//通过JAVA8流的方式,实现FromA和FromB集合之间的转换。
        
        System.out.println(listA);
    }

当需要对内部嵌套元素进行映射时,可以在的一方添加Mapping注解,代码如下:

FromA包含FromC,字段名称为private FromC fromC;

FromB的value字段与FromA内FromC的theName字段相对应,Mapping注解如下:

    @Mapping("fromC.theName")
    private String value;

注意:通过Hibernate级联获得的级联对象,虽然可以获取到数据,但通过此方法,是无法映射成功的。具体原因与解决方法,还未找到。

FromA定义如下:

public class FromA
{
    private long id;
    private String name;
    private Date date;
    private FromC fromC;
    
    @Override
    public String toString()
    {
        return "FromA [id=" + id + ", name=" + name + ", date=" + date + "]";
    }
    
    public long getId()
    {
        return id;
    }
    public void setId(long id)
    {
        this.id = id;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }
    public FromC getFromC()
    {
        return fromC;
    }
    public void setFromC(FromC fromC)
    {
        this.fromC = fromC;
    }
}

FromB定义如下:

public class FromB
{
    private long id;
    @Mapping("fromC.theName")
    private String value;
    private Date date;
    
    @Override
    public String toString()
    {
        return "FromB [id=" + id + ", value=" + value + ", date=" + date + "]";
    }
    
    public long getId()
    {
        return id;
    }
    public void setId(long id)
    {
        this.id = id;
    }
    public String getValue()
    {
        return value;
    }
    public void setValue(String value)
    {
        this.value = value;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }
}

FromC定义如下:

public class FromC
{
    private String theName;

    public FromC()
    {
        super();
    }

    public FromC(String theName)
    {
        super();
        this.theName = theName;
    }

    public String getTheName()
    {
        return theName;
    }

    public void setTheName(String theName)
    {
        this.theName = theName;
    }
}

猜你喜欢

转载自blog.csdn.net/namelessfighter/article/details/82256664
今日推荐