Controller(控制逻辑)层:它是负责在页面和程序之间传输数据的,还有作用是做页面跳转。页面由用户填写表单数据,点击提交按钮,页面的表单数据由传入Service层。
Service层(业务逻辑层):负责的是对数据的处理。如果没有数据处理任务的话,此层只做单纯的数据传递作用,而后又到了Dao
DAO层(数据库操作层):负责对数据向数据库增删改查的操作。(如下面的mapper代理方法,还要写mapper.xml代理文件)
mapper.xml文件
1.用到了mysql分页函数limit m,n。从m+1开始,每次n条。limit 5就是前五
2.idea新建xml可以右键->new->ResourceBoudle
3.传入参数parameterType="map"这个map中key为列名,value为列值
4.下面的标签如<if test="startTime !=null and endTime !=null">中的test是固定的,不变化
5.select中可以随便join,<if>之类的包在括号中依旧有效
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.ClockInMapper">
<!--分页查询事件详情-->
<select id="selectClockInList" parameterType="map" resultType="map">
select
police_name,
police_code,
happen_time,
-1 as score
from
kaohe_ducha_event
where
1=1
<if test="startTime !=null and endTime !=null">
and DATE_FORMAT(happen_time,'%Y-%m-%d %H:%i:%s') <=#{endTime} and DATE_FORMAT(happen_time,'%Y-%m-%d %H:%i:%s') >=#{startTime}
</if>
<choose>
<when test=" eventType !=null">
and event_type_name like CONCAT('%','${eventType}','%' )
</when>
<otherwise>
and (event_type_name like '%未打卡%' )
</otherwise>
</choose>
and feedback_status=2 and event_check=1 and police_org_code=310101490000
limit #{startNum},#{pageSize}
</select>
<!--统计事件总数-->
<select id="selectClockInTotal" parameterType="map" resultType="int">
select
count(1)
from
kaohe_ducha_event
where
1=1
<if test="startTime !=null and endTime !=null">
and DATE_FORMAT(happen_time,'%Y-%m-%d %H:%i:%s') <=#{endTime} and DATE_FORMAT(happen_time,'%Y-%m-%d %H:%i:%s') >=#{startTime}
</if>
<choose>
<when test=" eventType !=null">
and event_type_name like CONCAT('%','${eventType}','%' )
</when>
<otherwise>
and (event_type_name like '%未打卡%' )
</otherwise>
</choose>
and feedback_status=2 and event_check=1 and police_org_code=310101490000
</select>
<!--考勤计分统计 固定展现十条-->
<select id="selectClockInGrade" parameterType="map" resultType="map">
select
police_name,
sum(num) score
from
(
select
police_name,
police_code,
happen_time,
-1 num
from
kaohe_ducha_event
WHERE
1=1
<if test="startTime !=null and endTime !=null">
and DATE_FORMAT(happen_time,'%Y-%m-%d %H:%i::%s') <=#{endTime} and DATE_FORMAT(happen_time,'%Y-%m-%d %H:%i::%s') >=#{startTime}
</if>
<choose>
<when test=" eventType !=null">
and event_type_name like CONCAT('%','${eventType}','%' )
</when>
<otherwise>
and (event_type_name like '%未打卡%' )
</otherwise>
</choose>
and feedback_status=2 and event_check=1 and police_org_code=310101490000
) d GROUP BY police_code order by sum(num)
limit 10
</select>
</mapper>
mapper.java
对上面resultType是map的,map应该装在list集合中,不然列名对应对个值时会报TooManyResultsException:
package com.ruoyi.system.mapper;
import java.util.List;
import java.util.Map;
/**
* @Author qiumengkai
* @Date 2020/3/31
*/
public interface ClockInMapper {
/**
* 考勤未打卡数据查询
*
*
* @return 案件信息
*/
public List<Map<String,Object>> selectClockInList(Map<String, Object> map);
/**
* 统计事件数量
*
*
* @return 事件数量
*/
public int selectClockInTotal(Map<String, Object> map);
/**
* 警员扣分前十名
*
*
* @return 警员名称,分数
*/
public List<Map<String,Object>> selectClockInGrade(Map<String, Object> map);
}
serviceInterface
package com.ruoyi.system.service;
import java.util.Map;
/**
* @Author qiumengkai
* @Date 2020/3/31
*/
public interface IClockInService {
/**
* 查询未打卡信息列表
*
*
* @return 未打卡信息
*/
public Map<String,Object> selectClockInList(Map<String, Object> map);
/**
* 警员扣分前十名分数汇总
*
*
* @return 警员名称,分数
*/
public Map<String,Object> selectClockInGrade(Map<String, Object> map);
}
serviceImpl
调用了xml中的两组,total和list并列
package com.ruoyi.system.service.impl;
import com.ruoyi.system.mapper.ClockInMapper;
import com.ruoyi.system.service.IClockInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author qiumengkai
* @Date 2020/3/31
*/
@Service
public class ClockInServiceImpl implements IClockInService {
@Autowired
private ClockInMapper clockinmapper;
@Override
public Map<String, Object> selectClockInList(Map<String, Object> map) {
Map<String,Object> resultMap = new HashMap<>();
List<Map<String,Object>> list= clockinmapper.selectClockInList(map);
int total = clockinmapper.selectClockInTotal(map);
resultMap.put("list",list);
resultMap.put("total",total);
resultMap.put("status",200);
return resultMap;
}
@Override
public Map<String, Object> selectClockInGrade(Map<String, Object> map) {
Map<String,Object> resultMap = new HashMap<>();
List<Map<String,Object>> list = clockinmapper.selectClockInGrade(map);
resultMap.put("list",list);
resultMap.put("status",200);
return resultMap;
}
}
Controller
.put中带引号的几个名称和xml中是对应的(或者说最后返回JSON结果中的第一层),不带引号的和接口中参数一样
package com.ruoyi.web.controller.system;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.system.service.IClockInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* @Author qiumengkai
* @Date 2020/3/31
*/
@Controller
@RequestMapping("/system/clockin")
public class ClockInController extends BaseController {
private String prefix = "/system/clockin";
@Autowired
private IClockInService ClockInService;
@GetMapping("/listclockin")
@ResponseBody
public Map<String,Object> listclockin(int pageNum, int pageSize, String startTime,String endTime,String eventType) {
Map<String,Object> resultMap = new HashMap<>();
Map<String,Object> paramMap = new HashMap<>();
if(pageNum<1){
pageNum = 1;
}
if(pageSize<1){
pageSize = 10;
}
int startNum = (pageNum-1)*pageSize;
paramMap.put("pageSize",pageSize);
paramMap.put("startNum",startNum);
paramMap.put("startTime",startTime);
paramMap.put("endTime",endTime);
paramMap.put("eventType",eventType);
resultMap = ClockInService.selectClockInList(paramMap);
return resultMap;
}
@GetMapping("/listclockingrade")
@ResponseBody
public Map<String,Object> listPoliceGrade(String startTime,String endTime,String eventType) {
Map<String,Object> resultMap = new HashMap<>();
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("startTime",startTime);
paramMap.put("endTime",endTime);
paramMap.put("eventType",eventType);
//paramMap.put("status",status);
resultMap = ClockInService.selectClockInGrade(paramMap);
return resultMap;
}
}
1.@RequestMapping用来标识 http 请求地址与 Controller 类的方法之间的映射
2.接口 @RequestMapping后面的拼接/system/clockin @GetMapping后面的/listclockin ,?后面再接参数
如 http://localhost:8080/system/clockin/listclockin?pageSize=10&pageNum=1&startTime=2020-01-01 00:00:00&endTime=2021-01-01 00:00:00
3.接口中的参数字段在Controller中可以找到,就是不带引号的那几个
4.调用接口返回的就是xml文件中返回的几个字段
上面的total和list就是ServiceImpl中的total和list(status漏写,与total一层)
update流程(和插入删除修改一样,要返回一个状态,查看是否增删改成功)
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.PersonalResumeMapper">
<resultMap type="PoliceEvaluate" id="result">
<result property="userCode" column="userCode"/>
<result property="chiefEvaluate" column="chiefEvaluate"/>
</resultMap>
<update id="updateChiefEvaluate" parameterType="com.ruoyi.system.domain.PoliceEvaluate">
update police_evaluate
<set>
<if test="chiefEvaluate != null and chiefEvaluate != ''">chief_evaluate = #{chiefEvaluate}</if>
</set>
where user_code = #{userCode}
</update>
</mapper>
mapper
package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.PoliceEvaluate;
public interface PersonalResumeMapper {
/**
* 修改人员评价
* @param userCode 部门信息
* @return 结果
*/
public int updateChiefEvaluate(PoliceEvaluate userCode);
}
service
package com.ruoyi.system.service;
import com.ruoyi.system.domain.PoliceEvaluate;
public interface IPersonalResumeService {
/**
* 修改评价信息
* @param policeEvaluate 警员号
* @return 结果
*/
public int updateChiefEvaluate(PoliceEvaluate policeEvaluate);
}
serviceImpl
package com.ruoyi.system.service.impl;
import com.ruoyi.system.domain.PoliceEvaluate;
import com.ruoyi.system.mapper.PersonalResumeMapper;
import com.ruoyi.system.service.IPersonalResumeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PersonalResumeServiceImpl implements IPersonalResumeService {
@Autowired
private PersonalResumeMapper personalResumeMapper;
@Override
public int updateChiefEvaluate(PoliceEvaluate policeEvaluate) {
int result = personalResumeMapper.updateChiefEvaluate(policeEvaluate);
return result;
}
}
controller
package com.ruoyi.web.controller.system;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.system.domain.PoliceEvaluate;
import com.ruoyi.system.service.IPersonalResumeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/system/personalresume")
public class PersonalResumeController extends BaseController {
private String prefix = "system/personalresume";
@Autowired
private IPersonalResumeService personalResumeService;
/*
* 查询案件信息列表
*/
@GetMapping("/updatechiefevaluate")
@ResponseBody
public String updateChiefEvaluate(PoliceEvaluate policeEvaluate) {
int result = personalResumeService.updateChiefEvaluate(policeEvaluate);
if (result >= 1) {
return "修改成功";
} else {
return "修改失败";
}
}
}
测试结果
表中数据也更新正常
备注:以上根据若依框架而来