⼀个电商项⽬的Web服务化改造⼀个电商项⽬的Web服务化改造
项⽬,早期是随便瞎做的,没啥架构,连基本的设计也没。
有需求,实现需求,再反复修改。
⼤致就是这么做的。
最近,项⽬要重新架构,和某boss协商的结果是,采⽤阿⾥开源的dubbo实现服务化。
前⼏天,写了⼀篇dubbo⼊门案例,分布式服务框架Dubbo⼊门案例和项⽬源码
。
最近,开始实现基本业务功能模块的开发。完成1个模块,原有项⽬就接⼊进来,从⽽完成项⽬的服务化改造。
在和某boss的商讨之后,我们的做法是
1.只做单表操作,mysql数据库层次不写“关联查询”。
2.针对单个表,实现CRUD等基本操作。
3.层次划分
mapper:基本的数据库CRUD,全部是原⼦操作
dao:对mapper的数据进⾏组装,⽐如关联查询。
之前,是在service层进⾏代码组装的。
bizService:业务逻辑操作
webService:对外服务层
由于当前阶段,我们的业务逻辑⽐较简单,bizService和webService可以看成是1层的。
好处:严格的层次划分,上层可以调⽤下层,同层之间不能互相调⽤。⽐如service不能调⽤其它的service。
4.结合Freemarker,写代码⾃动⽣成的⼯具。根据数据库表,⾃动⽣成标准化的代码。
书写中...
类结构
Base*:基础的公共的类
Brand: 具体的,以品牌brand表为例
brand表结构
1 CREATE TABLE `brand` (
2 `id` varchar(50) NOT NULL COMMENT 'ID',
3 `name` varchar(30) DEFAULT NULL COMMENT '品牌名称',
4 `logo` varchar(100) DEFAULT NULL COMMENT '品牌LOGO',
5 `isDelete` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
6 `createTime` datetime DEFAULT NULL COMMENT '创建⽇期',
7 `updateTime` datetime DEFAULT NULL,
8 PRIMARY KEY (`id`)
9) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='品牌表';
Brand.java:数据库表对应的模型
1/**
2 * 品牌
3 *
4 */
5public class Brand {
6 private String id;
7 private String name;
8 private String logo;
9 private Date createTime;
10 private Date updateTime;
11 private Integer isDelete;
12
13}
BaseMapper.java:定义最通⽤的sql映射。注意,这个mapper没有对应的Mybatis xml配置。
1import java.util.List;
2
3public interface BaseMapper<ID, Entity> {
4 Entity get(ID id);
5
6 List<Entity> listByIdList(List<String> idList);
7
8 List<Entity> listAll();
9
10 int add(Entity entity);
11
12 int update(Entity entity);
13
14 int remove(ID id);
15
16 int removeByIdList(List<ID> idList);
17
18}
BrandMapper.java:品牌的sql映射,Java接⼝定义
import java.util.List;
1@Mapper
2public interface BrandMapper extends BaseMapper<String, Brand> {
3 // read
4
5 List<Brand> listByShopIdList(List<String> shopIdList);
6
7 List<Brand> list(BrandBean brandBean);
8
9 // write
10
11}
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd"> 3<mapper namespace="com.webservice.mapper.BrandMapper">
4 <sql id="columns">
5 id,name,logo,createTime,updateTime,isDelete
6 </sql>
7
8 <select id="get" resultType="Brand">
9 select
10 <include refid="columns" />
11 from brand
12 where id =
13 #{id}
14 </select>
15
16 <select id="list" resultType="Brand">
17 select
18 <include refid="columns" />
19 from brand where
20 isDelete=0
21 <if test="name != null and name !=''">
22 and name like '%${name}%'
23 </if>
24 order by createTime desc
25 </select>
26
27 ...
28}
BaseDao.java:定义最基础、最通⽤的dao层接⼝。
1 import java.util.List;
2
3public interface BaseDao<ID, Entity,Bean> {
4 //read
5 Entity get(ID id);
6
7 List<Entity> listByIdList(List<String> idList);
8
9 List<Entity> list(Bean bean);
10
11 List<Entity> listAll();
12
13 //write
14 int add(Entity entity);
15
16 int update(Entity entity);
17
18 int remove(ID id);
19
调用webservice服务20 int removeByIdList(List<ID> idList);
21
22}
BrandDao.java: 品牌的dao接⼝
1import java.util.List;
2
3
4public interface BrandDao extends BaseDao<String, Brand,BrandBean> {
5 // read
6 List<Brand> listByShopIdList(List<String> shopIdList);
7
8 List<String> listLogoByIdList(List<String> idList);
9
10 // write
11
12}
BrandDaoImpl.java:品牌的dao接⼝实现类
1@Component
2public class BrandDaoImpl implements BrandDao {
3
4 @Autowired
5 private BrandMapper brandMapper;
6
7 private Logger logger = Logger(getClass());
8
9 @Override
10 public Brand get(String id) {
11 if(StringUtils.isEmpty(id)){
12 ("The id is null");
13 return null;
14 }
15 (id);
16 }
17
18 @Override
19 public List<Brand> listByIdList(List<String> idList) {
20 if (CollectionUtils.isEmpty(idList)) {
21 ("The idList is empty");
22 return null;
23 }
24 return brandMapper.listByIdList(idList);
25 }
26
27}
BrandService.java: 品牌,业务层的接⼝定义
代码类似
BrandServiceImpl.java:品牌,业务层的接⼝实现
代码类似
junit单元测试:测dao和service层,mapper层忽视
BaseDaoTest.java:dao基础配置
1//单元测试的mysql数据库,最好是单独的⼀套库,没有任何数据。如果开发和单元测试共⽤数据库,listAll之类的⽅法会有影响。
2//单元测试:1.构造数据,2.执⾏操作,3.断⾔,4.回滚
3//设置⾃动回滚
4@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
5@Transactional
6@ContextConfiguration(locations={"classpath*:l"})
7@RunWith(SpringJUnit4ClassRunner.class)
8public class BaseDaoTest {
9 public static final String NOT_EXIST_ID_STRING="not_exist_id_string";
10 public static final String NOT_EXIST_ID_INT="not_exist_id_int";
11 public static final String EXIST_NAME = "test";
12 public static final String NOT_EXIST_NAME = "not_exist_name";
13}
14
15 BrandDaoTest.java:brand的基础测试⽤例
16 public class BrandDaoTest extends BaseDaoTest {
17
18 @Autowired
19 private BrandDao brandDao;
20
21 // //read//
22 @Test
23 public void testGet() {
24 Brand brand = TestDataCenter.brand();
25 brandDao.add(brand);
26 Brand dbBrand = (Id());
27 assertNotNull(dbBrand);
28 }
29
30 @Test
31 public void testGetNotExist() {
32 Brand brand = TestDataCenter.brand();
33 brandDao.add(brand);
34 Brand nullBrand = (NOT_EXIST_ID_STRING);
35 assertNull(nullBrand);
36 }
37}
BaseServiceTest.java:service基础配置
代码类似
BrandServiceTest.java:brand的基础测试⽤例
代码类似
单元测试结果图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论