mybatis的resultMap映射心得
<!-- 查询用户商品信息 ,多对多--> <resultMap type="cn.itcast.po.user" id="usermappingitem"> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="usercode" property="usercode"/> <result column="sex" property="sex"/> <!-- 配置orders --> <collection property="orders" ofType="cn.itcast.po.Order"> <id column="id" property="id"/> <result column="number" property="number"/> <result column="price" property="price"/> <!-- 配置orderdetail --> <collection property="orderdetail" ofType="cn.itcast.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="order_id" column="orderId"/> <result property="item_num" column="itemNum"/> <association property="item" javaType="cn.itcast.po.Item"> <id column="item_id" property="id"/> <result column="name" property="name"/> <result column="price" property="price"/> </association> </collection> </collection> </resultMap> <!-- 查询用户商品信息 ,sql--> <select id="findItemsOfUser" resultMap="usermappingitem"> SELECT orders.*, USER .username, USER .usercode, USER .sex, orderdetail.id orderdetail_id, orderdetail.item_id, orderdetail.item_num, item.name, item.price FROM orders, USER, orderdetail, item WHERE orders.user_id = USER .id AND orders.id = orderdetail.order_id AND orderdetail.item_id = item.id </select>
如上面所示是今天练习resultmap所用到的配置以及SQL语句,原先错误理解了老师的讲解,因为是查询用户订单中的商品信息,是一个多对多的关系,所以user表是主表,item表是从表。在定义user类的bean时,出了user的基本信息外还包含订单集合即orders集合属性,同样的order类中还包含orderdetail集合属性,orderdetail类中则包含item对象属性,它们关系如下:
user表————(一对多)orders表————(一对多)orderdetail表————(一对一)item表
而我原先以为要想注入各个对象的属性值需要在它的父级表中有所定义(user表是最高父级除外),例如,如果我想要让查询到的order结果包含order对象中的id,number,price等属性时那么我需要在user类中定义这些属性才能将数据注入这些属性。其实不然,待实验之后发现,这些属性其实是和查询条件相关,即如果你的查询条件中包含你所需要注入的属性时查询数据才能注入到属性中,否则数据无法注入为null而和是否在父级类中有无定义没有关系,当然,你的查询字段名称要和你po类中的属性名称相对应,例如,如果某个查询字段有别名那么你需要申明resultmap中column和property值对应(上边蓝色背景),column=表中字段名称,property=po类(上边绿色背景)中属性名称。