mybatis中和標籤的巢狀使用
阿新 • • 發佈:2018-12-21
mybatis中和標籤的巢狀使用
實現功能
- 為了解決A實體類的其中一個私有屬性b,對應的是另一個實體類B的物件,查詢A的所有資訊;
需求
通過mybatis框架:查詢年級表下的所有班級的詳細資訊。
需求分析
首先需要建立兩個實體類分別對應兩個表,年級表中有一個私有屬性為班級表的實體類集合;
表和表資料展示
- tb_grade表
- tb_grade表
第一步:開始新建mybatis專案
第二步:新建實體類
- 新建兩個實體類,跟資料庫的表形成對應關係;
年級表中的私有屬性有一個是班級表的集合;
//資料庫中外來鍵體現關係,實體類中,把班級的集合放入年級實體中體現關係(一對多)
private List<Classes> classesList;
- Classes–>tb_class
package com.aaa.mb.entity;
import java.util.Date;
/**
* className:Classes
* discription:Classes實體類,對應資料庫表的tb_class
* author:luRuiHua
* createTime:2018-11-15 16:31
*/
public class Classes {
//私有屬性
private Integer classId;
private String className;
private Integer gradeId;
private Integer classsNum;
private Date beginTime;
private Date endTime;
//生成get和set方法
public Integer getClassId() {
return classId;
}
public void setClassId(Integer classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Integer getGradeId() {
return gradeId;
}
public void setGradeId(Integer gradeId) {
this.gradeId = gradeId;
}
public Integer getClasssNum() {
return classsNum;
}
public void setClasssNum(Integer classsNum) {
this.classsNum = classsNum;
}
public Date getBeginTime() {
return beginTime;
}
public void setBeginTime(Date beginTime) {
this.beginTime = beginTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
}
-
- Grade–>tb_grade
package com.aaa.mb.entity;
import java.util.Date;
import java.util.List;
/**
* className:Grade
* discription:Grade的實體類,對應資料庫的tb_grade表
* author:luRuiHua
* createTime:2018-11-15 16:33
*/
public class Grade {
//私有屬性
private Integer gradeId;
private String gradeName;
private Date addTime;
//資料庫中外來鍵體現關係,實體類中,把班級的集合放入年級實體中體現關係(一對多)
private List<Classes> classesList;
//生成get和set方法
public Integer getGradeId() {
return gradeId;
}
public void setGradeId(Integer gradeId) {
this.gradeId = gradeId;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
public Date getAddTime() {
return addTime;
}
public void setAddTime(Date addTime) {
this.addTime = addTime;
}
public List<Classes> getClassesList() {
return classesList;
}
public void setClassesList(List<Classes> classesList) {
this.classesList = classesList;
}
}
步驟三:建立dao層介面
package com.aaa.mb.dao;
import com.aaa.mb.entity.Grade;
import java.util.List;
/**
* className:GradeDao
* discription:tb_grade表的介面
* author:luRuiHua
* createTime:2018-11-15 17:54
*/
public interface GradeDao {
/**
* 查詢tb_grade連線tb_class表
* @return
*/
List<Grade> getGradeList();
}
步驟四:新建mapper.xml檔案
- 重要程式碼:
<?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.aaa.mb.dao.GradeDao">
<!--查詢年級表底下的所有班級的詳細資訊-->
<!--查詢List<Grade>集合-->
<select id="getGradeList" resultMap="getGradeAndClasses">
select g.gradename,c.classname,c.classnum,c.begintime,c.endtime
from tb_grade g
join tb_class c
on g.gradeid = c.gradeid
</select>
<!--查詢到所有的Grade物件-->
<resultMap id="getGradeAndClasses" type="com.aaa.mb.entity.Grade">
<id column="gradeid" property="gradeId"></id>
<result column="gradename" property="gradeName"></result>
<result column="addtime" property="addTime"></result>
<!--查詢到所有的Grade底下的Classes物件-->
<collection property="classesList" ofType="com.aaa.mb.entity.Classes">
<id column="classid" property="classId"></id>
<result column="classname" property="className"></result>
<result column="gradeid" property="gradeId"></result>
<result column="classsnum" property="classsNum"></result>
<result column="begintime" property="beginTime"></result>
<result column="endtime" property="endTime"></result>
</collection>
</resultMap>
</mapper>
程式碼解析
- namespace對應dao層介面的限定名
<mapper namespace="com.aaa.mb.dao.GradeDao">
-
<select>標籤中的id屬性–>dao層介面的方法名稱
resultMap屬性–>返回值型別是一個集合,該集合還可以巢狀集合(必須跟底下的標籤裡面的 id屬性相對應) -
這裡具體到這個方法,getGradeList方法的返回值型別為List<Grade>,起名字時候resultMasp屬性可以自己定義,但是必須給<resultMap>標籤裡面的id屬性名相同;
<select id="getGradeList" resultMap="getGradeAndClasses">
- <resultMap>標籤裡面的type屬性為List集合裡面的物件的限定名;
<resultMap id="getGradeAndClasses" type="com.aaa.mb.entity.Grade">
- <collection>標籤裡面的property屬性為自己起的名字,這裡意思為Grade類中的代表Classes類的私有屬性的集合,因為一個年級底下對應的很多班級;ofType屬性為每一個Classes物件的限定名;
<collection property="classesList" ofType="com.aaa.mb.entity.Classes">
<id column="classid" property="classId"></id>
- <id>標籤中的column屬性為表中的欄位名(不區分大小寫),property屬性為本類的私有屬性所設定的變數名;
<result column="classname" property="className"></result>
步驟五:配置連線池mybatis-config.xml
- 連線資料庫,並且配置mapper/GradeDaoMapper.xml;
- 程式碼展示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--環境配置,可以配置多個環境連結不同的資料來源-->
<environments default="development">
<environment id="development">
<!--事務管理器 JDBC 自定處理事務 MANAGERD 事務交給容器管理-->
<transactionManager type="JDBC"/>
<!--資料來源配置,連結資料庫的4要素 POOLED 使用連結池-->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="luruihua"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/GradeDaoMapper.xml"/>
</mappers>
</configuration>
最後一步:測試
import com.aaa.mb.dao.GradeDao;
import com.aaa.mb.entity.Classes;
import com.aaa.mb.entity.Grade;
import com.aaa.mb.util.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.List;
/**
* className:test
* discription:
* author:luRuiHua
* createTime:2018-11-15 19:08
*/
public class test {
@Test
public void getGradeAndClasses() {
//通過SqlSessionFactoryUtil獲取sqlSession物件
SqlSession sqlSession = SqlSessionFactoryUtil.getSession();
//sqlSession的gatMapper方法獲取介面
GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
//拿到List<Grade>集合
List<Grade> gradeList = gradeDao.getGradeList();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
if (gradeList != null && gradeList.size() > 0) {
//遍歷List<Grade>集合,獲取Grade物件
for (Grade grade : gradeList) {
System.out.println("年級名稱為:" + grade.getGradeName() + ",該年級建立的時間為:" + simpleDateFormat.format(grade.getAddTime()));
//獲取該年級(Grade)下的所有班級
List<Classes> classesList = grade.getClassesList();
if (classesList != null && classesList.size() > 0) {
for (Classes classes : classesList) {
System.out.println("-----" + grade.getGradeName() + "下的班級數量為:" + classesList.size());
System.out.println("--------班級名稱為:" + classes.getClassName() + ",班級人數為:" + classes.getClasssNum() + ",開班時間為:" + simpleDateFormat.format(classes.getBeginTime()));
}
}
}
}
}
}
- 測試結果: