Maison  >  Article  >  Java  >  Comment utiliser springboot+mybatis plus pour implémenter une requête arborescente

Comment utiliser springboot+mybatis plus pour implémenter une requête arborescente

WBOY
WBOYavant
2023-05-21 17:01:062511parcourir

Contexte

Dans le processus de développement actuel, il est souvent nécessaire d'interroger l'arborescence des nœuds et d'obtenir la liste des nœuds enfants en fonction du nœud spécifié. L'opération d'obtention de l'arborescence des nœuds est enregistrée ci-dessous, en cas d'urgence.

Les scénarios d'utilisation

peuvent être utilisés pour les structures de données avec des relations hiérarchiques telles que les organisations de départements système, les classifications de produits, les relations entre les villes, etc. quitte le nœud, le modèle de données est le suivant :


id

code

nameparent_codeComputer0 010000100 00 1000110001Code d'implémentation
CREATE TABLE `tree_table` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT "主键ID",
  `code` varchar(10) NOT NULL COMMENT "编码",
  `name` varchar(20) NOT NULL COMMENT "名称",
  `parent_code` varchar(10)  NOT NULL COMMENT "父级编码",
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT="树形结构测试表";
Données de la table
1 10000
2 20000 Téléphone portable
3 10001 Notebook Lenovo
4 10002 HP notebook
5 1000101 Lenovo Sauveur
6 1000102 Lenovo Xiaoxin Series
Structure de la table

INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("10000", "电脑", "0");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("10001", "联想笔记本", "10000");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("10002", "惠普笔记本", "10000");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("1000101", "联想拯救者", "10001");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("1000102", "联想小新系列", "10001");

Entity

@Data
@TableName("tree_table")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TreeTable {

    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 编码
     */
    private String code;
    /**
     * 名称
     */
    private String name;
    /**
     * 父级编码
     */
    private String parentCode;

    /**
     * 子节点
     */
    @TableField(exist = false)
    private List<TreeTable> childNode;
}

mybatis


mapper

public interface TreeTableMapper extends BaseMapper<TreeTable> {
    /**
     * 获取树形结构数据
     *
     * @return 树形结构
     */
    public List<TreeTable> noteTree();
}

xml

<?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.springboot.example.mysqltree.mapper.TreeTableMapper">
    <resultMap id="BaseResultMap" type="com.springboot.example.mysqltree.model.entity.TreeTable">
        <result column="id" property="id"/>
        <result column="code" property="code"/>
        <result column="name" property="name"/>
        <result column="parent_code" property="parentCode"/>
    </resultMap>
    <resultMap id="NodeTreeResult" type="com.springboot.example.mysqltree.model.entity.TreeTable"
               extends="BaseResultMap">
        <collection property="childNode" column="code" ofType="com.springboot.example.mysqltree.model.entity.TreeTable"
                    javaType="java.util.ArrayList" select="nextNoteTree">

        </collection>
    </resultMap>

    <sql id="Base_Column_List">
                id,
                code,
                `name`,
                parent_code
    </sql>
   
    <select id="nextNoteTree" resultMap="NodeTreeResult">
        select
        <include refid="Base_Column_List"/>
        from tree_table
        where parent_code=#[code]
    </select>
    <select id="noteTree" resultMap="NodeTreeResult">
        select
        <include refid="Base_Column_List"/>
        from tree_table
        where parent_code="0"
    </select>
</mapper>

noteTree : récupère toutes les données du nœud parent ;


nextNoteTree : boucle pour obtenir les données du nœud enfant jusqu'à la fin du nœud feuille

  • colonne : nom de la colonne de la table associée ;

  • ofType : Type de retour

  • Classe de démarrage

    @Slf4j
    @Component
    public class TreeTableCommandLineRunner implements CommandLineRunner {
        @Resource
        private TreeTableMapper treeTableMapper;
    
        @Override
        public void run(String... args) throws Exception {
            log.info(JSONUtil.toJsonPrettyStr(treeTableMapper.noteTree()));
        }
    }
  • Effet final
  • [
        {
            "code": "10000",
            "childNode": [
                {
                    "code": "10001",
                    "childNode": [
                        {
                            "code": "1000101",
                            "childNode": [
                            ],
                            "parentCode": "10001",
                            "name": "联想拯救者",
                            "id": 5
                        },
                        {
                            "code": "1000102",
                            "childNode": [
                            ],
                            "parentCode": "10001",
                            "name": "联想小新系列",
                            "id": 6
                        }
                    ],
                    "parentCode": "10000",
                    "name": "联想笔记本",
                    "id": 3
                },
                {
                    "code": "10002",
                    "childNode": [
                    ],
                    "parentCode": "10000",
                    "name": "惠普笔记本",
                    "id": 4
                }
            ],
            "parentCode": "0",
            "name": "电脑",
            "id": 1
        }
    ]

    Notes

Lors de l'utilisation de mybatis, si le mapper XML ne peut pas être chargé, vous devez ajouter la configuration suivante à pom.xml :

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
</resources>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer