在开发中,比如我们两个表,一个主表
和一个子表
,并且是一对多
的关系。
我们想要实现一种数据格式,一个实体中有一些主表字段,和一个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>
注意:
<collection>
标签可以嵌套多层,只要与相应对象的实体字段匹配就行,比如:实体类是四层List循环,那么就有四层collection
标签循环。