关联映射一对多
以国家和省份对应的一对多关系举例。
数据库:
Country表:
Provincial表:
实体类:
Country表
public class Country {
private int cid;
private String cname;
private List<Provincial> ps;//省份的泛型集合
//省略get/set方法
}
Provincial表
public class Provincial {
private int pid;
private String pname;
//省略get/set方法
}
Dao层接口:
编写小配置xml文件:
<mapper namespace="com.pr.dao.CountryDao">
<!--由于是关联查询 返回的是多张表中的结果集,必须定义resultMap映射-->
<resultMap id="countryMap" type="com.pr.entity.Country">
<id property="cid" column="cid"></id>
<result property="cname" column="cname"></result>
<!--此处使用的是collection节点,由于在Country类中插入的是List集合 ofType:为集合中的泛型 -->
<collection property="ps" ofType="com.pr.entity.·">
<!--在collection中声明Provincial中的属性与表中列的映射-->
<id column="pid" property="pid"></id>
<result column="pname" property="pname"></result>
</collection>
</resultMap>
<select id="getOne" resultType="com.pr.entity.Country" parameterType="int" resultMap="countryMap">
SELECT c.cid,c.cname,pid,pname FROM country c INNER JOIN provincial p ON c.cid=p.cid WHERE c.cid=#{cid}
</select>
</mapper>
测试:
自连接一对多
数据库:
实体类:
public class Category {
private int id;
private String name;
private int type;
private List<Category> lists=new ArrayList<>();
//省略get/set方法
}
Dao层接口:
编写xml文件:
<mapper namespace="com.pr.dao.Easybuy_product_category">
<resultMap id="cateMap" type="com.pr.entity.Easybuy_product_categorys">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="type" property="type"></result>
<!--
参照实体类,lists变量的类型是集合(典型的1:N的关系)
select:指定查询关联对象的select语句(getOneByParent)
column:查询关联对象select语句的条件值
本例:根据id获取对应的分类后,以此id为条件获取子级分类(parentId=父级分类ID)
-->
<collection property="lists" ofType="com.pr.entity.Easybuy_product_categorys" select="getTwo" column="id"/>
</resultMap>
<!--多对一-->
<select id="getTwo" parameterType="int" resultMap="cateMap">
select * from easybuy_product_category where parentId=#{id}
</select>
</mapper>
测试:
关联映射多对一
数据库:
Country表:
Provincial表:
实体类:
Country表
public class Country {
private int cid;
private String cname;
private List<Provincial> ps;//省份的泛型集合
//省略get/set方法
}
Provincial表
public class Provincial {
private int pid;
private String pname;
//省略get/set方法
}
Dao层接口:
编写xml文件:
<mapper namespace="com.pr.dao.CountryDao">
<resultMap id="ProvincialMap" type="com.pr.entity.Provincial">
<id column="pid" property="pid"></id>
<result column="pname" property="pname"></result>
<!--当关联对象为普通对象时,使用association标签 javaType:为关联对象的类型-->
<association property="country" javaType="com.pr.entity.Country">
<id column="cid" property="cid"></id>
<result column="cname" property="cname"></result>
</association>
</resultMap>
<select id="getTwo" resultMap="ProvincialMap">
select * from provincial p inner join country c on p.cid=c.cid;
</select>
</mapper>
测试:
关联映射多对多
数据库:
student表:
teacher表:
stutea表:
实体类:
student类:
public class Student {
private int stuid;
private String stuname;
private List<Teacher> teachers=new ArrayList<>();
public List<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
}
teacher表:
public class Teacher {
private int teaid;
private String teaname;
private List<Student> students=new ArrayList<>();
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public int getTeaid() {
return teaid;
}
public void setTeaid(int teaid) {
this.teaid = teaid;
}
public String getTeaname() {
return teaname;
}
public void setTeaname(String teaname) {
this.teaname = teaname;
}
}
Dao层接口:
编写xml文件:
<mapper namespace="com.pr.dao.TeacherDao">
<resultMap id="teacherMap" type="com.pr.entity.Teacher">
<id column="teaid" property="teaid"></id>
<result column="teaname" property="teaname"></result>
<!--为students集合设置关联属性-->
<collection property="students" ofType="com.pr.entity.Student">
<id column="stuid" property="stuid"></id>
<result column="stuname" property="stuname"></result>
</collection>
</resultMap>
<select id="getOne" resultMap="teacherMap">
SELECT s.*,t.* FROM teacher t,student s,stutea ts WHERE t.`teaid`=ts.`teaid` AND s.`stuid`=ts.`stuid`
</select>
</mapper>
测试: