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 "修改失敗";
}
}
}
測試結果
表中數據也更新正常
備註:以上根據若依框架而來