以下是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流程图大致如下