您的位置:首页 > 编程语言 > Java开发

Mybatis学习笔记(九)——一对一和一对多查询

2018-03-20 18:29 666 查看

本博客源码下载:戳我一下

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
完成关联查询,将关联查询信息映射到集合对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java mybatis