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

来源:互联网 发布:刷qq币软件 编辑:程序博客网 时间:2024/05/17 01:14

高级结果映射

一、数据模型分析

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">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`FROMorders,USERWHERE orders.`user_id` = user.`id`</select>

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

3.4测试代码
@Testpublic 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">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`FROMorders,USERWHERE orders.`user_id` = user.`id`</select>

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

4.4测试代码
@Testpublic 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">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`,orderdetail.`id` detailId,orderdetail.`items_id`,orderdetail.`items_num`FROMorders,USER,orderdetailWHEREorders.`user_id` = user.`id`AND orders.`id` = orderdetail.`orders_id`</select>

5、Mapper接口

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

6、测试代码

@Testpublic 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">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`,orderdetail.`id` detailId,orderdetail.`items_id`,orderdetail.`items_num`,items.`name`,items.`price`FROMorders,USER,orderdetail,itemsWHERE orders.`user_id` = user.`id`AND orders.`id` =orderdetail.`orders_id`AND orderdetail.`items_id` = items.`id`</select>

6、测试代码

@Testpublic void testFindUserAndItemsRstMap() {// 创建OrdersMapper对象SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);List<User> list = mapper.findUserAndItemsRstMap();sqlSession.close();}






0 0
原创粉丝点击