1. 程式人生 > >實體類和資料庫多對一和一對多對映

實體類和資料庫多對一和一對多對映

用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());
                }
                
            }
    }
}

 

-----------------------------------程式碼結束----------------------------------