使用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
  }
]

這是項目結構

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM