本博客源码下载:戳我一下
Mybatis学习笔记汇总:戳我一下
一对一查询
案例:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
方法一:
使用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<OrdersCustom> findOrdersList() throws Exception;
5、测试
Public void testfindOrdersList() throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
OneToOneMapper oneToOneMapper = session.getMapper(OneToOneMapper.class);
//查询订单信息
List<OrdersCustom> 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 -->
<resultMap type="com.jiayifan.po.Orders" id="userordermap">
<!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 -->
<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为user的id,如果写上表示给user的id属性赋值 -->
<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
:表示关联查询的结果类型
<id property="id" column="user_id"/>
:查询结果的user_id
列对应关联对象的id属性,这里是<id />
表示user_id
是关联查询对象的唯一标识。
<result property="username" column="username"/>
:查询结果的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<Orders> findOrdersListResultMap() throws Exception;
6、测试
Public void testfindOrdersListResultMap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
OneToOneMapper oneToOneMapper = session.getMapper(OneToOneMapper.class);
//查询订单信息
List<Orders> 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<Orderdetail> orderdetails;
get和set方法省略
}
3、定义resultMap
<!-- 订单信息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中的对象类型。
<id />
及<result/>
的意义同一对一查询。
这里发现配置文件中的上半部分和一对一查询时的配置文件相同,这时我们可以使用resultMap
的继承方法
<resultMap type="com.jiayifan.po.Orders" id="userorderdetailmap" extends="com.jiayifan.mapper.OneToOneMapper.userordermap">
<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>
使用extends继承订单信息userordermap
。
4、Mapper
接口:
public List<Orders> findOrdersDetailList () throws Exception;
5、测试
Public void testfindOrdersDetailList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
OneToMoreMapper oneToMoreMapper = session.getMapper(OneToMoreMapper.class);
//查询订单信息
List<Orders> list = oneToMoreMapper.findOrdersDetailList();
System.out.println(list);
//关闭session
session.close();
}
6、总结
使用collection
完成关联查询,将关联查询信息映射到集合对象。