扩展-链接:表白小游戏教程(零基础也能学会)
到Github获取源码请点击此处
一. 使用Mybatis分页插件完成商品的分页查询
- 在第一章中我们已经搭建好了环境, 并且在配置Mybatis的时候已经配置好了分页插件.
- 下面实现商品查询的分页显示
- 由于最终后台要返回的Json数据包含查询的集合数据和商品条目总数, 我们为此封装一个Java Bean.
- 首先在
ashop-common
模块下建包, 并创建PageResult
类.
/**
* 封装DataGrid控件需要的数据模型
*/
public class PageResult<T> implements Serializable {
private List<T> rows;//rows和total是EasyUI的命名规范
private long total;
/*省略 get / set 方法...*/
}
- 现在我们要编写获取商品列表信息的代码, 这段代码将会通过Dubbo远程发布, web模块通过调用这些远程服务获取商品列表信息.
- 接下来到service模块中定义获取商品列表的service接口
public interface ItemService {
/**
* 实现商品信息的分页查询
*/
public PageResult<TbItem> selectItemList(Integer page, Integer rows);
}
- 温馨提示: 如果
PageResult
不能导包, 查看pom文件是否有对common模块进行依赖. - 然后在实现类模块中创建对应的实现类.
@Service
public class ItemServiceImpl implements ItemService {
//注入mapper接口代理对象
@Autowired
private TbItemMapper tbItemMapper;
@Override
public PageResult<TbItem> selectItemList(Integer page, Integer rows) {
//执行分页操作
Page ps = PageHelper.startPage(page, rows);
//创建example对象
TbItemExample example = new TbItemExample();
//执行数据库查询操作
List<TbItem> list = tbItemMapper.selectByExample(example);
PageResult<TbItem> result = new PageResult<>();
result.setRows(list);
result.setTotal(ps.getTotal());
return result;
}
}
- 接下来需要到Dubbo配置文件中发布Dubbo服务.
- 然后编写测试程序, 发布服务
- 接着编写web模块代码, 这里再次回顾调用的思路: 首先会我们查询商品列表的服务会在
ashop-rpc-service-impl
模块进行发布, 而web模块则会调用已经发布的服务, 处理来自浏览器的请求并进行响应. - 首先在web模块的dubbo配置文件中配置一个远程服务代理对象
- 然后在web模块中创建service接口及其实现类
public interface ManagerItemService {
/**
* 完成商品的分页查询
*/
public PageResult<TbItem> selectItemListService(Integer page, Integer rows);
}
@Service
public class ManagerItemServiceImpl implements ManagerItemService {
@Autowired
private ItemService itemServiceProxy;
@Override
public PageResult<TbItem> selectItemListService(Integer page, Integer rows) {
return itemServiceProxy.selectItemList(page, rows);
}
}
- 然后编写controller类, 处理商品信息的分页查询请求.
@Controller
public class PageController {
/**
* 加载商城后台系统的首页
*/
@RequestMapping("/")
public String showIndex(){
return "index";
}
/**
* 加载其他的jsp视图
*/
@RequestMapping("{page}")
public String showPage(@PathVariable String page){
return page;
}
}
- 以上工作做好后, 按下面步骤执行:
- 序列化TbItem的pojo类, 我由于没有进行序列化, 导致后面报错了
- 对整体项目进行install(install前可以先clean一下)
- 先编写的测试程序启动, 发布Dubbo服务, 然后启动Tomcat, 接着就能正常访问了.
- 在这过程中自己犯了个错误, 导致mybatis出错.
- 出错原因是mapper.xml文件和mapper接口没有在同一个文件夹中. 后来通过查看target文件发现没有mapper.xml文件, 上网查了查如果使用idea需要在pom.xml文件中配置搬运mapper.xml文件.
<!--Eclipse中会自动把mapper.xml文件放到target目录下, 但是idea不会, 所以要手动配置-->
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory> <!-- //发布该目录下的文件 -->
<includes>
<include>**/*.xml</include> <!-- //发布所有以xml结尾的文件 -->
</includes>
</resource>
</resources>
</build>
二. 商品的上下架实现
接下来的商品上下架和删除的思路和商品的查询是类似的, 可以通过这三个功能练习一下, 以下的描述可能没有上面讲述商品查询时严谨
- 首先创建一个Java Bean封装商品上下架的响应信息
/**
* 封装客户端发送上架, 下架, 删除商品请求后, 需要响应的数据模型.
*/
public class AshopResult implements Serializable {
private Integer status; //响应状态
private Object data; //响应数据
private String msg; //响应消息
/**
* 静态方法, 返回AshopResult对象
*/
public static AshopResult ok(){
return new AshopResult(null);
}
public AshopResult() {
}
public AshopResult(Object data) {
this.data = data;
this.status = 200;
this.msg = "ok";
}
public AshopResult(Integer status, String msg) {
this.status = status;
this.msg = msg;
}
public AshopResult(Integer status, Object data, String msg) {
this.status = status;
this.data = data;
this.msg = msg;
}
// get / set ...
}
- 然后在
ashop-rpc-service
模块的ItemService接口中添加修改商品状态的方法
/**
* 完成商品上下架状态的修改
* @param itemIds 修改的商品集合
* @param flag true: 上架, false: 下架
* @return
*/
public AshopResult updateItemStatus(List<Long> itemIds, boolean flag);
- 然后到service实现类中重写该方法
@Override
public AshopResult updateItemStatus(List<Long> itemIds, boolean flag) {
//创建TbItem对象
TbItem item = new TbItem();
item.setStatus((byte) (flag ? 1 : 2));
//动态产生where条件
TbItemExample example = new TbItemExample();
Criteria c = example.createCriteria();
c.andIdIn(itemIds);//产生这样的效果: where id in(3, 4, 5...)
tbItemMapper.updateByExample(item, example);
return AshopResult.ok();
}
- 至此我们完成了更改商品状态这一远程服务的编写, 下面我们编写客户端更改商品信息的代码.
- controller
/**
* 处理商品上架请求
* @param ids
* @return
*/
@ResponseBody
@RequestMapping(value = "item/reshelf", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public AshopResult reshelfItem(Long[] ids){
return managerItemService.reshelfItem(ids);
}
/**
* 处理商品下架请求
* @param ids
* @return
*/
@ResponseBody
@RequestMapping(value = "item/instock", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public AshopResult instockItem(Long[] ids){
return managerItemService.instockItem(ids);
}
- 对应的service接口实现类:
@Override
public AshopResult reshelfItem(Long[] ids) {
//把Long型数组转为list集合
ArrayList<Long> list = new ArrayList<>();
for(int i = 0; i < ids.length; i++){
list.add(ids[i]);
}
//调用远程服务
return itemServiceProxy.updateItemStatus(list, true);
}
@Override
public AshopResult instockItem(Long[] ids) {
ArrayList<Long> list = new ArrayList<>();
for(int i = 0; i < ids.length; i++){
list.add(ids[i]);
}
return itemServiceProxy.updateItemStatus(list, false);
}
三. 实现商品删除操作
- 照葫芦画瓢, 首先提供远程服务, 在service模块的
ItemService
接口中添加删除商品信息的方法
- 然后编写对应的实现类完成删除, 代码和修改商品上下架差不多
- 完成这两步后, 远程服务接口已经写好, 现在编写客户端后台代码, 同样是编写
service
接口和对应的实现类
- 最后编写controller, 提供处理请求的方法.
- 到此为止, 商品的上下架以及删除功能已经完成.