MyBatis多对一查询的使用
一.抛出问题
什么是多对一:
- 多个学生对应一个老师
- 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!
- 多个订单对应一个用户
- 如果对于订单这边,就是一个多对一的现象,即从订单这边关联一个用户!
如何在查询订单的时候带出用户表中的用户名?
二.解决方式
1.单查询属性映射:
- 在订单表实体类中添加需要带出的用户属性
public class Order { private int id; private int userId; //添加要带出的用户账户属性 private String userAccount; private String orderNo; private String orderDate; private String consignee; private String phoneNum; //以下省略若干属性与get set方法 }
- 在查询时,要查询两张表的信息,使用resultType即可
<select id="getById" resultType="Order"> <!--此处的 useraccount列要取别名与订单Order中添加的属性名一致--> select o.*,u.account useraccount from mall_order o,mall_user u where o.id=#{id} and o.userid=u.id </select>
2.单查询类型映射:
- 在订单表实体类中,添加用户实体类型作为属性
public class Order { private int id; private int userId; //添加User类型作为属性 private User user; private String orderNo; private String orderDate; private String consignee; private String phoneNum; //以下省略若干属性与get set方法 }
在查询时,查询两张表信息,使用resultMap,映射对应属性
<select id="getById" resultMap="OrderResultMap"> select o.*,u.account from mall_order o,mall_user u where o.id=#{id} and o.userid=u.id </select> <resultMap id="OrderResultMap" type="Order"> <id column="id" property="id"/> <result column="userid" property="userId"/> <result column="orderno" property="orderNo"/> <result column="orderdate" property="orderDate"/> <result column="consignee" property="consignee"/> <result column="phonenum" property="phoneNum"/> <!--从user表中查到的account赋值给Order,User类的属性值--> <result column="account" property="user.account"/> </resultMap>
3.嵌套查询(查订单<多的一方>中嵌套用户信息查询) 关联映射
- 首先在UserMapper.xml 应存在用户查询语句
<select id="getById" resultType="User"> select * from mall_user where id=#{id} </select>
- 在订单表实体类中,添加用户实体类型作为属性
public class Order { private int id; private int userId; //添加User类型作为属性 private User user; private String orderNo; private String orderDate; private String consignee; private String phoneNum; //以下省略若干属性与get set方法 }
- 查询时只需查多的一方,使用association 标签嵌套select子句
<select id="getOrders" resultMap="OrderResultMap"> select * from mall_order; </select> <resultMap id="OrderResultMap" type="Order"> <id column="id" property="id"/> <result column="userid" property="userId"/> <result column="orderno" property="orderNo"/> <!--property,映射到结果的属性,此处映射到订单实体类中的User类属性--> <!--column,数据库中的列名,或者是列的别名,传递给嵌套 Select 查询语句的列名--> <!--fetchType,有效值为lazy 和 eager,置为lazy时,代表需要property中的值才调用嵌套select--> <!--select,嵌套查询子句,namesapce.id--> <association property="user" column="userid" fetchType="lazy" select="com.woniu.mall.dao.UserDAO.getById" /> </resultMap>