Mybatisがディレクトリツリーに出会った時に、完璧な解決策があります。
あなたもこのような場面に遭遇したことがあると思いますが、二級カタログはどの一級カタログに属していますか?
一般的には、
方式一:xml直接実現
ここに
テーブル構造は以下の通りです
みんなはデータの種類の規範に関心を持たないでください。例えば、ここ
デザート/ケーキの
エンティティクラスは
フロントエンドに戻す必要がある集約モデル
二級のケーキ、お菓子に分類されると、どのような対応がありますか?三級の分類は先端に提供され、展示しやすいです。
私は
ここでは
なお、2級分類のエンティティ類
今はデータベースの例を変えますが、前の処理と同じです。
データテーブルは以下の通りです
テーブル構造は以下の通りです
前の例と大同小異、
フロントエンドに戻す必要がある
結果を再帰的に調べると、
サンプルデータは以下の通りです。
Mybatis
がディレクトリツリーに会ったら、どのような解決方法がありますか?一般的には、
xml
によって直接的に実装され、java
コードの再帰的な割り当てが実現される。方式一:xml直接実現
ここに
category
データテーブルのデータが表示されます。テーブル構造は以下の通りです
type
は分類タイプ、つまりディレクトリレベルを表し、1は1級ディレクトリ、3は3級ディレクトリを表しています。みんなはデータの種類の規範に関心を持たないでください。例えば、ここ
id
はbigint
、type
はtinyint
などができるのに、私が見た例をつかんで直接説明します。デザート/ケーキの
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_id
は1
のサブ分類データ、つまりデザート/ケーキの分類の下の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
結果は以下のとおりです二級のケーキ、お菓子に分類されると、どのような対応がありますか?三級の分類は先端に提供され、展示しやすいです。
私は
CategoryVO
、SubCategoryVO
に分けています。すべての属性を一つの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
にバックエンドに伝え、バックエンドはこのid
をid
としてサブカテゴリを調べます。最後に私たちは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ディレクトリの詳細については、以前の記事を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。