使用mybatis进行无限极分类查询

有时候我们在用mbatis做dao层的时候会遇到一些比较棘手的问题,比如无限极分类查询,因为mybatis是根据sql进行查询的,而sql是无法直接进行无限极分类查询的,所以我们就要想想其他办法,通过查找资料,我们发现,可以通过在mybatis中association标签使用select关键字就可以引入另一条sql,这样我们就可以进行无限极分类了,代码如下

首先我们创建一个数据库表,并插入测试用的数据,如下

CREATE TABLE catalog(
id INT(30)  AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(32),
pid INT(30)
)

INSERT INTO catalog (NAME,pid) VALUES ('水果',0)
INSERT INTO catalog (NAME,pid) VALUES ('饮料',0)
INSERT INTO catalog (NAME,pid) VALUES ('蔬菜',0)
INSERT INTO catalog (NAME,pid) VALUES ('热带水果',1)
INSERT INTO catalog (NAME,pid) VALUES ('芒果',4)
INSERT INTO catalog (NAME,pid) VALUES ('象牙芒果',5)
INSERT INTO catalog (NAME,pid) VALUES ('矿泉水',2)
INSERT INTO catalog (NAME,pid) VALUES ('农夫山泉',7)

创建实体类

package com.example.demo.domain;

public class Catalog {
    private Integer id;

    private String name;

    private Catalog catalog;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public Catalog getCatalog() {
        return catalog;
    }

    public void setCatalog(Catalog catalog) {
        this.catalog = catalog;
    }
}

catalog对应的mapper

package com.example.demo.mapper;

import com.example.demo.domain.Catalog;
import org.springframework.stereotype.Repository;

import java.util.List;
@Repository
public interface CatalogMapper {
    List<Catalog> selectAll();
}

还有我们最重要的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.example.demo.mapper.CatalogMapper">
  <resultMap id="BaseResultMap" type="com.example.demo.domain.Catalog">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <!--我们可以利用association的select关键字进行查询,他可以关联另一条sql,方便我们进行查询子目录-->
    <association column="id" jdbcType="INTEGER" property="catalog" select="selectByPid"/>
  </resultMap>

  <!--这是查询子目录的sql,条件是父级的id-->
  <select id="selectByPid" resultMap="BaseResultMap">
    select id,name,pid from catalog where pid=#{id};
  </select>

  <!--我们在项目中进行查询的时候尽量不要用*号,尽量把要查询的字段写全,这样可以提高效率 -->
 <!--为了给读者更好的呈现出分类的效果,我这里只查一级分类,也就是pid为0的,通过一级分类去查子目录,孙目录......-->
<select id="selectAll" resultMap="BaseResultMap"> select id,name from catalog where pid=0 </select> </mapper>

这是测试类,为了省事,我直接使用springboot了

package com.example.demo;

import com.example.demo.domain.Catalog;
import com.example.demo.mapper.CatalogMapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Calendar;
import java.util.List;

@SpringBootApplication
@RestController
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

    @Autowired
    private CatalogMapper catalogMapper;

    @GetMapping("/getCatalog")
    public List<Catalog> getCatalog(){
        List<Catalog> catalogs = catalogMapper.selectAll();
        return catalogs;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

这是最终的结果,我直接采用json进行显示了

[
  {
    "id": 1,
    "name": "水果",
    "catalog": {
      "id": 4,
      "name": "热带水果",
      "catalog": {
        "id": 5,
        "name": "芒果",
        "catalog": {
          "id": 6,
          "name": "象牙芒果",
          "catalog": null
        }
      }
    }
  },
  {
    "id": 2,
    "name": "饮料",
    "catalog": {
      "id": 7,
      "name": "矿泉水",
      "catalog": {
        "id": 8,
        "name": "农夫山泉",
        "catalog": null
      }
    }
  },
  {
    "id": 3,
    "name": "蔬菜",
    "catalog": null
  }
]

这是项目结构

原文地址:https://www.cnblogs.com/liouzeshuen/p/10428212.html