前几张,我们主要实现了升级经验、人物等级属性、地图、地图怪物,这四种配置的增删查改以及Excel导入功能。我们主要以地图怪物为例,因此在文章末尾提供的源代码中只实现了地图怪物这部分的逻辑功能。
如果你照猫画虎,把4种配置功能的逻辑全部实现的话,就会发现,增删查改的代码基本相同,除了SQL语句和模型对象不同,其他地方变化不大。
本章我们利用泛型模板,对整个系统就行重构。在重构结束后,你就会发现写代码简直就是特喵的艺术!
后端重构
idlewow-core
我们从最底层开始,首先重构位于core模块中的数据访问层。目前看来,基本上所有的模型对象,都应包含增删查改、批量添加、列表查询这些基本方法。那我们把这些方法抽象到一个单独的Mapper和Manager里。
新建com.idlewow.common包,再该包下新建接口类BaseMapper:
packagecom.idlewow.common;importcom.idlewow.common.model.QueryParam;importjava.util.List;public interface BaseMapper{/*** 添加记录
*@paramt*/
intinsert(T t);/*** 批量添加记录
*@paramlist
*@return
*/
int batchInsert(Listlist);/*** 更新记录
*@paramt*/
intupdate(T t);/*** 删除记录
*@paramid*/
intdelete(String id);/*** 根据id查询
*@paramid
*@return
*/T find(String id);/*** 根据条件查询总数
*@paramqueryParam
*@return
*/
intcount(QueryParam queryParam);/*** 根据条件查询列表
*@paramqueryParam
*@return
*/Listlist(QueryParam queryParam);
}
BaseMapper.java
再在该包下,新建一个抽象类BaseManager,代码如下:
packagecom.idlewow.common;importcom.idlewow.common.model.PageList;importcom.idlewow.common.model.QueryParam;importorg.springframework.beans.factory.annotation.Autowired;importjava.util.List;public abstract class BaseManager{
@Autowiredpublic BaseMapperbaseMapper;public voidinsert(T t) {int effected =baseMapper.insert(t);if (effected == 0) {throw new RuntimeException("sql effected 0 rows");
}
}public void batchInsert(Listlist) {int splitSize = 100;int index = 0;int total =list.size();while (index <=total) {int end = index +splitSize;if (end >total) {
end=total;
}
List sublist =list.subList(index, end);int effected =baseMapper.batchInsert(sublist);if (effected == 0) {throw new RuntimeException("sql effected 0 rows");
}
index+=splitSize;
}
}public voidupdate(T t) {int effected =baseMapper.update(t);if (effected == 0) {throw new RuntimeException("sql effected 0 rows");
}
}public voiddelete(String id) {int effected =baseMapper.delete(id);if (effected == 0) {throw new RuntimeException("sql effected 0 rows");
}
}publicT find(String id) {
T t=(T)baseMapper.find(id);returnt;
}public PageListlist(QueryParam queryParam) {
PageList pageList = new PageList<>();int count =baseMapper.count(queryParam);
List list =baseMapper.list(queryParam);
pageList.setTotalCount(count);
pageList.setData(list);
pageList.setPageParam(queryParam.getPageParam());returnpageList;
}
}
BaseManager.java
还是以地图怪物为例,我们重构MapMobMapper和MapMobManager,只要让他们继承BaseMapper和BaseManager即可,代码如下:
packagecom.idlewow.mob.mapper;importcom.idlewow.common.BaseMapper;importcom.idlewow.mob.model.MapMob;public interface MapMobMapper extends BaseMapper{
}
MapMobMapper.java
packagecom.idlewow.mob.manager;importcom.idlewow.common.BaseManager;importcom.idlewow.mob.model.MapMob;importorg.springframework.stereotype.Component;
@Componentpublic clas