实体类和数据库多对一和一对多映射

用Teacher类和Grade举例,Teacher类包含grade类的属性,Grade也包含Teacher类的属性,但是Grade中的Teaher属性要用List<Teahcer> 这就是多对一和一对多,实体类代码如下:

-----------------------------------代码开始----------------------------------

grade:

package com.entity;

import java.util.List;

public class Grade {
        private int gradeId;
        private String gradeName;
        
        private List<Teacher> teachers;
        public List<Teacher> getTeachers() {
            return teachers;
        }
        public void setTeachers(List<Teacher> teachers) {
            this.teachers = teachers;
        }
        public int getGradeId() {
            return gradeId;
        }
        public void setGradeId(int gradeId) {
            this.gradeId = gradeId;
        }
        public String getGradeName() {
            return gradeName;
        }
        public void setGradeName(String gradeName) {
            this.gradeName = gradeName;
        }
        @Override
        public String toString() {
            return "Grade [gradeId=" + gradeId + ", gradeName=" + gradeName + "]";
        }

}

teacher:

package com.entity;

public class Teacher {
            private int teaId;
            private String teaName;
            private int teaAge;
            private Grade grade;
            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;
            }
            public int getTeaAge() {
                return teaAge;
            }
            public void setTeaAge(int teaAge) {
                this.teaAge = teaAge;
            }
            
            public Grade getGrade() {
                return grade;
            }
            public void setGrade(Grade grade) {
                this.grade = grade;
            }
            @Override
            public String toString() {
                return "Teacher [teaId=" + teaId + ", teaName=" + teaName + ", teaAge=" + teaAge + ", grade=" + grade
                        + "]";
            }
            
}

 

-----------------------------------代码结束----------------------------------

然后mapper映射文件就是重中之重,代码如下:

-----------------------------------代码开始----------------------------------

grade:

<?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.dao.GradeDAO" >
             <!-- 
             这里把grade分成了两部分,第二部分继承第一部分同时引用teacherMapper文件中的类型,因为一对多的时候会
             用到第二部分,但是一对一的时候用第二部分会降低效率,所以那时用第一部分效率高一点
              -->
         <resultMap type="Grade" id="BaseResultMap">
             <id column="gradeId" property="gradeId"/>
             <result column="gradeName" property="gradeName"/>
         </resultMap>
         <resultMap type="Grade" id="FullResultMap" extends="BaseResultMap">
             <collection property="teachers" resultMap="com.dao.TeacherDAO.BaseResultMap"/>
         </resultMap>
         
         <!-- 注意这里的resultMap一定不要错写成resultType -->
         <select id="getAllWithTeachers" resultMap="FullResultMap">
             select * from grade g inner join teacher t on g.gradeId=t.gradeId
         </select>
 </mapper>

teacher:

<?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.dao.TeacherDAO">
        <resultMap type="Teacher" id="BaseResultMap">
            <id column="teaId" property="teaId"/>
            <result column="teaName" property="teaName"/>
            <result column="teaAge" property="teaAge"/>
        </resultMap>
        
        <resultMap type="Teacher" id="FullResultMap" extends="BaseResultMap">
        <!-- property的意思是属性,在这里代表的是实体类的某个属性名,如果实体类中没有这个属性名,则会报错 -->
            <association property="grade" resultMap="com.dao.GradeDAO.BaseResultMap"/>
        </resultMap>

        <select id="getAll" resultMap="FullResultMap">
                select * from teacher t inner join grade g on t.gradeId=g.gradeId
        </select>
</mapper>

-----------------------------------代码结束----------------------------------

接下来就可以测试了,代码如下:

-----------------------------------代码开始----------------------------------

package com.test;

import java.util.List;
import org.junit.Test;

import com.dao.GradeDAO;
import com.dao.TeacherDAO;
import com.dao.impl.GradeDAOImpl;
import com.dao.impl.TeacherDAOImpl;
import com.entity.Grade;
import com.entity.Teacher;

public class TeacherDAOTest {
            
    @Test
    public void testGetAll(){
            TeacherDAO teacher=new TeacherDAOImpl();
            List<Teacher> teaList= teacher.getAll();
            for(Teacher tea:teaList){
                System.out.println(tea);
            }
    }
    @Test
    public void testGetAllWithTeachers(){
            GradeDAO grade=new GradeDAOImpl();
            List<Grade> gradeList= grade.getAllWithTeachers();
            for(Grade g:gradeList){
                System.out.println(g);
                for(Teacher tea:g.getTeachers()){
                    System.out.println("\t"+tea.getTeaName());
                }
                
            }
    }
}

 

-----------------------------------代码结束----------------------------------

猜你喜欢

转载自blog.csdn.net/qq_41857764/article/details/85477897