进阶:高级映射
跳到导航
跳到搜索
关于
标签 | 说明 |
---|---|
association | 用于映射关联单个对象的信息
|
collection | 用于关联查询到多条记录映射到集合对象中
|
一对一
示例:查询所有订单信息,关联查询下单用户信息。
note:
- 订单->用户:一对一
- 用户->订单:一对多
使用resultType
使用resultType,专门的po类作为输出类型,此po类中包括了订单信息和用户信息:
OrdersCustom.java:
public class OrdersCustom extends Orders {
private String username;// 用户名称
private String address;// 用户地址
// get/set
}
UserMapper.xml:
<!-- 查询所有订单信息 -->
<select id="findOrdersList" resultType="OrdersCustom">
SELECT orders.*, user.username, user.address
FROM orders, user
WHERE orders.user_id = user.id
</select>
UserMapper.java:
public List<OrdersCustom> findOrdersList() throws Exception;
UserMapperTest.java:
Public void testfindOrdersList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//查询订单信息
List<OrdersCustom> list = userMapper.findOrdersList();
System.out.println(list);
//关闭session
session.close();
}
使用resultMap
使用resultMap,定义专门的resultMap用于映射一对一查询结果:
- 在resultMap中使用association完成关联查询,将关联查询信息映射到pojo对象中。
Orders.java:
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
...
}
UserMapper.xml:
<!-- 订单信息resultmap -->
<resultMap type="cn.itcast.mybatis.po.Orders" id="userordermap">
<!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 -->
<id property="id" column="id"/>
<result property="user_id" column="user_id"/>
<result property="number" column="number"/>
<!-- 使用association进行一对一关联查询 -->
<association property="user" javaType="cn.itcast.mybatis.po.User">
<!-- 这里的id为user的id,如果写上表示给user的id属性赋值 -->
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
</association>
</resultMap>
<!-- 查询所有订单信息 -->
<select id="findOrdersListResultMap" resultType="userordermap">
SELECT orders.*, user.username, user.address
FROM orders, user
WHERE orders.user_id = user.id
</select>
- association:表示进行关联查询单条记录;
- property:表示关联查询的结果存储在cn.itcast.mybatis.po.Orders的user属性中;
- javaType:表示关联查询的结果类型;
- <id property="id" column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识;
- <result property="username" column="username"/>:查询结果的username列对应关联对象的username属性;
UserMapper.java:
public List<Orders> findOrdersListResultMap() throws Exception;
UserMapperTest.java:
Public void testfindOrdersListResultMap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//查询订单信息
List<Orders> list = userMapper.findOrdersListResultMap();
System.out.println(list);
//关闭session
session.close();
}
一对多
示例:查询所有订单信息及订单下的订单明细信息。
- 使用resultMap实现
note:
- 订单->订单明细:一对多
Orders.java:
- 在Orders类中加入List<Orderdetail> orderdetails属性;
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
//订单明细
private List<Orderdetail> orderdetails;
UserMapper.xml:
- 不使用继承时:
<!-- 订单信息resultmap --> <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap"> <id property="id"column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <!-- 使用association进行一对一关联查询 --> <association property="user" javaType="cn.itcast.mybatis.po.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> <!-- 使用collection进行一对多关联查询 --> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="items_id" column="items_id"/> <result property="items_num" column="items_num"/> </collection> </resultMap> <!-- 查询所有订单详情 --> <select id="findOrdersDetailList" resultMap="userorderdetailmap"> SELECT orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id </select>
- 使用继承,将collection写在单独的resultMap:
<!-- 订单信息resultmap:使用继承 --> <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap"> <id property="id"column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <!-- 使用association进行一对一关联查询 --> <association property="user" javaType="cn.itcast.mybatis.po.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> </resultMap> <!-- 使用collection进行一对多关联查询 --> <!-- 继承自:"userordermap" --> <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap"> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="items_id" column="items_id"/> <result property="items_num" column="items_num"/> </collection> </resultMap> <!-- 查询所有订单详情 --> <select id="findOrdersDetailList" resultMap="userorderdetailmap"> SELECT orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id </select>
- extends:继承resultMap信息自userordermap;
- collection:表示关联查询结果集;
- property:关联查询的结果集存储在cn.itcast.mybatis.po.Orders上哪个属性。
- ofType:指定关联查询的结果集中的对象类型即List中的对象类型。
UserMapper.java:
public List<Orders>findOrdersDetailList () throws Exception;
UserMapperTest.java:
Public void testfindOrdersDetailList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//查询订单信息
List<Orders> list = userMapper.findOrdersDetailList();
System.out.println(list);
//关闭session
session.close();
}