mybatis一對多高效級聯查詢


使用場景:對於有父子關系的一對多級聯查詢,最簡單的比如一條sql返回省市區的級聯關系

數據庫關系圖:

 

 

數據庫:

省份表

CREATE TABLE `position_provice` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`provice_id` int(11) unsigned NOT NULL COMMENT '省份id、省份編號',
`provice_name` char(32) NOT NULL COMMENT '省份名稱',
PRIMARY KEY (`id`),
UNIQUE KEY `provice_id` (`provice_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

市級

CREATE TABLE `position_city` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`province_id` int(10) unsigned NOT NULL COMMENT '省id(父id)',
`city_id` bigint(20) unsigned NOT NULL COMMENT '市id',
`city_name` char(64) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `city_id` (`city_id`) USING BTREE,
KEY `province_id` (`province_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=346 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

 

區縣

CREATE TABLE `position_county` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '縣級主鍵',
`city_id` bigint(20) unsigned NOT NULL COMMENT '市id(父id)',
`county_id` bigint(20) unsigned NOT NULL COMMENT '縣級id',
`county_name` char(64) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `county_id` (`county_id`) USING BTREE,
KEY `city_id` (`city_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2857 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

 

實體類VO關系:

/**
 * 省級實體
 * Created by Admin on 2019/2/15.
 */
public class Province implements Serializable {

    private static final long serialVersionUID = 7513759370791928018L;

    private String value;

    private String label;

    private List<City> children;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public List<City> getChildren() {
        return children;
    }

    public void setChildren(List<City> children) {
        this.children = children;
    }
}

 

/**
 * 市級實體
 * Created by Admin on 2019/2/15.
 */
public class City  implements Serializable{

    private static final long serialVersionUID = 6804704927100589037L;

    private String value;

    private String label;

    private String pId;
    
    private List<Region> children;

 

 

 

/**
 * 區級實體
 * Created by Admin on 2019/2/15.
 */
public class Region implements Serializable {


    private static final long serialVersionUID = 5384031670312405686L;

    private String value;

    private String label;

    private String cId;

    public String getcId() {
        return cId;
    }

 

 

 mybatis:

    <resultMap id="ProvinceMap" type="cn.grains.dubbo.system.Model.Province" >
        <result column="provice_id" property="label" jdbcType="VARCHAR" />
        <result column="provice_name" property="value" jdbcType="VARCHAR"/>
        <collection property="children" ofType="cn.grains.dubbo.system.Model.City">
            <result column="city_id" property="label"/>
            <result column="city_name" property="value"/>
            <collection property="children" ofType="cn.grains.dubbo.system.Model.Region">
                <result column="county_id" property="label"/>
                <result column="county_name" property="value"/>
            </collection>
        </collection>
    </resultMap>


    <select id="getSpecificPlace" resultMap="ProvinceMap">
        SELECT *FROM position_provice pp
        LEFT JOIN position_city pci ON pp.provice_id = pci.province_id
        LEFT JOIN position_county pco ON pci.city_id = pco.city_id
    </select>

運行查看結果:

 

 

 

 

 

 結果完全對的上,OK。

我們再來看看mybatis的標簽<collection >

property:VO關聯字段
ofType:從表所對應的VO。



免責聲明!

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



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