一,代码地址
二,demo目录
三,代码解释
1),一对多
多个学生对一个班级。多对一
但每个班级可以对多个学生。一对多
数据库表
students
classes
Students
package com.shuang.entity;
import lombok.Data;
@Data
public class Students {
private long id;
private String name;
private Classes classes;
}
Classes
package com.shuang.entity;
import lombok.Data;
import java.util.List;
@Data
public class Classes {
private long id;
private String name;
private List<Students> students;
}
StduentsRepository
package com.shuang.repository;
import com.shuang.entity.Students;
public interface StudentsRepository {
public Students findById(long id);
}
StudentsRepository.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">
<!-- namespace:该mapper.xml映射文件的唯一标识 -->
<mapper namespace="com.shuang.repository.StudentsRepository">
<resultMap id="studentsMap" type="com.shuang.entity.Students">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<association property="classes" javaType="com.shuang.entity.Classes">
<id column="cid" property="id"></id>
<result column="cname" property="name"></result>
</association>
</resultMap>
<select id="findById" parameterType="java.lang.Long" resultMap="studentsMap">
select s.id,s.name,c.id as cid,c.name as cname from students s,classes c where s.id=#{id} and s.cid=c.id;
</select>
</mapper>
配注:
- select标签返回的是:id、name、cid、cname,返回类型为studentsMap。
- studentsMap不是最终返回结果,它需要在resultMap标签中处理一下。最终返回的是Students实体类型。
- id对应Students实体里面的id,name对应Students实体里面的name;cid对应Students实体类里面classes属性的id,cname对应Students实体类里面classes属性的name。
- 由于多个学生对应一个班级,多对一(用association)
classesRepository
package com.shuang.repository;
import com.shuang.entity.Classes;
import java.util.List;
public interface ClassesRepository {
public Classes findById(long id);
}
ClassesRepository.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">
<!-- namespace:该mapper.xml映射文件的唯一标识 -->
<mapper namespace="com.shuang.repository.ClassesRepository">
<resultMap id="classesMap" type="com.shuang.entity.Classes">
<id column="cid" property="id"></id>
<result column="cname" property="name"></result>
<collection property="studentss" ofType="com.shuang.entity.Students">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
</collection>
</resultMap>
<select id="findById" parameterType="java.lang.Long" resultMap="classesMap">
select s.id,s.name,c.id as cid,c.name as cname from students s,classes c where c.id=#{id} and s.cid=c.id;
</select>
</mapper>
配注:
- select标签返回的是:id、name、cid、cname,返回类型为ClassesMap。
- ClassesMap不是最终返回结果,它需要在resultMap标签中处理一下。最终返回的是Classes实体类型。
- cid对应Classes实体里面的id,cname对应Classes实体里面的name;id对应Classes实体类里面student属性的id,name对应Classes实体类里面student属性的name。
- 由于一个班级对应多个学生,一对多(用collection):记忆方法(多个用集合)
2),多对多
一个顾客可以买多个商品,
一个商品也可以被多位顾客购买,
顾客与商品是多对多关系。
数据库表
customer
goods
customer_goods
Customer
package com.shuang.entity;
import lombok.Data;
import java.util.List;
@Data
public class Customer {
private long id;
private String name;
private List<Goods> goods;
}
Goods
package com.shuang.entity;
import lombok.Data;
import java.util.List;
@Data
public class Goods {
private long id;
private String name;
private List<Customer> customers;
}
CustomerRepository
package com.shuang.repository;
import com.shuang.entity.Customer;
public interface CustomerRepository {
public Customer findById(long id);
}
GoodsRepository
package com.shuang.repository;
import com.shuang.entity.Goods;
public interface GoodsRepository {
public Goods findById(long id);
}
CustomerRepository.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">
<!-- namespace:该mapper.xml映射文件的唯一标识 -->
<mapper namespace="com.shuang.repository.CustomerRepository">
<resultMap id="customerMap" type="com.shuang.entity.Customer">
<id column="cid" property="id"></id>
<result column="cname" property="name"></result>
<collection property="goods" ofType="com.shuang.entity.Goods">
<id column="gid" property="id"></id>
<result column="gname" property="name"></result>
</collection>
</resultMap>
<select id="findById" parameterType="java.lang.Long" resultMap="customerMap">
select c.id cid, c.name cname ,g.id gid,g.name gname from customer c,goods g ,customer_goods cg where c.id=#{id} and cg.cid=c.id and cg.gid=g.id;
</select>
</mapper>
配注:
- select标签返回的是:cid、cname、gid、gname,返回类型为customerMap。
- customerMap不是最终返回结果,它需要在resultMap标签中处理一下。最终返回的是Customer实体类型。
- cid对应Customer实体里面的id,cname对应Customer实体里面的name;gid对应Customer实体类里面goods属性的id,gname对应Customer实体类里面goods属性的name。
- collection(多个用集合)
GoodsRepository.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">
<!-- namespace:该mapper.xml映射文件的唯一标识 -->
<mapper namespace="com.shuang.repository.GoodsRepository">
<resultMap id="goodsMap" type="com.shuang.entity.Goods">
<id column="gid" property="id"></id>
<result column="gname" property="name"></result>
<collection property="customers" ofType="com.shuang.entity.Customer">
<id column="cid" property="id"></id>
<result column="cname" property="name"></result>
</collection>
</resultMap>
<select id="findById" parameterType="java.lang.Long" resultMap="goodsMap">
select c.id cid, c.name cname ,g.id gid,g.name gname from customer c,goods g ,customer_goods cg where g.id=#{id} and cg.cid=c.id and cg.gid=g.id;
</select>
</mapper>
配注:
- select标签返回的是:cid、cname、gid、gname,返回类型为customerMap。
- customerMap不是最终返回结果,它需要在resultMap标签中处理一下。最终返回的是Goods实体类型。
- gid对应Goods实体里面的id,gname对应Goods实体里面的name;cid对应Goods实体类里面customer属性的id,cname对应Goods实体类里面customer属性的name。
- collection(多个用集合)