案例:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
使用resultType
,定义订单信息pojo类,此pojo类中包括了订单信息和用户信息。
1、先写sql语句
SELECT
orders.*,
user.username,
user.address
FROM
orders,
user
WHERE orders.user_id = user.id
2、写一个pojp类
public class OrdersCustom extends Orders {
private String username;// 用户名称
private String address;// 用户地址
get和set方法省略
}
OrdersCustom
类继承Orders
类后OrdersCustom
类包括了Orders
类的所有字段,只需要定义用户的信息字段即可。
3、配置Mapper.xml
<select id="findOrdersList" resultType="com.jiayifan.po.OrdersCustom">
SELECT
orders.*,
user.username,
user.address
FROM
orders, user
WHERE orders.user_id = user.id
select>
4、写Mapper
接口
public List findOrdersList() throws Exception;
5、测试
Public void testfindOrdersList() throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
OneToOneMapper oneToOneMapper = session.getMapper(OneToOneMapper.class);
//查询订单信息
List list = oneToOneMapper.findOrdersList();
System.out.println(list);
//关闭session
session.close();
}
6、总结
定义专门的pojo类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。
使用resultMap
,定义专门的resultMap
用于映射一对一查询结果。
1、sql语句与方法一相同
2、定义pojo类
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
get和set方法省略
}
3、定义resultMap
需要关联查询映射的是用户信息,使用association
将用户信息映射到订单对象的用户属性中。
<resultMap type="com.jiayifan.po.Orders" id="userordermap">
<id property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<association property="user" javaType="com.jiayifan.po.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
association>
resultMap>
association
:表示进行关联查询单条记录
property
:表示关联查询的结果存储在com.jiayifan.po.Orders
的user
属性中
javaType
:表示关联查询的结果类型
:查询结果的user_id
列对应关联对象的id属性,这里是
表示user_id
是关联查询对象的唯一标识。
:查询结果的username
列对应关联对象的username
属性。
4、配置Mapper.xml
<select id="findOrdersListResultMap" resultMap="userordermap">
SELECT
orders.*,
user.username,
user.address
FROM
orders, user
WHERE orders.user_id = user.id
select>
5、Mapper
接口
public List findOrdersListResultMap() throws Exception;
6、测试
Public void testfindOrdersListResultMap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
OneToOneMapper oneToOneMapper = session.getMapper(OneToOneMapper.class);
//查询订单信息
List list = oneToOneMapper.findOrdersListResultMap();
System.out.println(list);
//关闭session
session.close();
}
7、总结
使用association
完成关联查询,将关联查询信息映射到pojo对象中。
案例:查询所有订单信息及订单下的订单明细信息。
订单信息与订单明细为一对多关系。使用resultMap
实现如下:
1、写sql语句
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
2、定义pojo类
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//用户信息
private User user;
//订单明细
private List orderdetails;
get和set方法省略
}
3、定义resultMap
<resultMap type="com.jiayifan.po.Orders" id="userorderdetailmap">
<id property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<association property="user" javaType="com.jiayifan.po.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
association>
<collection property="orderdetails" ofType="com.jiayifan.po.Orderdetail">
<id property="id" column="orderdetail_id"/>
<result property="itemsId" column="items_id"/>
<result property="itemsNum" column="items_num"/>
collection>
resultMap>
collection
部分定义了查询订单明细信息。
collection
:表示关联查询结果集
property="orderdetails"
:关联查询的结果集存储在com.jiayifan.po.Orders
上那个属性。
ofType="cn.itcast.mybatis.po.Orderdetail"
:指定关联查询的结果集中的对象类型即List中的对象类型。
及
的意义同一对一查询。
这里发现配置文件中的上半部分和一对一查询时的配置文件相同,这时我们可以使用resultMap
的继承方法
"com.jiayifan.po.Orders" id="userorderdetailmap" extends="com.jiayifan.mapper.OneToOneMapper.userordermap">
property="orderdetails" ofType="com.jiayifan.po.Orderdetail">
<id property="id" column="orderdetail_id"/>
<result property="itemsId" column="items_id"/>
<result property="itemsNum" column="items_num"/>
使用extends继承订单信息userordermap
。
4、Mapper
接口:
public List findOrdersDetailList () throws Exception;
5、测试
Public void testfindOrdersDetailList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
OneToMoreMapper oneToMoreMapper = session.getMapper(OneToMoreMapper.class);
//查询订单信息
List list = oneToMoreMapper.findOrdersDetailList();
System.out.println(list);
//关闭session
session.close();
}
6、总结
使用collection
完成关联查询,将关联查询信息映射到集合对象。