開發背景:公司使用的mybatis框架搭建的一個小項目,有一個頁面中顯示的list是四張表通過外鍵查詢指定字段,顯示在列表中;
技術總結:可以通過一個ResultType,新建一個包裝類繼承自使用最多的主表的類,再定義需要的映射字段,注意:使用別名進行主動關聯;
mapper.xml文件如下:
<select id="findControlInfoList" parameterType="java.util.List" resultType="com.boomhope.po.TerminalMonitor">
<!--注意這裏使用resultType映射的時候需要將字段的別名和java包裝類的字段進行映射-->
select
c.control_flow controlFlow,c.deploy_code deployCode,
m.mac_model macModel,m.mac_brand macBrand,
du.unit_name unitName,
c.create_date createDate
from control_info c,deploy_info di,mac_machine m,deploy_unit du
<where>
c.deploy_code = di.deploy_code and m.mac_id = di.mac_id and du.unit_code = di.unit_code
<if test="errorType != null">
and c.error_type = #{errorType,jdbcType=VARCHAR}
</if>
<if test="deployCode != null">
and c.deploy_code LIKE CONCAT('%', CONCAT(#{deployCode}, '%'))
</if>
<if test="macBrand != null">
and m.mac_brand LIKE CONCAT('%', CONCAT(#{macBrand}, '%'))
</if>
<if test="unitName != null">
and du.unit_name LIKE CONCAT('%', CONCAT(#{unitName}, '%'))
</if>
</where>
</select>
package com.boomhope.po;
public class TerminalMonitor extends ControlInfo {
//以下內容繼承自ControlInfo
// 監控流水 control_flow Variable characters (20) 20 TRUE TRUE TRUE <None>
// 設備編號 deploy_code Variable characters (20) 20 TRUE FALSE TRUE <None>
// 處理時間 updater_time Timestamp FALSE FALSE TRUE <None>
// 設備品牌 mac_brand Variable characters (60) 60 TRUE FALSE TRUE <None>
private String macBrand;
// 設備型號 mac_model Variable characters (60) 60 TRUE FALSE TRUE <None>
private String macModel;
// 機構名稱 unit_name Variable characters (255) 255 TRUE FALSE TRUE <None>
private String unitName;
public String getMacBrand() {
return macBrand;
}
public void setMacBrand(String macBrand) {
this.macBrand = macBrand;
}
public String getMacModel() {
return macModel;
}
public void setMacModel(String macModel) {
this.macModel = macModel;
}
public String getUnitName() {
return unitName;
}
public void setUnitName(String unitName) {
this.unitName = unitName;
}
}
Mapper接口中定義方法如下:
package com.boomhope.dao;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.boomhope.po.ControlInfo;
import com.boomhope.po.TerminalMonitor;
@Repository
public interface ControlInfoMapper {
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table control_info
*
* @mbg.generated
*/
int deleteByPrimaryKey(String controlFlow);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table control_info
*
* @mbg.generated
*/
int insert(ControlInfo record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table control_info
*
* @mbg.generated
*/
ControlInfo selectByPrimaryKey(String controlFlow);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table control_info
*
* @mbg.generated
*/
List<ControlInfo> selectAll();
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table control_info
*
* @mbg.generated
*/
int updateByPrimaryKey(ControlInfo record);
/**
* 根據指定條件查詢數據(使用resultType和包裝類來映射查詢的結果)
* @param map
* @return
*/
List<TerminalMonitor> findControlInfoList(Map<String,String> map);
}
調用如下:
package com.boomhope.service.imple;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.boomhope.dao.ControlInfoMapper;
import com.boomhope.model.ControlInfoVo;
import com.boomhope.po.ControlInfo;
import com.boomhope.po.TerminalMonitor;
import com.boomhope.service.IControlService;
@Service(value="mycontrolService")
public class ControlServiceImple implements IControlService {
/**
* 日誌
*/
private final static Logger logger = LoggerFactory.getLogger(ControlServiceImple.class);
@Resource(name="controlInfoMapper")
ControlInfoMapper controlInfoMapper;
public void setControlInfoMapper(ControlInfoMapper controlInfoMapper) {
this.controlInfoMapper = controlInfoMapper;
}
@Override
public void updateControlInfo(ControlInfoVo controlInfoVo) throws Exception {
// new一個controlInfo對象用於更新 對象,後面更新的時候更新這個對象即可;
ControlInfo controlInfo = new ControlInfo();
//獲取監控流水 即 主鍵 如果主鍵是空或者是null則不做更新操作;
String controlFlow = controlInfoVo.getControlFlow();
if(!"".equals(controlFlow) && null != controlFlow){
ControlInfo sysControlInfo = controlInfoMapper.selectByPrimaryKey(controlFlow);
if(sysControlInfo != null){
// 更新所有字段
controlInfo.setControlFlow(controlInfoVo.getControlFlow());
// 處理描述字段更新
controlInfo.setProcessDesc(controlInfoVo.getProcessDesc());
controlInfo.setErrorType(controlInfoVo.getErrorType());
controlInfo.setDeployCode(controlInfoVo.getDeployCode());
controlInfo.setCreateDate(controlInfoVo.getCreateDate());
controlInfo.setCreater(controlInfoVo.getCreater());
controlInfo.setUpdater(controlInfoVo.getUpdater());
controlInfo.setUpdaterTime(controlInfoVo.getUpdaterTime());
controlInfo.setProcessStatus(controlInfoVo.getProcessStatus());
controlInfoMapper.updateByPrimaryKey(controlInfo);
logger.info("更新成功");
}else{
logger.info("對不起!該用戶名主鍵不存在!");
}
}
}
@Override
public List<ControlInfoVo> queryControlInfos(Map<String, String> map) {
// 查詢的時候傳遞map過來,封裝參數
return null;
}
/**
* 查詢終端監控相關信息
* @param parMap
* @return
*/
@Override
public List<TerminalMonitor> queryControlInfoVoList(Map<String, String> parMap) {
List<TerminalMonitor> list = controlInfoMapper.findControlInfoList(parMap);
if(list == null || list.size() == 0){
return null;
}
// 這裏的vo還需要嗎?
// List<ControlInfoVo> voList = new ArrayList<ControlInfoVo>();
// for (int i = 0; i < list.size(); i++) {
// ControlInfo controlInfo = list.get(i);
// ControlInfoVo vo = new ControlInfoVo();
// vo.setCreateDate(controlInfo.getCreateDate());
// vo.setCreater(controlInfo.getCreater());
// voList.add(vo);
// }
logger.info("查詢結束");
return list;
}
}
Junit測試代碼如下:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.boomhope.model.ControlInfoVo;
import com.boomhope.po.TerminalMonitor;
import com.boomhope.service.IControlService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@RunWith(SpringJUnit4ClassRunner.class)
//表示繼承了SpringJUnit4ClassRunner類
@ContextConfiguration("classpath:applicationContext.xml")
public class ControlInfoTest {
@SuppressWarnings("unused")
private final static Logger log = LoggerFactory.getLogger(ControlInfoTest.class);
@Resource(name="mycontrolService")
IControlService controlService;
public void setControlService(IControlService controlService) {
this.controlService = controlService;
}
//測試更新controlInfo
@Test
public void updateControlInfo() throws Exception{
String controlFlow = "001";
String processDesc = "該攝像頭已經維修完畢,並經過測試";
String errorType = "1";
String deployCode = "01";
ControlInfoVo newControlInfo = new ControlInfoVo();
newControlInfo.setControlFlow(controlFlow);
newControlInfo.setProcessDesc(processDesc);
newControlInfo.setErrorType(errorType);
newControlInfo.setDeployCode(deployCode);
controlService.updateControlInfo(newControlInfo);
}
// 測試分頁查詢
@SuppressWarnings("unchecked")
@Test
public void queryControlInfo(){
Page<TerminalMonitor> page = PageHelper.startPage(1, 2,"c.create_date desc");
Map<String,String> map = new HashMap<String,String>();
map.put("deployCode", "01");
map.put("macBrand", "mac_brand");
map.put("errorType", "3");
map.put("unitName", "unit_name");
// 先分頁再查詢
PageInfo<TerminalMonitor> pageInfo = new PageInfo<TerminalMonitor> (page);
controlService.queryControlInfoVoList(map);
List<TerminalMonitor> list = pageInfo.getList();
log.info("size:"+list.size()+" list.toString:"+list.toString());
}
}
測試結果如下: