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
标签循环。