Mybatis实现递归查询查找子查询

Mybatis实现递归查询查找子查询

1.简单的数据结构

简单数据结构

2.实体类

import java.util.List;

/**
 * @ClassName AuditTabRele
 * @Description tab 关系表
 * @Author wangyj
 * @Date 19/11/7 18:38
 */

public class AuditTabRele {

    private String tabCode;
    private String tabName;
    private String pTabCode;
    private String tabSort;
    private List<AuditTabRele> subTabs;

    public String getTabCode() {
        return tabCode;
    }

    public void setTabCode(String tabCode) {
        this.tabCode = tabCode;
    }

    public String getTabName() {
        return tabName;
    }

    public void setTabName(String tabName) {
        this.tabName = tabName;
    }

    public String getpTabCode() {
        return pTabCode;
    }

    public void setpTabCode(String pTabCode) {
        this.pTabCode = pTabCode;
    }

    public String getTabSort() {
        return tabSort;
    }

    public void setTabSort(String tabSort) {
        this.tabSort = tabSort;
    }

    public List<AuditTabRele> getSubTabs() {
        return subTabs;
    }

    public void setSubTabs(List<AuditTabRele> subTabs) {
        this.subTabs = subTabs;
    }

    @Override
    public String toString() {
        return "AuditTabRele{" +
                "tabCode='" + tabCode + '\'' +
                ", tabName='" + tabName + '\'' +
                ", pTabCode='" + pTabCode + '\'' +
                ", tabSort='" + tabSort + '\'' +
                ", subTabs=" + subTabs +
                '}';
    }
}

3.Mapper文件

mybatis的javaType和ofType
都是指定对象的类型 不同的是当使用反向查询select从另一个maper文件中取出数据时必须用ofType
都可以为collection和association是指定对象的类型,
都不是必须写的, 只有反向select时需要ofType;

<?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.jeeplus.modules.china.mapper.SysNewIndexMapper" >

    <resultMap type="AuditTabRele" id="AuditTabReleResult">
        <result property="tabCode" column="TAB_CODE"/>
        <result property="tabName" column="TAB_NAME"/>
        <result property="pTabCode" column="P_TAB_CODE"/>
        <result property="tabSort" column="TAB_SORT"/>

        <!-- 一对多的关系 -->
        <!-- 查到的TAB_CODE作为下次查询的p_tab_code -->
        <collection property="subTabs" javaType="ArrayList" column="TAB_CODE" select="selectTabs" />
    </resultMap>
	
    <select id="selectTabs" resultMap="AuditTabReleResult">
        SELECT * FROM AUDIT_TAB_RELE  WHERE P_TAB_CODE = #{pTabCode}
    </select>


</mapper>

4.查询结果

{
	"tabs": [
		{
			"tabCode": "1",
			"tabName": "酬金",
			"pTabCode": "0",
			"tabSort": "1",
			"subTabs": [
				{
					"tabCode": "4",
					"tabName": "升档/平移类酬金",
					"pTabCode": "1",
					"tabSort": "1",
					"subTabs": [
						{
							"tabCode": "9",
							"tabName": "测试",
							"pTabCode": "4",
							"tabSort": "1"
						}
					]
				},
				{
					"tabCode": "5",
					"tabName": "宽带类酬金",
					"pTabCode": "1",
					"tabSort": "2"
				},
				{
					"tabCode": "6",
					"tabName": "数据类酬金",
					"pTabCode": "1",
					"tabSort": "3"
				},
				{
					"tabCode": "7",
					"tabName": "终端酬金",
					"pTabCode": "1",
					"tabSort": "4"
				},
				{
					"tabCode": "8",
					"tabName": "入网类酬金",
					"pTabCode": "1",
					"tabSort": "5"
				}
			]
		},
		{
			"tabCode": "2",
			"tabName": "新增用户异常",
			"pTabCode": "0",
			"tabSort": "2"
		},
		{
			"tabCode": "3",
			"tabName": "超合同",
			"pTabCode": "0",
			"tabSort": "3"
		}
	]
}

参考
MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MyBatis递归查询实现树形结构的查询。具体步骤如下: 1. 定义实体类 定义一个实体类,表示树的节点,包含节点id、父节点id、节点名称等属性。 2. 定义Mapper接口 定义一个Mapper接口,包含一个方法,用于查询树形结构的节点。方法的返回值为List集合,表示查询到的树形结构的节点。 3. 编写Mapper.xml配置文件 在Mapper.xml配置文件中,编写递归查询语句,通过查询语句实现树形结构的查询。具体实现方式如下: - 定义一个select语句,用于查询指定节点的所有子节点。 - 在select语句中,使用union all关键字连接多个子查询语句,实现递归查询。 - 在子查询语句中,使用with recursive关键字定义递归查询语句。 4. 调用Mapper接口 在Java代码中,调用Mapper接口的方法,获取查询到的树形结构的节点。可以通过递归遍历节点,实现树形结构的展示。 下面是一个示例代码,供参考: ``` // 定义实体类 public class TreeNode { private Integer id; private Integer parentId; private String name; // getter和setter方法 } // 定义Mapper接口 public interface TreeNodeMapper { List<TreeNode> selectTreeNodes(Integer parentId); } // 编写Mapper.xml配置文件 <select id="selectTreeNodes" parameterType="java.lang.Integer" resultType="TreeNode"> with recursive cte(id, parent_id, name) as ( select id, parent_id, name from tree_node where parent_id = #{parentId} union all select tn.id, tn.parent_id, tn.name from tree_node tn inner join cte on tn.parent_id = cte.id ) select * from cte; </select> // 调用Mapper接口 @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTreeNodes(Integer parentId) { return treeNodeMapper.selectTreeNodes(parentId); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值