1.一对多:(分类–产品)
1、数据库建表,填数据。
2、新建一个普通的一个pojo Product实体类
public class Product {
private int id;
private String name;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Product [id=" + id + ",name=" + name + ",price=" + price;
}
}
3.修改Category实体类
在Category类中增加:
List<Product> products;
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
4.修改Category.xml
通过left join关联查询,对Category和Product表进行关联查询。
与前面学习的有所区别,这里不是用的resultType, 而是resultMap,通过resultMap把数据取出来放在对应的 对象属性里
注: Category的id 字段 和Product的id字段同名,Mybatis不知道谁是谁的,所以需要通过取别名cid,pid来区分。
name字段同理。
<mapper namespace="com.bean">
<resultMap type="Category" id="categoryBean"> <id column="cid" property="id" /> <result column="cname" property="name" />
<!-- 一对多关系 -->
<!-- property:指集合属性的值,ofType:指集合中元素的类型 -->
<collection property="products" ofType="Product">
<id column="pid" property="id" />
<result column="pname" property="name" />
<result column="price" property="price" />
</collection>
</resultMap>
<!-- left join关联查询 产品分类和产品表 -->
<select id="listCategory" resultMap="categoryBean">
select c.*,p.*,c.id 'cid',p.id 'pid',c.name 'cname',p.name 'pname' from category_ c left join product_ p on c.id=p.cid </select>
</mapper>
5、测试
// 一对多关系
public static void listCategory(SqlSession session) {
List<Category> cs = session.selectList("listCategory");
for (Category category : cs) {
System.out.println(category);
List<Product> ps = category.getProducts();
for (Product product : ps) {
System.out.println("/t" + product);
}
}
}
2.多对一关系(产品–>分类)
1.修改实体类为Product增加category属性
private Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
2.新建Product.xml
提供Product.xml,通过listProduct配置关联查询的sql语句。
然后通过resultMap ,进行字段和属性的对应。
使用association(关联) 进行多对一关系关联,指定表字段名称与对象属性名称的一一对应关系
注: Category的id 字段 和Product的id字段同名,Mybatis不知道谁是谁的,所以需要通过取别名cid,pid来区分。
name字段同理。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
<resultMap type="Product" id="productBean">
<id column="pid" property="id" />
<result column="pname" property="name" />
<result column="price" property="price" />
<association property="category" javaType="Category">
<id column="cid" property="id" />
<result column="cname" property="name" />
</association>
</resultMap>
<select id="listProduct" resultMap="productBean">
select c.*,p.*,c.id 'cid',p.id 'pid' ,c.name 'cname',p.name 'pname' from
category_ c left join product_ p on c.id=p.cid
</select>
</mapper>
3.在mybatis-config.xml中增加对于Product.xml的映射
<mapper resource="com/bean/Product.xml" />
4.测试
// 多对一关系
public static void listProduct(SqlSession session) {
List<Product> ps = session.selectList("listProduct");
for (Product product : ps) {
System.out.println(product + "\t对应的分类是\t" + product.getCategory());
}
}
3.多对多关系
以订单Order和产品Product为例:
一张订单里可以包含多种产品
一种产品 可以出现在多张订单里
这就是多对多关系,为了维系多对多关系,必须要一个中间表。 在这里我们使用订单项(OrderItem)表来作为中间表。
- 查询多对多关系
- 建立多对多关系
- 删除多对多关系
1.数据库建表填充数据。
新建order_表,同理新建order_item_表
填充数据:
2.新建实体类Order和OrderItem
自动生成getset方法。
public class Order {
private int id;
private String code;
List<OrderItem> orderItems;
}
public class OrderItem {
private int id;
private int number;
private Order order;
private Product product;
}
3.配置映射文件Product、Order、OrderItem。
Product.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
<resultMap type="Product" id="productBean">
<id column="pid" property="id" />
<result column="pname" property="name" />
<result column="price" property="price" />
<!-- 多对一的关系 -->
<!-- property: 指的是属性名称, javaType:指的是属性的类型 -->
<association property="category" javaType="Category">
<id column="cid" property="id" />
<result column="cname" property="name" />
</association>
</resultMap>
<select id="listProduct" resultMap="productBean">
select c.*,p.*,c.id
'cid',p.id 'pid' ,c.name 'cname',p.name 'pname' from
category_ c left
join product_ p on c.id=p.cid
</select>
<select id="getProduct" resultMap="productBean">
select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname'
from category_ c
left join product_ p on c.id = p.cid
where p.id = #{id}
</select>
</mapper>
Order.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
<resultMap type="Order" id="orderBean">
<id column="oid" property="id" />
<result column="code" property="code" />
<collection property="orderItems" ofType="orderItem">
<id column=" oiid" property="id" />
<result column="number" property="number" />
<association property="product" javaType="Product">
<id column="pid" property="id" />
<result column="pname" property="name" />
<result column="price" property="price" />
</association>
</collection>
</resultMap>
<select id="listOrder" resultMap="orderBean">
select o.*,p.*,oi.*, o.id
'oid', p.id 'pid', oi.id 'oiid', p.name 'pname'
from order_ o
left join
order_item_ oi on o.id =oi.oid
left join product_ p on p.id = oi.pid
</select>
<select id="getOrder" resultMap="orderBean">
select o.*,p.*,oi.*, o.id 'oid', p.id 'pid', oi.id 'oiid', p.name 'pname'
from order_ o
left join order_item_ oi on o.id =oi.oid
left join product_ p on p.id = oi.pid
where o.id = #{id}
</select>
</mapper>
OrderItem.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
<insert id="addOrderItem" parameterType="OrderItem">
insert into order_item_
values(null,#{order.id},#{product.id},#{number})
</insert>
<insert id="deleteOrderItem" parameterType="OrderItem">
delete from order_item_
where oid = #{order.id} and pid = #{product.id}
</insert>
</mapper>
修改mybatis-config.xml
增加映射文件
<mapper resource="com/bean/Order.xml" />
<mapper resource="com/bean/OrderItem.xml" />
4.建立关系
(1).查询
Test
private static void listOrder(SqlSession session) {
List<Order> orders = session.selectList("listOrder");
for (Order order : orders) {
System.out.println(order.getCode());
List<OrderItem> oItems = order.getOrderItems();
for (OrderItem orderItem : oItems) {
System.out.format("\t%s\t%f\t%d%n", orderItem.getProduct().getName(), orderItem.getProduct().getPrice(),
orderItem.getNumber());
}
}
}
(2).增加关系
// 建立关系(插入数据)
// 首先通过id分别获取Order和Product对象,接着就新建一个OrderItem对象,set order和product // 还有数量,最后用"addOrderItem"对应的sql语句插入. private static void addOrderItem(SqlSession session) { Order order = session.selectOne("getOrder", 1);
Product product = session.selectOne("getProduct", 2);
OrderItem orderItem = new OrderItem();
orderItem.setProduct(product);
orderItem.setOrder(order);
orderItem.setNumber(200);
session.insert("addOrderItem", orderItem);
}
(3).删除关系
// 删除关系(就是删掉OrderItem记录)
// 同上通过对应的Order和Product的id进行删除
private static void deleteOrderItem(SqlSession session) {
Order order = session.selectOne("getOrder", 1);
Product product = session.selectOne("getProduct", 2);
OrderItem orderItem = new OrderItem();
orderItem.setProduct(product);
orderItem.setOrder(order);
session.delete("deleteOrderItem", orderItem);
}
(4).修改
多对多不存在修改关系的做法,就是删除旧的,然后新增一条即达到修改的效果。