MyBatis自身集合嵌套,递归查询目录树(适用于MySQL、ORACLE等数据库,递归代码都写在XML中,通过SQL完成)

JAVA代码实现(链接):MySql、Oracle(通用方法)递归查询生成文件目录树(JAVA实现 递归过程中不访问数据库,递归之前只访问两次 进行递归前数据准备)

以下是XML中实现文件树的查询、递归

场景:根据交易编码,查询文件树

文件、文件夹都存放TRADER_INFO_FILE表中

实体类

public class TradeInfoFile {
    // 文件编码(子)
    private String fileCode;
    // 所属文件编码(父)
    private String belongFileCode;
    // 交易信息编码
    private String finTradeCode;
    // 是否是文件夹
    private Boolean isDirFlag;
    //最后修改时间
    private Date lastModifyTime;
    /*
      children属性不与数据库中TRADER_INFO_FILE标建立映射关系
    */
    @Transient // import javax.persistence.Transient;
    private List<TradeInfoFile> children;
    //省略set/get方法.......................
    
    // 创建文件根节点
    public static TradeInfoFile createRoot(List<TradeInfoFile> fileTree) {
      TradeInfoFile root = new TradeInfoFile();
      root.setFileCode("-1");
      root.setBelongFileCode("根节点");
      root.setChildren(fileTree);
      return root;
    }
}

Controller层

@RestController
@RequestMapping("/trade-file")
public class TradeInfoController {
​
    @Autowired
    private TradeInfoService tradeInfoService;
    
    // 查询文件树,一个交易信息编码可以对应多个文件和文件夹
    @GetMapping(value = "/{id}/file-tree") // 交易信息编码
    public TradeInfoFile getFileTree(@RequestParam(name = "id") String finTradeCode) {
        TradeInfoFile entity = new TradeInfoFile();
        entity.setFinTradeCode(finTradeCode);
        return tradeInfoService.getFileTree(entity);
    }
}

Service层

public interface TradeInfoService {
    public TradeInfoFile getFileTree(TradeInfoFile entity);
}
​
@Service
public class TradeInfoFileServiceImpl implements TradeInfoService{
​
    @Autowired
    private TradeInfoFileMapper tradeInfoFileMapper;
    
    @Override
    // 查询目录树
    public TradeInfoFile getFileTree(TradeInfoFile entity) {
         List<TradeInfoFile> fileTree = tradeInfoFileMapper.getFileTree(entity);
         return TradeInfoFile.createRoot(fileTree);
    }

mapper

public interface TradeInfoFileMapper {
    public List<TradeInfoFile> getFileTree(TradeInfoFile entity);
}

xml文件

  <resultMap id="BaseFileTreeResultMap" type="com.itcast.domain.TradeInfoFile" >
    <result column="FILE_CODE" property="fileCode" jdbcType="VARCHAR" />
    <result column="BELONG_FILE_CODE" property="belongFileCode" jdbcType="VARCHAR" />
    <result column="FIN_TRADE_CODE" property="finTradeCode" jdbcType="VARCHAR" />
    <result column="IS_DIR_FLAG" property="isDirFlag" jdbcType="BIT" />
    <result column="LAST_MODIFY_TIME" property="lastModifyTime" jdbcType="TIMESTAMP" />
    <result column="AVAILAB_FLAG" property="availabFlag" jdbcType="BIT" />
    <collection column="{fileCode=FILE_CODE,finTradeCode=FIN_TRADE_CODE}" 
                property="children"
                javaType="java.util.ArrayList" 
                ofType="com.itcast.domain.TradeInfoFile" 
                select="getNextNodeFileTree" />
  </resultMap>
  <resultMap id="nextFileTreeResultMap" type="com.itcast.domain.TradeInfoFile" >
    <result column="FILE_CODE" property="fileCode" jdbcType="VARCHAR" />
    <result column="BELONG_FILE_CODE" property="belongFileCode" jdbcType="VARCHAR" />
    <result column="FIN_TRADE_CODE" property="finTradeCode" jdbcType="VARCHAR" />
    <result column="IS_DIR_FLAG" property="isDirFlag" jdbcType="BIT" />
    <result column="LAST_MODIFY_TIME" property="lastModifyTime" jdbcType="TIMESTAMP" />
    <result column="AVAILAB_FLAG" property="availabFlag" jdbcType="BIT" />
    <collection column="{fileCode=FILE_CODE,finTradeCode=FIN_TRADE_CODE}" 
                property="children"
                javaType="java.util.ArrayList" 
                ofType="com.itcast.domain.TradeInfoFile" 
                select="getNextNodeFileTree" />
  </resultMap>
  <select id="getFileTree" parameterType="com.itcast.domain.TradeInfoFile" resultMap="BaseFileTreeResultMap">
    SELECT FILE_CODE,BELONG_FILE_CODE,FIN_TRADE_CODE,IS_DIR_FLAG,LAST_MODIFY_TIME,AVAILAB_FLAG
      FROM TRADE_INFO_FILE
     WHERE FIN_TRADE_CODE = #{ finTradeCode } 
       AND BELONG_FILE_CODE = '0' 
       AND AVAILAB_FLAG = TRUE 
     ORDER BY IS_DIR_FLAG DESC,LAST_MODIFY_TIME DESC
  </select>
  <select id="getNextNodeFileTree" resultMap="nextFileTreeResultMap">
    SELECT FILE_CODE,BELONG_FILE_CODE,FIN_TRADE_CODE,IS_DIR_FLAG,LAST_MODIFY_TIME,AVAILAB_FLAG
      FROM TRADE_INFO_FILE
     WHERE FIN_TRADE_CODE = #{ finTradeCode } 
       AND BELONG_FILE_CODE = #{ fileCode } 
       AND AVAILAB_FLAG = TRUE 
       ORDER BY IS_DIR_FLAG DESC,LAST_MODIFY_TIME DESC 
    <!-- 递归查询时,因为FIN_TRADE_CODE字段上建立了索引,索引加入这个条件 -->
  </select>

 

XML流程图大致如下

猜你喜欢

转载自blog.csdn.net/li_tiantian/article/details/85762731