一、前情提要
上一次我们做到了配置Shiro,这一次我们来完成工单管理服务的开发。
二、接口设计
1.获取全部维修工单服务:searchAllOrder
- 参数:无
- 返回值:
List<Orders>
2.通过维修工单ID获取维修工单信息:searchOrderById
- 参数:
id
(维修工单ID,类型为:Integer
) - 返回值:
Orders
(工单实体类)
3.获得维修工单总数:getOrderCount
- 参数:无
- 返回值:
Integer
4.保存工单信息:saveOrder
- 参数:
Orders
(工单实体类) - 返回值:无
5.更新工单信息:updateOrder
- 参数:
Orders
(工单实体类) - 返回值:无
6.删除工单信息:deleteOrder
- 参数:
Orders
(工单实体类) - 返回值:无
三、实践操作
注意:我不会对所有接口进行详解,只会对一些需要注意的地方进行讲解。
1.按照上方设计的接口编写接口类OrdersService
在com.repairsystem.service
创建接口OrdersService
package com.repairsystem.service;
import com.repairsystem.entity.Orders;
import java.util.List;
/**
* @author CheungChingYin
* @date 2019/1/15
* @time 14:28
*/
public interface OrdersService {
/**
* 获取全部维修单
* @return
*/
List<Orders> searchAllOrder();
/**
* 按照维修单号搜索维修单
* @param id
* @return
*/
Orders searchOrderById(Integer id);
/**
* 获得工单总数量
* @return
*/
Integer getOrderCount();
/**
* 添加维修单
* @param order
*
*/
void saveOrder(Orders order);
/**
* 更新维修单
* @param order
*/
void updateOrder(Orders order);
/**
* 删除维修单
* @param id
*/
void deleteOrder(Integer id);
}
2.创建接口实现类OrdersServiceImpl
在com.repairsystem.service.Impl
下创建接口实现类OrdersServiceImpl
,实现OrdersService
接口。
/**
* @author CheungChingYin
* @date 2019/1/15
* @time 14:33
*/
@Service
public class OrdersServiceImpl implements OrdersService {
@Autowired
OrdersMapper ordersMapper;
}
3.保存工单信息:saveOrder
的实现
- 参数:
Orders
(工单实体类) - 返回值:无
在保存工单的时候,我们并不会将所有的字段进行保存,如images_path
(上传图片路径)、admin_id
(接手的管理员ID),因为在用户上传工单的时候,不一定会上传图片,还有工单一开始保存的时候并不会有管理员接手,管理员需要手动点击接受工单按钮才能填上管理员的ID。这样可能会缺少一两个数据库字段,在通用Mapper
中该如何实现?难道需要自己手动写SQL语句?
不!在通用Mapper中已经有预料到这一种情况,写了一个名为insertSelective()
的方法,这个方法对于insert()
的不同之处在于: insert()
需要将存入数据库的全部的字段的数据都不能为空insertSelective()
可以将只存入一些数据库字段的数据,不要求全部存入。
在OrdersServiceImpl
重写saveOrder
方法即可。
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void saveOrder(Orders order) {
ordersMapper.insertSelective(order);
}
4.获取全部维修工单服务:searchAllOrder
的实现
- 参数:无
- 返回值:
List<Orders>
由于在Orders
这个数据表有外键的出现,而通用Mapper
并不会多表查询,所以只能是由我们自己来写SQL语句。
orders
表有两个外键class_id
、building_id
我们需要回显class_name
、building_name
的信息,所以我们需要这样做:
由于我们在实体类Orders
中并没有className
和buildingName
两个成员变量,所以我们需要先创建这两个成员变量。
在实体类Orders
中添加成员变量
private String className;
private String buildingName;
/*Getter和Setter方法省略*/
在mapper配置文件OrdersMapper.xml
中的<resultMap>
节点中添加这两个成员变量(注意:property
属性值必须和实体类中的成员变量名一致)
<result column="className" property="className" jdbcType="VARCHAR"/>
<result column="buildingName" property="buildingName" jdbcType="VARCHAR"/>
然后在OrdersMapper.xml
中编写相关的SQL语句,这里的SQL语句我选择使用Left Join
注意:下面SQL语句中AS className
必须要和上面的column
属性值一致
<select id="getAllOrder" resultMap="BaseResultMap">
SELECT
o.*, c.class_name AS className,
b.building_name AS buildingName,
a.admin_name AS adminName
FROM
orders AS o
LEFT JOIN class AS c ON c.class_id = o.class_id
LEFT JOIN building AS b ON b.building_id = o.building_id
LEFT JOIN administrator AS a ON a.admin_id = o.admin_id
ORDER BY
o.submit_time DESC
</select>
之后在Mapper接口文件com.repairsystem.dao.OrdersMapper
创建相应的接口方法(注意:接口方法名字必须和mapper配置文件中的id
属性值一致)
public interface OrdersMapper extends MyMapper<Orders> {
List<Orders> getAllOrder();
}
最后在service中通过mapper对象调用方法即可,在com.repairsystem.service.Impl.OrdersServiceImpl
编写以下代码:
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<Orders> searchAllOrder() {
return ordersMapper.getAllOrder();
}
到这里,Service层开发——工单管理服务开发已经完成了。如果您对次篇文章有疑问,可以在文章下方留言,谢谢您的阅读。如对【机房报修管理系统】系列文章有兴趣,可以关注或收藏我的文章,您的支持是我最大的动力,我会尽快推出下一期内容,敬请期待。