使用ResultType處理mybatis多表通過外鍵查詢

開發背景:公司使用的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());
		
	}
	
	
	
	
}

測試結果如下:












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章