Mybatis 学习笔记(五)——关联(映射)关系(多对多)

版权声明:转载请注明来源 https://blog.csdn.net/qq_24598601/article/details/83038961

承接上一篇:Mybatis 学习笔记(四)——关联(映射)关系(一对一,一对多)

三、多对多映射关系

1. 需求:查询用户及商品信息
2. POJO类

/mybatis01/src/com/po/User.java

package com.po;

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

/**
 * 用户类
 * @author 欧阳
 *
 */
public class User {
	private int id;				//id
	private String username;	//用户名
	private String sex;			//性别
	private Date birthday;		//生日
	private String address;		//地址
	
	private List<Orders> orderslist;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public List<Orders> getOrderslist() {
		return orderslist;
	}
	public void setOrderslist(List<Orders> orderslist) {
		this.orderslist = orderslist;
	}
	
}

/mybatis01/src/com/po/Orders.java

package com.po;

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

/**
 * 订单类
 * @author 欧阳
 *
 */
public class Orders {
    private Integer id; 		//id
    private Integer userId; 	//用户id
    private String number; 		//数量
    private Date createtime;  	//创建时间
    private String note; 		//备注
    private User user;			//用户信息
    
    private List<Orderdetail> orderdetail; //订单明细
    
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number == null ? null : number.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note == null ? null : note.trim();
    }

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	
	public List<Orderdetail> getOrderdetail() {
		return orderdetail;
	}

	public void setOrderdetail(List<Orderdetail> orderdetail) {
		this.orderdetail = orderdetail;
	}

}

/mybatis01/src/com/po/Orderdetail.java

package com.po;

/**
 * 订单详情类
 * @author 欧阳
 *
 */
public class Orderdetail {
    private Integer id;

    private Integer ordersId;

    private Integer itemsId;

    private Integer itemsNum;
    
    private Items items;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getOrdersId() {
        return ordersId;
    }

    public void setOrdersId(Integer ordersId) {
        this.ordersId = ordersId;
    }

    public Integer getItemsId() {
        return itemsId;
    }

    public void setItemsId(Integer itemsId) {
        this.itemsId = itemsId;
    }

    public Integer getItemsNum() {
        return itemsNum;
    }

    public void setItemsNum(Integer itemsNum) {
        this.itemsNum = itemsNum;
    }

	public Items getItems() {
		return items;
	}

	public void setItems(Items items) {
		this.items = items;
	}

}

/mybatis01/src/com/po/Items.java

package com.po;

import java.util.Date;

/**
 * 商品类
 * @author 欧阳
 *
 */
public class Items {
    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

    private String detail;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic == null ? null : pic.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail == null ? null : detail.trim();
    }

	@Override
	public String toString() {
		return "Items [id=" + id + ", name=" + name + ", price=" + price
				+ ", pic=" + pic + ", createtime=" + createtime + ", detail="
				+ detail + "]";
	}
    
}
3. 编写Mapper.xml

将下面的代码加入 OrdersCustomMapper.xml 中

<!-- 
查询用户及用户购买商品信息(多对多)
 -->
<resultMap type="com.po.User" id="UserAndItemsResultMap">
	<!-- 用户信息 -->
	<id column="u_id" property="id"/>
	<result column="username" property="username"/>
	<result column="sex" property="sex"/>
	<result column="address" property="address"/>
	
	<!-- 配置映射的订单信息 -->
	<collection property="orderslist" ofType="com.po.Orders">
		<id column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>
		<result column="createtime" property="createtime"/>
		<result column="note" property="note"/>
		
		<!-- 配置映射的订单明细信息 -->
		<collection property="orderdetail" ofType="com.po.Orderdetail">
			<id column="od_id" property="id"/>
			<result column="orders_id" property="ordersId"/>
			<result column="items_id" property="itemsId"/>
			<result column="items_num" property="itemsNum"/>
			
			<!-- 配置映射的商品信息 -->
			<association property="items" javaType="com.po.Items">
				<id column="i_id" property="id"/>
				<result column="name" property="name"/>
				<result column="detail" property="detail"/>
				<result column="price" property="price"/>
			</association>
		</collection>
	</collection>
</resultMap>

<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">
	SELECT
		o.*,
		u.id u_id,
		u.username,
		u.sex,
		u.address,
		od.id od_id,
		od.items_id,
		od.items_num,
		od.orders_id,
		i.id i_id,
		i.name,
		i.detail,
		i.price
	FROM
		orders o,
		USER u,
		orderdetail od,
		items i
	WHERE
		o.user_id = u.id
	AND od.orders_id = o.id
	AND od.items_id = i.id
</select>

4. 编写Mapper接口

将下面代码添加到 OrdersCustomMapper.java 中

/*
 * 查询用户及商品信息
 */
public List<User> findUserAndItemsResultMap() throws Exception;

5. Mapper接口测试

将下面代码加入 OrdersCustomMapperTest.java 中

@Test
public void testFindUserAndItemsResultMap() {
	SqlSession sqlsession = sqlSessionFactory.openSession();
	OrdersCustomMapper mapper = sqlsession
			.getMapper(OrdersCustomMapper.class);
	try {
		List<User> users = mapper.findUserAndItemsResultMap();
		System.out.println(users.size());
	} catch (Exception e) {
		e.printStackTrace();
	}
}

四、总结

  个人觉得这个映射关系配置非常简单,只要掌握了规律就可以编写出。在POJO编写、Mapper.xml编写、Mapper接口编写这三步中,最难的就是POJO编写。
  在知道需求之后,首先第一步要确定查询的哪张表是主表,哪些是从表,在分析出这个之后,在主表对应的POJO的基础之上增加从表对应的POJO为属性(一对一则为属性,一对多为集合属性),然后再分析该POJO(属性)相应的表下是否有从表,接着在该POJO的基础上再增加从表对应的POJO为属性(一对一则为属性,一对多为集合属性),以此类推直到没有从表了。
  在编写Mapper.xml文件时,一般属性用 result ;一对一用 association ;一对多用 collection;而多对多是用 result 、association 、collection三个之间相互嵌套表示,按照我编写POJO的思路根据POJO的属性和主从的先后关系一步一步的编写 Mapper.xml 文件就不会出错。
  而在编写Mapper接口时只需要安装开发规范编写即可。

猜你喜欢

转载自blog.csdn.net/qq_24598601/article/details/83038961
今日推荐