1.引言
在本篇博客中主要介绍:
MyBatis
中一对多关联如何建立,一对多关联映射文件如何写?在一对多关联中实体类应该如何建立?
2.MyBatis
之一对多关联
在涉及到代码之前,我们先说一下数据库中的表结构:
- 数据库中有两个表:
student
表(学生表),classes
表(班级表),student
表和classes
表是一对多的关系:一个班级里面有很多的学生 - 我们的需求是,根据班级号查询该班级的学生
classes表:cid班级号,cname班级名称,dec班级的描述
student表:sid学生号,sname学生名称,hobit爱好,cid外键,记录属于哪一个班级
2.1 创建我们的数据库
DROP DATABASE IF EXISTS school;
CREATE DATABASE IF NOT EXISTS school;
USE school;
CREATE TABLE `classes`(
`cid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`cname` VARCHAR(32) ,
`dec` VARCHAR(20)
);
CREATE TABLE `student`(
`sid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`sname` VARCHAR(32) ,
`hobit` VARCHAR(20),
`cid` INT(11),
CONSTRAINT FOREIGN KEY(cid) REFERENCES classes(cid)
ON DELETE CASCADE
);
INSERT INTO `classes` (`cid`,`cname`,`dec`)
VALUES(1,"C++","C++班级");
INSERT INTO `classes` (`cid`,`cname`,`dec`)
VALUES(2,"C#","C#班级");
INSERT INTO `classes` (`cid`,`cname`,`dec`)
VALUES(3,"Java","Java班级");
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(1,"aaa","喜欢玩游戏",1);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(2,"bbb","喜欢学习",1);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(3,"ccc","喜欢打篮球",2);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(4,"ddd","喜欢打排球",2);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(5,"eee","喜欢打篮球",3);
INSERT INTO `student` (`sid`,`sname`,`hobit`,`cid`)
VALUES(6,"fff","喜欢玩游戏",3);
2.2 创建Student
持久化类
package com;
public class Student {
private Integer sid;
private String sname;
private String hobit;
private Integer cid;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname == null ? null : sname.trim();
}
public String getHobit() {
return hobit;
}
public void setHobit(String hobit) {
this.hobit = hobit == null ? null : hobit.trim();
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
}
2.3 创建Classes
持久化类(建立一对多关系)
package com;
import java.util.List;
public class Classes {
private Integer cid;
private String cname;
private String dec;
//一个班级有很多的学生
private List<Student> students;
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname == null ? null : cname.trim();
}
public String getDec() {
return dec;
}
public void setDec(String dec) {
this.dec = dec == null ? null : dec.trim();
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
2.4 根据需求编写映射文件
我们的需求是:根据班级号查询班级的学生,因此我们开始写相应的映射文件
编写
Student
映射
<resultMap id="StudentMap" type="com.Student" >
<id column="sid" property="sid" jdbcType="INTEGER" />
<result column="sname" property="sname" jdbcType="VARCHAR" />
<result column="hobit" property="hobit" jdbcType="VARCHAR" />
<result column="cid" property="cid" jdbcType="INTEGER" />
</resultMap>
- 编写
Classes
映射(通过collection
映射关系)
<resultMap id="ClassesMap" type="com.Classes" >
<id column="cid" property="cid" jdbcType="INTEGER" />
<result column="cname" property="cname" jdbcType="VARCHAR" />
<result column="dec" property="dec" jdbcType="VARCHAR" />
<collection property="students" resultMap="StudentMap">
</collection>
</resultMap>
2.5 编写SQL
语句
- 通过班级的
cid
查询该班级的信息(同时查询出该班级的学生)
<select id="findById" resultMap="ClassesMap" parameterType="int">
select * from classes c join student s on s.cid=c.cid where c.cid=#{id}
</select>
2.6 编写测试类
@Test
public void testOneToMany()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
Classes classes=sqlSession.selectOne("com.ClassesMapper.findById", 1);
System.out.print(classes);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}