使用場景:對於有父子關系的一對多級聯查詢,最簡單的比如一條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。