最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Sunny带你半小时掌握Mybati关联映射

IT圈 admin 2浏览 0评论

Sunny带你半小时掌握Mybati关联映射

  • 什么是多对一?

生活中常见多对一关系的例子,在学校你会发现你的班级只有一个,但是班级可以拥有多个学生,那么这就是一个典型的多对一关系,可以通过对象进行关系的表示,多对一的图解如下:

 环境需要的SQL脚本:

CREATE TABLE `studentclass` (`id` INT(10) NOT NULL,`classNumber` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
);INSERT INTO studentclass(`id`,`classNumber`) VALUES (08090101,'计算机与科学1班');CREATE TABLE `Universitystudent` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`cid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fkcid`(`cid`),CONSTRAINT `fkcid` FOREIGN KEY (`cid`) REFERENCES `studentclass` (`id`)
);INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (1,'李阳',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (2,'程奕霖',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (3,'谢雨萱',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (4,'王二蛋',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (5,'陈杰',08090101);

1.建和数据库相对于的映射类Universitystudent.java和Studentclass.java

Universitystudent.java

public class Universitystudent {private int id;private String name;private Studentclass studentclass;@Overridepublic String toString() {return "Universitystudent{" +"id=" + id +", name='" + name + '\'' +", studentclass=" + studentclass +'}';}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 Studentclass getStudentclass() {return studentclass;}public void setStudentclass(Studentclass studentclass) {this.studentclass = studentclass;}
}

Studentclass.java

public class Studentclass {private int id;private String classNumber;@Overridepublic String toString() {return "Studentclass{" +"id=" + id +", classNumber='" + classNumber + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getClassNumber() {return classNumber;}public void setClassNumber(String classNumber) {this.classNumber = classNumber;}
}

2.在建对应的Mapper接口和文件Mapper映射文件

UniversitystudentMapper接口

public interface UniversitystudentMapper {//需求:查询班级下所对于的学生,第一个是按照查询嵌套处理List<Universitystudent> findUniversityStudent();//这个是按照查询嵌套处理List<Universitystudent> findUniversityStudentTwo();
}

UniversitystudentMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="top.yunhuisu.mapper.UniversitystudentMapper"><!-- 1.按照查询嵌套处理 --><select id="findUniversityStudent" resultMap="getStudent">SELECT * FROM universitystudent</select><!-- 嵌套查询 --><select id="getStudentClass" resultType="studentclass">SELECT * FROM studentclass WHERE id = #{cid}</select><resultMap id="getStudent" type="universitystudent"><associationproperty="studentclass"column="cid"javaType="studentclass"select="getStudentClass"></association></resultMap><!-- 2.按照结果嵌套处理 --><select id="findUniversityStudentTwo" resultMap="getStudentTwo">SELECTus.id sid,us.`name` sname,sc.classNumber ClassFROMstudentclass sc,universitystudent usWHEREus.cid = sc.id;</select><resultMap id="getStudentTwo" type="universitystudent"><id property="id" column="sid"></id><result property="name" column="sname"></result><association property="studentclass" javaType="studentclass"><result property="classNumber" column="Class"></result></association></resultMap>
</mapper>

3.测试代码

@Testpublic void testFindUniversityStudent() {MybatisUtils mybatisUtils = new MybatisUtils();//注意哈,我这样偷懒用的链式写法哈,正常写不要这样干哈mybatisUtils.getSqlSession().getMapper(UniversitystudentMapper.class).findUniversityStudent().forEach(System.out::println);mybatisUtils.getSqlSession().getMapper(UniversitystudentMapper.class).findUniversityStudentTwo().forEach(System.out::println);}

运行图

  •  什么是一对多?

我们还是刚刚上面多对一的例子讲解,在学校你会发现有很多的学生,每个学生都只有一个班级,但是班级可以拥有多个学生,那么这就是一个典型的一对多关系,可以通过对象进行关系的表示,多对一的图解如下:

  环境需要的SQL脚本不变

1.我们需要改一下我们刚刚那两个实体类

Studentclass.java

public class Studentclass {private int id;private String classNumber;List<Universitystudent> universitystudents;@Overridepublic String toString() {return "Studentclass{" +"id=" + id +", classNumber='" + classNumber + '\'' +", universitystudents=" + universitystudents +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getClassNumber() {return classNumber;}public void setClassNumber(String classNumber) {this.classNumber = classNumber;}public List<Universitystudent> getUniversitystudents() {return universitystudents;}public void setUniversitystudents(List<Universitystudent> universitystudents) {this.universitystudents = universitystudents;}
}
Universitystudent.java
public class Universitystudent {private int id;private String name;private int cid;@Overridepublic String toString() {return "Universitystudent{" +"id=" + id +", name='" + name + '\'' +", cid=" + cid +'}';}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 int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}
}

3.我们再写StudentclassMapper.java的接口

public interface StudentClassMapper {//需求根据班级Id查询该班下的学生List<Studentclass> byIdClass(@Param("id")int id);
}

4.我们写映射文件StudentclassMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="top.yunhuisu.mapper.StudentClassMapper"><select id="byIdClass" resultMap="getStudentClass">SELECT * FROM studentclass WHERE id = #{id}</select><resultMap id="getStudentClass" type="studentclass"><collectionproperty="universitystudents"column="id"ofType="universitystudent"javaType="ArrayList"select="getUniversityStudent"></collection></resultMap><select id="getUniversityStudent" resultType="universitystudent">SELECT * FROM universitystudent WHERE cid = #{id}</select><select id="byIdClassTwo" resultMap="getStudentClassTwo">SELECTsc.classNumber Class,us.id ucid,us.`name` ucnameFROMstudentclass sc,universitystudent usWHERE sc.id = us.cid AND sc.id = #{id}</select><resultMap id="getStudentClassTwo" type="studentclass"><result property="classNumber" column="Class"></result><collection property="universitystudents" ofType="universitystudent"><result property="id" column="ucid"></result><result property="name" column="ucname"></result></collection></resultMap>
</mapper>

5.测试代码

public void testByIdClass() {MybatisUtils mybatisUtils = new MybatisUtils();SqlSession sqlSession = mybatisUtils.getSqlSession();StudentClassMapper studentMapper = sqlSession.getMapper(StudentClassMapper.class);List<Studentclass> studentClassesList = studentMapper.byIdClass(8090101);for (Studentclass studentclass : studentClassesList) {System.out.println(studentclass);}List<Studentclass> studentClassesListTwo = studentMapper.byIdClassTwo(8090101);for (Studentclass studentclass : studentClassesListTwo) {System.out.println(studentclass);}}

测试图片:

 当然我讲解的时候采用了两种方法,按照结果嵌套处理只要你SQL比较好就可以用这个,不好的话采用嵌套查询吧

Sunny带你半小时掌握Mybati关联映射

  • 什么是多对一?

生活中常见多对一关系的例子,在学校你会发现你的班级只有一个,但是班级可以拥有多个学生,那么这就是一个典型的多对一关系,可以通过对象进行关系的表示,多对一的图解如下:

 环境需要的SQL脚本:

CREATE TABLE `studentclass` (`id` INT(10) NOT NULL,`classNumber` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
);INSERT INTO studentclass(`id`,`classNumber`) VALUES (08090101,'计算机与科学1班');CREATE TABLE `Universitystudent` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`cid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fkcid`(`cid`),CONSTRAINT `fkcid` FOREIGN KEY (`cid`) REFERENCES `studentclass` (`id`)
);INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (1,'李阳',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (2,'程奕霖',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (3,'谢雨萱',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (4,'王二蛋',08090101);
INSERT INTO `Universitystudent`(`id`,`name`,`cid`) VALUES (5,'陈杰',08090101);

1.建和数据库相对于的映射类Universitystudent.java和Studentclass.java

Universitystudent.java

public class Universitystudent {private int id;private String name;private Studentclass studentclass;@Overridepublic String toString() {return "Universitystudent{" +"id=" + id +", name='" + name + '\'' +", studentclass=" + studentclass +'}';}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 Studentclass getStudentclass() {return studentclass;}public void setStudentclass(Studentclass studentclass) {this.studentclass = studentclass;}
}

Studentclass.java

public class Studentclass {private int id;private String classNumber;@Overridepublic String toString() {return "Studentclass{" +"id=" + id +", classNumber='" + classNumber + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getClassNumber() {return classNumber;}public void setClassNumber(String classNumber) {this.classNumber = classNumber;}
}

2.在建对应的Mapper接口和文件Mapper映射文件

UniversitystudentMapper接口

public interface UniversitystudentMapper {//需求:查询班级下所对于的学生,第一个是按照查询嵌套处理List<Universitystudent> findUniversityStudent();//这个是按照查询嵌套处理List<Universitystudent> findUniversityStudentTwo();
}

UniversitystudentMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="top.yunhuisu.mapper.UniversitystudentMapper"><!-- 1.按照查询嵌套处理 --><select id="findUniversityStudent" resultMap="getStudent">SELECT * FROM universitystudent</select><!-- 嵌套查询 --><select id="getStudentClass" resultType="studentclass">SELECT * FROM studentclass WHERE id = #{cid}</select><resultMap id="getStudent" type="universitystudent"><associationproperty="studentclass"column="cid"javaType="studentclass"select="getStudentClass"></association></resultMap><!-- 2.按照结果嵌套处理 --><select id="findUniversityStudentTwo" resultMap="getStudentTwo">SELECTus.id sid,us.`name` sname,sc.classNumber ClassFROMstudentclass sc,universitystudent usWHEREus.cid = sc.id;</select><resultMap id="getStudentTwo" type="universitystudent"><id property="id" column="sid"></id><result property="name" column="sname"></result><association property="studentclass" javaType="studentclass"><result property="classNumber" column="Class"></result></association></resultMap>
</mapper>

3.测试代码

@Testpublic void testFindUniversityStudent() {MybatisUtils mybatisUtils = new MybatisUtils();//注意哈,我这样偷懒用的链式写法哈,正常写不要这样干哈mybatisUtils.getSqlSession().getMapper(UniversitystudentMapper.class).findUniversityStudent().forEach(System.out::println);mybatisUtils.getSqlSession().getMapper(UniversitystudentMapper.class).findUniversityStudentTwo().forEach(System.out::println);}

运行图

  •  什么是一对多?

我们还是刚刚上面多对一的例子讲解,在学校你会发现有很多的学生,每个学生都只有一个班级,但是班级可以拥有多个学生,那么这就是一个典型的一对多关系,可以通过对象进行关系的表示,多对一的图解如下:

  环境需要的SQL脚本不变

1.我们需要改一下我们刚刚那两个实体类

Studentclass.java

public class Studentclass {private int id;private String classNumber;List<Universitystudent> universitystudents;@Overridepublic String toString() {return "Studentclass{" +"id=" + id +", classNumber='" + classNumber + '\'' +", universitystudents=" + universitystudents +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getClassNumber() {return classNumber;}public void setClassNumber(String classNumber) {this.classNumber = classNumber;}public List<Universitystudent> getUniversitystudents() {return universitystudents;}public void setUniversitystudents(List<Universitystudent> universitystudents) {this.universitystudents = universitystudents;}
}
Universitystudent.java
public class Universitystudent {private int id;private String name;private int cid;@Overridepublic String toString() {return "Universitystudent{" +"id=" + id +", name='" + name + '\'' +", cid=" + cid +'}';}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 int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}
}

3.我们再写StudentclassMapper.java的接口

public interface StudentClassMapper {//需求根据班级Id查询该班下的学生List<Studentclass> byIdClass(@Param("id")int id);
}

4.我们写映射文件StudentclassMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"".dtd">
<mapper namespace="top.yunhuisu.mapper.StudentClassMapper"><select id="byIdClass" resultMap="getStudentClass">SELECT * FROM studentclass WHERE id = #{id}</select><resultMap id="getStudentClass" type="studentclass"><collectionproperty="universitystudents"column="id"ofType="universitystudent"javaType="ArrayList"select="getUniversityStudent"></collection></resultMap><select id="getUniversityStudent" resultType="universitystudent">SELECT * FROM universitystudent WHERE cid = #{id}</select><select id="byIdClassTwo" resultMap="getStudentClassTwo">SELECTsc.classNumber Class,us.id ucid,us.`name` ucnameFROMstudentclass sc,universitystudent usWHERE sc.id = us.cid AND sc.id = #{id}</select><resultMap id="getStudentClassTwo" type="studentclass"><result property="classNumber" column="Class"></result><collection property="universitystudents" ofType="universitystudent"><result property="id" column="ucid"></result><result property="name" column="ucname"></result></collection></resultMap>
</mapper>

5.测试代码

public void testByIdClass() {MybatisUtils mybatisUtils = new MybatisUtils();SqlSession sqlSession = mybatisUtils.getSqlSession();StudentClassMapper studentMapper = sqlSession.getMapper(StudentClassMapper.class);List<Studentclass> studentClassesList = studentMapper.byIdClass(8090101);for (Studentclass studentclass : studentClassesList) {System.out.println(studentclass);}List<Studentclass> studentClassesListTwo = studentMapper.byIdClassTwo(8090101);for (Studentclass studentclass : studentClassesListTwo) {System.out.println(studentclass);}}

测试图片:

 当然我讲解的时候采用了两种方法,按照结果嵌套处理只要你SQL比较好就可以用这个,不好的话采用嵌套查询吧

发布评论

评论列表 (0)

  1. 暂无评论