一、多表結構
學生表、班級表、課程表、班級課程表
二、一對一
一個學生只屬于一個班級。
查詢:id name age gender banjiName
SELECT s.id,s.`name`,s.age,s.gender,b.id AS banjiId,b.name AS banjiName
FROM student AS s INNER JOIN banji AS b
ON s.banji_id=b.id;
public class Student{private Integer id;private String name;private Integer age;private Banji banji;
}

MyBatis中使用association標簽解決一對一關聯查詢,association標簽可以使用的屬性如下:
- property:對象屬性的名稱
- javaType:對象以昂屬性的類型
- column:數據庫中字段的名稱(也可能是起的別名)
public void testOne2One() {SqlSession sqlSession = MyBatisUtil.getSqlSession();// 最終返回的是一個學生的集合,但是Student里面是有一個banji對象,里面保存了這個學生對應的班級信息List<Student> list = sqlSession.selectList("student.selectStudentBanjiInfo");for (Student student : list) {System.out.println(student);}
}
Student [id=1, name=張三, age=21, gender=男, banji=Banji [id=1, name=java1807]]
Student [id=2, name=zhangsan, age=12, gender=男, banji=Banji [id=1, name=java1807]]
Student [id=4, name=王五2, age=12, gender=男, banji=Banji [id=2, name=java1812]]
二、一對多


三、多對多
多對多其實就是分解為兩個一對多。

四、懶加載(延遲加載)
1.什么是懶加載
顧名思義,懶加載就是懶得加載,只有使用的時候才進行加載。其實,懶加載也加延遲加載,主要以應用與Mybatis的關聯查詢,按照設置的延遲規則,推遲對延遲對關聯對象的select查詢,例如,我們在用Mybatis進行一對多的時候,先查詢出一方,當程序需要多方數據時,mybatis會再次發出sql語句進行查詢, 減輕了對我們數據庫的壓力。Mybatis的延遲加載,只對關聯對象有延遲設置。
MyBatis關聯查詢加載時機
- 直接加載:執行完主對象的查詢后,馬上執行對關聯對象的查詢語句
- 侵入式延遲:執行完對主對象對查詢后,不會執行對關聯對象的查詢,但當訪問主對象的屬性詳情事,就會執行關聯對象的查詢
- 深度延遲:只有當真正訪問關聯對象的詳情時,才會執行查詢語句
延遲加載需要把mybatis版本號改為:3.5.1
2.全局延遲配置
在MyBatis核心配置類中添加標簽
<settings><!-- 延遲加載總開關 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延遲加載開關 --><setting name="aggressiveLazyLoading" value="true"/>
</settings>
(aggressiveLazyLoading)侵入式延遲加載為true, 在3.4.1之后的版本(aggressiveLazyLoading)侵入式延遲加載默認值為false
StudentMapper.xml
<resultMap id="studentMap" type="Student"><id column="id" property="id"/><result column="name" property="name"/><result column="age" property="age"/><result column="gender" property="gender"/><result column="banji_id" property="banjiId"/><!--<association property="banji" javaType="Banji"><id column="banjiId" property="id"/><result column="banjiName" property="name"/></association>--><association property="banji" column="banji_id" select="banji.selectById" javaType="Banji"/>
</resultMap><select id="selectAll" resultMap="studentMap">SELECT id, name, age, gender, banji_idFROM student
</select>
BanjiMapper.xml
<select id="selectById" resultType="Banji">SELECT * FROM banji WHERE id=#{id}
</select>
1.直接加載
直接加載:執行完主對象的查詢后,馬上執行對關聯對象的查詢語句
默認情況的延遲加載
<!-- 延遲加載總開關 -->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 侵入式延遲加載開關 -->
<setting name="aggressiveLazyLoading" value="true"/>
延遲加載的默認設置是直接加載
延遲加載默認情況下是關閉狀態(false),延遲加載相當于總閘,總閘是關閉的那么侵入式延遲加載即使是true也不會起作用。
2.侵入式延遲加載
侵入式延遲:執行完對主對象對查詢后,不會執行對關聯對象的查詢,但當訪問主對象的屬性詳情時,就會執行關聯對象的查詢
<!-- 延遲加載總開關 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延遲加載開關 -->
<setting name="aggressiveLazyLoading" value="true"/>
@Test
public void testSelectAll() throws IOException {SqlSession sqlSession = MyBatisUtils.getSqlSession();List<Student> list = sqlSession.selectList("student.selectAll");for (Student student : list) {//System.out.println(student);//student.getName();}
}
@Test
public void testSelectAll() throws IOException {SqlSession sqlSession = MyBatisUtils.getSqlSession();List<Student> list = sqlSession.selectList("student.selectAll");for (Student student : list) {//System.out.println(student);student.getName();}
}