Mybatisがディレクトリツリーに出会った時に、完璧な解決策があります。


あなたもこのような場面に遭遇したことがあると思いますが、二級カタログはどの一級カタログに属していますか?Mybatisがディレクトリツリーに会ったら、どのような解決方法がありますか?
一般的には、xmlによって直接的に実装され、javaコードの再帰的な割り当てが実現される。
方式一:xml直接実現
ここにcategoryデータテーブルのデータが表示されます。

テーブル構造は以下の通りです
typeは分類タイプ、つまりディレクトリレベルを表し、1は1級ディレクトリ、3は3級ディレクトリを表しています。
みんなはデータの種類の規範に関心を持たないでください。例えば、ここidbiginttypetinyintなどができるのに、私が見た例をつかんで直接説明します。
デザート/ケーキのidは1で、ケーキとお菓子のfather_idは1で、カタログはビスケット/ベント化のidは2で、ビスケット、ポテトチップス、エビの条のfather_idは2で、1級の目次idは2に対応する2級のサブディレクトリのfather_idで、これは対応関係に属して、親子の関係と理解することができます。
エンティティクラスはmybatis-generatorプラグインで自動的に生成されます。

public class Category {
    private Integer id;
    private String name;
    private Integer type;
    private Integer fatherId;
    private String logo;
    private String slogan;
    private String catImage;
    private String bgColor;
    //=====    ,  Getter Setter  ======
	......
}
普通、私たちが見ているショッピングセンターでは、マウスを一級のカタログに置くと、二級の分類目録が表示されます。私たちの需要はマウスが1級の分類に移動する時、2級の分類と3級の分類を提供する必要があります。

フロントエンドに戻す必要がある集約モデルview objectデータをここに貼り付けます。

/**
 *     VO
 */
public class CategoryVO {
    private Integer id;
    private String name;
    private String type;
    private Integer fatherId;
    //     vo list
    private List<SubCategoryVO> subCatList;
	//=====    ,  Getter Setter  ======
	......
}

public class SubCategoryVO {
    private Integer subId;
    private String subName;
    private String subType;
    private Integer subFatherId;
    //=====    ,  Getter Setter  ======
	......
}
これは、リンククエリサブディレクトリのテクニックに関連しています。father_id1のサブ分類データ、つまりデザート/ケーキの分類の下の2級と3級の分類を調べてみます。次のような文を実行します。

SELECT
	f.id AS id,
	f.`name` AS `name`,
	f.type AS type,
	f.father_id AS fatherId,
	c.id AS subId,
	c.`name` AS subName,
	c.type AS subType,
	c.father_id AS subFatherId 
FROM
	category f
	LEFT JOIN category c ON f.id = c.father_id 
WHERE
	f.father_id = 1
結果は以下のとおりです

二級のケーキ、お菓子に分類されると、どのような対応がありますか?三級の分類は先端に提供され、展示しやすいです。
私はCategoryVOSubCategoryVOに分けています。すべての属性を一つのVOに置くのではなく、理解しやすいためです。Listセットではなく、すべてのプロパティをVOに置いて、フロントエンドが受け取ったデータ形式は、あなたがデータベースで調べたのと同じです。複数のケーキ記録があります。下には様々な具体的な食品が対応しています。これによって、先端がよくないということも論理的には、ケーキの分類は一つしかないはずです。そしてこの分類の中にはケーキを入れた行列があります。

ここではCategoryVOだけで処理できます。後の第二の方法でjavaコードでマルチレベルのディレクトリを処理する時、私は一つのCategoryVOだけで処理できます。
なお、2級分類のエンティティ類CategoryVOは、1つある。

private List<SubCategoryVO> subCatList;
このsubCatListは、3段階の分類を保存するためのvo listであり、xmlにおいて3段階の分類はcollectionを用いて、これに対応するlistを用いている。

<?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.me.mapper.CategoryMapperCustom" >
  <resultMap id="myCategoryVO" type="com.me.pojo.vo.CategoryVO">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="type" property="type"/>
      <!--
       column    sql     ,property            
         sql as    ,  column   fatherId,      ,    father_id
       -->
    <result column="fatherId" property="fatherId"/>

    <!--
      collection   :       list         
      property:       list   
      ofType:     ,     vo
    -->
    <collection property="subCatList" ofType="com.me.pojo.vo.SubCategoryVO">
      <id column="subId" property="subId"/>
      <result column="subName" property="subName"/>
      <result column="subType" property="subType"/>
      <result column="subFatherId" property="subFatherId"/>
    </collection>
  </resultMap>

  <select id="getSubCatList" resultMap="myCategoryVO" parameterType="int">
    SELECT
        f.id as id,
        f.`name` as `name`,
        f.type as type,
        f.father_id as fatherId,
        c.id as subId,
        c.`name` as subName,
        c.type as subType,
        c.father_id as subFatherId
    FROM
        category f
    LEFT JOIN
        category c
    on
        f.id = c.father_id
    WHERE
        f.father_id = #{rootCatId}
  </select>
</mapper>
まず、フロントエンドをトップページの一級の分類に表示させ、フロントエンドを一級の分類インターフェースに呼び出し、typeのデータをフロントエンドに戻し、マウスを一級の分類に移動させるだけで、サブ分類を取得するインターフェースを呼び出し、フロントエンドは対応する一級の分類の1にバックエンドに伝え、バックエンドはこのididとしてサブカテゴリを調べます。最後に私たちはfather_idを呼び出してすべてのディレクトリを得ることができます。

  @Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public List<CategoryVO> getSubCatList(Integer rootCatId) {
        return categoryMapperCustom.getSubCatList(rootCatId);
    }
最後のデータは以下の通りです。

{
	"status": 200,
	"msg": "OK",
	"data": [{
		"id": 11,
		"name": "  ",
		"type": "2", <==================type=2      
		"fatherId": 1,
		"subCatList": [{
			"subId": 37,
			"subName": "   ",
			"subType": "3", <================subType=3  3   
			"subFatherId": 11
		}, {
			"subId": 38,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 39,
			"subName": "    ",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 40,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 41,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 42,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 43,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 11
		}]
	}, {
		"id": 12,
		"name": "  ",
		"type": "2",
		"fatherId": 1,
		"subCatList": [{
			"subId": 44,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 45,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 46,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 47,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 48,
			"subName": "  ",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 49,
			"subName": "   ",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 50,
			"subName": "    ",
			"subType": "3",
			"subFatherId": 12
		}]
	}]
}
方式二:javaコードは再帰的に二級三級ディレクトリを処理する。
今はデータベースの例を変えますが、前の処理と同じです。
データテーブルは以下の通りです

テーブル構造は以下の通りです

前の例と大同小異、getSubCatListは依然としてディレクトリレベルを表しています。
フロントエンドに戻す必要があるtypeは以下の通りです。今はVOと書いただけです。書き込み子CategoryVOがありません。前の方法と比べてみてもいいです。道理は同じです。

public class CategoryVO {
    private Integer id;
    private String name;
    private Integer type;
    private Integer parentId;
    private Integer orderNum;
    private Date createTime;
    private Date updateTime;
    private List<CategoryVO> childCategory = new ArrayList<>();
    //=====    ,  Getter Setter  ======
	......
}

  @Override
    public List<CategoryVO> listCategoryForCustomer(Integer parentId) {
        ArrayList<CategoryVO> categoryVOList = new ArrayList<>();
        recursivelyFindCategories(categoryVOList, parentId);
        return categoryVOList;
    }
	//   parentId         ,           ,categoryVOList                
    private void recursivelyFindCategories(List<CategoryVO> categoryVOList, Integer parentId) {
        //          ,       "   "
        List<Category> list= categoryMapper.selectCategoriesByParentId(parentId); //    id     
        if (!CollectionUtils.isEmpty(list)) {
            for (int i = 0; i < list.size(); ++i) {
                Category category = list.get(i);
                CategoryVO categoryVO = new CategoryVO();
                BeanUtils.copyProperties(category, categoryVO);
                categoryVOList.add(categoryVO);
                //       id       id,           ,getChildCategory()        List<CategoryVO> childCategory
                recursivelyFindCategories(categoryVO.getChildCategory(), categoryVO.getId());
            }
        }
    }
VOファイルは以下の通りです。

......
  <resultMap id="BaseResultMap" type="com.me.mall.model.pojo.Category">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="type" jdbcType="INTEGER" property="type" />
    <result column="parent_id" jdbcType="INTEGER" property="parentId" />
    <result column="order_num" jdbcType="INTEGER" property="orderNum" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
  </resultMap>
  <sql id="Base_Column_List">
    id, `name`, `type`, parent_id, order_num, create_time, update_time
  </sql>
  <select id="selectCategoriesByParentId" parameterType="int" resultMap="BaseResultMap">
    select <include refid="Base_Column_List"/>
    from category
    where parent_id = #{parentId}
  </select>
  ......
再帰的プロセスを手動で調べ、まずXMLに照会する。parent_idの二級分類である。

select *
from category
where parent_id = 3
在这里插入图片描述
結果を再帰的に調べると、3時にまだデータがあります。つまり、三級の分類があります。手動で調べてみます。

select *
from category
where parent_id = 4
在这里插入图片描述
サンプルデータは以下の通りです。

{
    "status": 10000,
    "msg": "SUCCESS",
    "data": [
        {
            "id": 4,
            "name": "    ",
            "type": 2, <=================      
            "parentId": 3,
            "orderNum": 1,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:10.000+0000",
            "childCategory": [ <===============        
                {
                    "id": 19,
                    "name": "   ",
                    "type": 3,
                    "parentId": 4,
                    "orderNum": 1,
                    "createTime": "2019-12-17T17:17:00.000+0000",
                    "updateTime": "2020-02-10T16:37:02.000+0000",
                    "childCategory": []
                }
            ]
        },
        {
            "id": 11,
            "name": "  ",
            "type": 2,
            "parentId": 3,
            "orderNum": 2,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T07:44:42.000+0000",
            "childCategory": []
        },
        {
            "id": 12,
            "name": "   ",
            "type": 2,
            "parentId": 3,
            "orderNum": 3,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:12.000+0000",
            "childCategory": []
        },
        {
            "id": 14,
            "name": "   ",
            "type": 2,
            "parentId": 3,
            "orderNum": 4,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:12.000+0000",
            "childCategory": []
        },
        {
            "id": 28,
            "name": "    ",
            "type": 2,
            "parentId": 3,
            "orderNum": 4,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:12.000+0000",
            "childCategory": []
        }
    ]
}
ここで、Mybatisがディレクトリツリーに遭遇したときに、どのような解決方法があるかについての記事を紹介します。Mybatisディレクトリの詳細については、以前の記事を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。