您的位置:首页 > 其它

mybatis--高级结果映射之一对一、一对多、多对多

2017-02-09 13:42 567 查看

高级结果映射

一、数据模型分析

1、  明确每张表存储的信息

2、  明确每张表中关键字段(主键、外键、非空)

3、  明确数据库中表与表之间的外键关系

4、  明确业务中表与表的关系(建立在具体的业务)



二、一对一映射

1、需求

查询订单信息,关联查询用户信息

2、SQL语句

主信息:orders

从信息:user

SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`
FROM
orders,
USER
WHERE orders.`user_id` = user.`id`


3、使用resultType输出映射

3.1创建扩展类
OrdersExt:
package po;

public class OrdersExt extends Orders{

private String username;

private String sex;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

}


Orders:
package po;

import java.util.Date;
import java.util.List;

public class Orders {
private Integer id;

private Integer userId;

private String number;

private Date createtime;

private String note;

//订单明细集合
private List<Orderdetail> detailList;


3.2映射文件
<!-- 一对一映射之resultMap -->
<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex` FROM orders, USER WHERE orders.`user_id` = user.`id`</select>


3.3Mapper接口
public interface OrdersMapper {
//一对一映射之resultType
public List<OrdersExt> findOrdersAndUser();


3.4测试代码
@Test
public void testFindOrdersAndUser() {
// 创建OrdersMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

List<OrdersExt> list = mapper.findOrdersAndUser();

sqlSession.close();
}


3.5小结

使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。

而且映射的属性要存在于一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。

4、使用resultMap输出映射

使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。

4.1修改扩展类
package po;

public class OrdersExt extends Orders{

private String username;

private String sex;

//用户信息
private User user;


4.2映射文件
<!-- OrdersAndUserRstMap -->
<resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
<!-- 订单信息 -->
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />

<!-- 用户信息(一对一) -->
<!-- association:一对一关联映射 -->
<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
<association property="user" javaType="com.itheima.mybatis.po.User">
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
</association>
</resultMap>

<!-- 一对一映射之resultMap -->
<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex` FROM orders, USER WHERE orders.`user_id` = user.`id`</select>


4.3Mapper接口
//一对一之resultMap
public List<OrdersExt> findOrdersAndUserRstMap();


4.4测试代码
@Test
public void testFindOrdersAndUserRstMap() {
// 创建OrdersMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

List<OrdersExt> list = mapper.findOrdersAndUserRstMap();

sqlSession.close();
}


5、小结

在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,

比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。

而resultType更适用于查询明细信息,比如,查询订单明细列表。

三、一对多映射

1、需求

查询订单信息,关联查询订单明细信息及用户信息



2、SQL语句

主信息:orders

从信息:orderdetail、user

SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`
FROM
orders,
USER,
orderdetail
WHERE orders.`user_id` = user.`id`
AND orders.`id` = orderdetail.`orders_id`


3、修改扩展类

package po;

import java.util.List;

public class OrdersExt extends Orders{

private String username;

private String sex;

private User user;

///订单明细信息
private List<Orderdetail> detailList;


Orderdetail:
package po;

public class Orderdetail {
private Integer id;

private Integer ordersId;

private Integer itemsId;

private Integer itemsNum;

//商品信息
private Items items;


4、映射文件

<!-- OrdersAndDetailRstMap -->
<!-- extends:可以继承一个已有的resultMap,指定resultMap的唯一标示即可 -->
<!-- 注意:继承时,只能继承type类型是一样的resultMap -->
<resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndDetailRstMap"
extends="OrdersAndUserRstMap">
<!-- 订单明细信息(一对多) -->
<!-- collection:映射一对多关系 -->
<!-- property:映射的多的那个集合的属性 -->
<!--ofType: 集合内的对象的类型 -->
<collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
<id column="detailId" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
</collection>

</resultMap>

<!-- 一对多映射 -->
<select id="findOrdersAndDetailRstMap" resultMap="OrdersAndDetailRstMap">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`
FROM
orders,
USER,
orderdetail
WHERE
orders.`user_id` = user.`id`
AND orders.`id` = orderdetail.`orders_id`
</select>


5、Mapper接口

//一对多
public List<OrdersExt> findOrdersAndDetailRstMap();


6、测试代码

@Test
public void testFindOrdersAndDetailRstMap() {
// 创建OrdersMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

List<OrdersExt> list = mapper.findOrdersAndDetailRstMap();

sqlSession.close();
}


四、多对多映射

多对多映射是一对多映射的特例

1、需求

查询用户信息,关联查询该用户购买的商品信息

2、SQL语句

主信息:user

从信息:items、orders、orderdetail

SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`,
items.`name`,
items.`price`
FROM
orders,
USER,
orderdetail,
items
WHERE orders.`user_id` = user.`id`
AND orders.`id` = orderdetail.`orders_id`
AND orderdetail.`items_id` = items.`id`


3、修改PO类

在User类中添加List<Orders> orders;

public class User implements Serializable{
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址

//订单信息
private List<Orders> orders;


在Orders类中添加List<Orderdetail> detailList;

public class Orders {
private Integer id;

private Integer userId;

private String number;

private Date createtime;

private String note;

//订单明细集合
private List<Orderdetail> detailList;


在Orderdetail中添加Items items;

public class Orderdetail {
private Integer id;

private Integer ordersId;

private Integer itemsId;

private Integer itemsNum;

//商品信息
private Items items;


4、Mapper接口

//多对多
public List<User> findUserAndItemsRstMap();


5、映射文件

<!-- UserAndItemsRstMap -->
<resultMap type="com.itheima.mybatis.po.User" id="UserAndItemsRstMap">
<!-- 用户信息 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="sex" property="sex" />
<!-- 订单信息(一对多) -->
<collection property="orders" ofType="com.itheima.mybatis.po.Orders">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<!-- 订单明细信息(一对多) -->
<collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
<id column="detailId" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
<!-- 商品信息(一对一) -->
<association property="items" javaType="items">
<id column="items_id" property="id" />
<result column="name" property="name" />
<result column="price" property="price" />
</association>
</collection>
</collection>
</resultMap>

<!-- 多对多 -->
<select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`,
items.`name`,
items.`price`
FROM
orders,
USER,
orderdetail,
items
WHERE orders.`user_id` = user.`id`
AND orders.`id` =
orderdetail.`orders_id`
AND orderdetail.`items_id` = items.`id`
</select>


6、测试代码

@Test
public void testFindUserAndItemsRstMap() {
// 创建OrdersMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

List<User> list = mapper.findUserAndItemsRstMap();

sqlSession.close();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: