单独的数据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的继承处理,关于继承的方式由于这不是我这篇文章中讨论的观点,所以说我就不写了。具体的思考方式可以看一下下面别人写的相关文章,至于后面我一旦有时间后会专门写一下其具体的使用方式。