> 文档中心 > Mybati通过collection实现级联列表查询,实现自动封装List数据

Mybati通过collection实现级联列表查询,实现自动封装List数据

在开发中,比如我们两个表,一个主表和一个子表,并且是一对多的关系。

我们想要实现一种数据格式,一个实体中有一些主表字段,和一个List子表实体

实体结果如下:

// 子表实体public class Car{    private String id;    private String userId;private String carName;private Double money;private String color;}// 主表实体public class UserInfo{    private String id;private String user;private Integer age;private String mbile;private List<Car> carList

Json结果如下:

{   "id":"123",   "user":"zhangsan",   "age":20,   "mbile":"123456",   "carList":[    { "id":"1","userId":"123","carName":"大众","money":111.22,"color":"green"},    { "id":"2","userId":"123","carName":"宝马","money":222.22,"color":"white"},    { "id":"3","userId":"123","carName":"本hi","money":333.22,"color":"grey"}   ]}

方式一:
为了实现上述的数据结构,可以通过Java代码实现,逻辑为:先查询出主表的列表数据然后根据主表ID再查询子表的列表数据,然后通过setList()方法封装数据;

方式二:
使用Mybati提供的collection标签,在查询时直接封装好数据,然后返回给Java

创建resultMap标签:

    <resultMap id="UserInfoResultMap" type="com.org.UserInfo"> <id column="a_id" jdbcType="VARCHAR" property="id"/> <result column="a_user" jdbcType="VARCHAR" property="user"/> <result column="a_age" jdbcType="INTEGER" property="age"/> <result column="a_mbile" jdbcType="VARCHAR" property="mbile"/> <collection property="carList" ofType="com.org.Car">     <id column="b_id" jdbcType="VARCHAR" property="id"/>     <result column="b_user_id" jdbcType="VARCHAR" property="userId"/>     <result column="b_car_ame" jdbcType="VARCHAR" property="carName"/>     <result column="b_money" jdbcType="NUMERIC" property="money"/>     <result column="b_color" jdbcType="VARCHAR" property="color"/> </collection>    </resultMap>

编写SQL:

    <select id="selectUserInfo" resultMap="UserInfoResultMap"> select     a.id as a_id,a.user as a_user,a.age as a_age,a.mbile as a_mbile,     b.id as b_id,b.userId as b_user_d,b.carName as b_car_name,b.money as b_money,b.color as b_color from userInfo a left join car ON a.id = b.user_id    </select>

注意:
标签可以嵌套多层,只要与相应对象的实体字段匹配就行,比如:实体类是四层List循环,那么就有四层collection标签循环。