版权声明:A_芦瑞华_i_DO.欢迎转载 https://blog.csdn.net/weixin_43067223/article/details/84106692
mybatis中和标签的嵌套使用
实现功能
- 为了解决A实体类的其中一个私有属性b,对应的是另一个实体类B的对象,查询A的所有信息;
- A和B分别对应两站表,A和B之间有外键关系,通过b属性将两张表关联起来。
需求
通过mybatis框架:查询年级表下的所有班级的详细信息。
需求分析
- 首先需要创建两个实体类分别对应两个表,年级表中有一个私有属性为班级表的实体类集合;
- 然后创建接口,接口里面写查询的方法。
- 配置mybatis-config.xml文件连接数据库。
- 配置mapper.xml文件,编写sql语句。使用<resultMap>和<collection>标签。
- 编写测试类,运行程序。
表和表数据展示
- tb_grade表
- tb_grade表
第一步:开始新建mybatis项目
前两天的帖子,此处省略。
参考请看:https://blog.csdn.net/weixin_43067223/article/details/84028712
第二步:新建实体类
- 新建两个实体类,跟数据库的表形成对应关系;
年级表中的私有属性有一个是班级表的集合;
//数据库中外键体现关系,实体类中,把班级的集合放入年级实体中体现关系(一对多)
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()));
}
}
}
}
}
}
- 测试结果: