1. 程式人生 > >Spring Cloud與微服務之構造基礎資料

Spring Cloud與微服務之構造基礎資料

文章目錄

單獨的資料Maven模組的好處

  在專案開發中,我們一般使用Mybatis做資料的持久化操作,而MybatisGenerator為我們提供了方便的entity、dao、mapper檔案的生成方式,這樣我們在使用Mybatis時就不用一個欄位一個欄位的自己用手去寫了,這樣一方面減少了大量的體力勞動;另一方面也大幅度的減少了程式碼的出錯率。

  而由於專案開發中頻繁的業務邏輯變動,這導致資料表在改表,改欄位方面也很頻繁,因而當我們在使用Spring Cloud微服務時,我們會面臨一種在多個微服務間頻繁同步entity、mapper檔案等的問題,所以說我這裡就將其抽取出來,做成一個單獨的Maven模組,方便對於資料表密切相關的entity、mapper的集中管理,這樣我們專案其它地方在使用entity、mapper時,只需要引入對應的依賴即可。

  由於我這裡只是在做演示,而並非真正的資料表操作,因而我這裡直接採用了構造資料的方式來代替資料表的查詢處理操作。

springcloud-goods-db

springcloud-goods-db專案結構

在這裡插入圖片描述

springcloud-goods-db原始碼

  pom.xml原始碼:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-goods-db</artifactId>

    <name>SpringCloud微服務::實體類與資料</name>
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--匯入SpringCloud的依賴管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>

</project>

  ItemDao原始碼:

package com.lyc.item.dao;

import com.lyc.item.db.ItemDB;
import com.lyc.item.entity.Item;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@NoArgsConstructor
public class ItemDao {

    /**
     * 根據商品條目id商品資訊
     * @param id
     * @return
     */
    public Item queryItemById(Long id){
        return ItemDB.newItemDB().getMap().get(id);
    }

}

  ItemDB原始碼:

package com.lyc.item.db;

import com.lyc.item.entity.Item;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;

@Getter
@Setter
@NoArgsConstructor
public class ItemDB {

    private Map<Long,Item> map = new HashMap<Long,Item>();

    /**
     * 準備一些資料
     */
    {
        map.put(1L,new Item(1L,"商品標題1","http://圖片1","商品描述1",1000L));
        map.put(2L,new Item(2L,"商品標題2","http://圖片2","商品描述2",2000L));
        map.put(3L,new Item(3L,"商品標題3","http://圖片3","商品描述3",3000L));
        map.put(4L,new Item(4L,"商品標題4","http://圖片4","商品描述4",4000L));
        map.put(5L,new Item(5L,"商品標題5","http://圖片5","商品描述5",5000L));
        map.put(6L,new Item(6L,"商品標題6","http://圖片6","商品描述6",6000L));
        map.put(7L,new Item(7L,"商品標題7","http://圖片7","商品描述7",7000L));
        map.put(8L,new Item(8L,"商品標題8","http://圖片8","商品描述8",8000L));
    }

    public static ItemDB newItemDB(){
        return new ItemDB();
    }

}

  Item原始碼:

package com.lyc.item.entity;

import lombok.*;

@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Item {

    private Long id;
    private String title;
    private String pic;
    private String desc;
    private Long price;

}

  OrderDao原始碼:

package com.lyc.order.dao;

import com.lyc.order.db.OrderDB;
import com.lyc.order.entity.Order;
import org.springframework.stereotype.Component;

@Component
public class OrderDao {

    /**
     * 根據訂單id查詢訂單資訊
     * @param id
     * @return
     */
    public Order queryOrderById(String id){
        return OrderDB.newOrderDB().getMap().get(id);
    }
}

  OrderDB原始碼:

package com.lyc.order.db;

import com.lyc.item.entity.Item;
import com.lyc.order.entity.Order;
import com.lyc.order.entity.OrderDetail;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.*;

@Getter
@Setter
@NoArgsConstructor
public class OrderDB {

    private Map<String,Order> map = new HashMap<>();

    {
        //構造測試資料
        Order order = new Order();
        order.setOrderId("13135351635");
        order.setCreateDate(new Date());
        order.setUpdateDate(order.getCreateDate());
        order.setUserId(1L);

        List<OrderDetail> orderDetails = new ArrayList<>();

        Item item = new Item();  //構造第一個商品資料
        item.setId(1L);
        orderDetails.add(new OrderDetail(order.getOrderId(),item));
        item = new Item();   //構造第二個商品資料
        item.setId(2L);
        orderDetails.add(new OrderDetail(order.getOrderId(),item));
        order.setOrderDetails(orderDetails);
        map.put(order.getOrderId(),order);
    }

    public static OrderDB newOrderDB(){
        return new OrderDB();
    }
}

  ItemProperties原始碼:

package com.lyc.order.entity;

import lombok.*;

@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ItemProperties {

    private String url;

}

  Order原始碼:

package com.lyc.order.entity;

import lombok.*;

import java.util.Date;
import java.util.List;

@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Order {

    private String orderId;
    private Long userId;
    private Date createDate;
    private Date updateDate;
    private List<OrderDetail> orderDetails;

}

  OrderDetail原始碼:

package com.lyc.order.entity;

import com.lyc.item.entity.Item;
import lombok.*;

@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class OrderDetail {

    private String orderId;
    private Item item = new Item();

}

  ItemDBTest原始碼:

package com.lyc.item;

import com.lyc.item.db.ItemDB;
import com.lyc.item.entity.Item;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.util.Map;

@Slf4j
public class ItemDBTest {

    @Test
    public void testItemDB(){
        Map<Long,Item> map = ItemDB.newItemDB().getMap();
        map.forEach((k,v) -> {
            log.info("k:{},v:{}",k,v);
        });
    }

}

其它地方的使用方式:

  如果我們想在其它的Spring Cloud微服務模組中使用,我們直接採用這樣的方式就可以了。

<dependency>
     <groupId>com.lyc</groupId>
     <artifactId>springcloud-goods-db</artifactId>
 </dependency>

  這裡需要注意的是,在專案中,我們的entity基本上只做get/set操作,因而entity類一旦生成,我們直接拿來使用就可以了。但是dao與Mapper則不同,我們是要在其中編寫相應的實現程式碼的,而那些實現程式碼我們是不推薦在springcloud-goods-db專案模組中編寫的。

  當我們要編寫自己的實現程式碼時,我們可以在引用它的模組中做Mybatis的繼承處理,關於繼承的方式由於這不是我這篇文章中討論的觀點,所以說我就不寫了。具體的思考方式可以看一下下面別人寫的相關文章,至於後面我一旦有時間後會專門寫一下其具體的使用方式。