MyBatis使用association进行两表查询

应用场景

执行多表查询时,返回的对象关联到另一个对象,此时需要使用resultMap。 比如班级和学生表是一个一对多的关系。如果查询某一个学生信息(对象)时同时要求查询出对应的班级信息(对象)。

代码实现

项目目录:
在这里插入图片描述
数据库:
stu(学生表)
在这里插入图片描述
class(班级表)
在这里插入图片描述
XueSheng.java

package vo;

import java.io.Serializable;

import org.apache.ibatis.type.Alias;

public class XueSheng implements Serializable {
	//学生编号(主键:sid)
	private String bianhao;
	//学生姓名(sname)
	private String xingming;
	//学生性别(sex)
	private String xingbie;
	//学生头像(newname)
	private String touxiang;
	//班级编号(外键:cid)
	private String banjibianhao;
	//班级对象
	private Banji banji;
	
	public Banji getBanji() {
		return banji;
	}
	public void setBanji(Banji banji) {
		this.banji = banji;
	}
	public String getBanjibianhao() {
		return banjibianhao;
	}
	public void setBanjibianhao(String banjibianhao) {
		this.banjibianhao = banjibianhao;
	}
	public String getXingming() {
		return xingming;
	}
	public void setXingming(String xingming) {
		this.xingming = xingming;
	}
	public String getBianhao() {
		return bianhao;
	}
	public void setBianhao(String bianhao) {
		this.bianhao = bianhao;
	}
	public String getXingbie() {
		return xingbie;
	}
	public void setXingbie(String xingbie) {
		this.xingbie = xingbie;
	}
	public String getTouxiang() {
		return touxiang;
	}
	public void setTouxiang(String touxiang) {
		this.touxiang = touxiang;
	}
}

Banji.java

package vo;

public class Banji {
	//班级id(主键)
	private String id;
	//班级名字
	private String cname;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
}

mybatis-config.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>
<properties resource="db.properties"></properties>
<typeAliases>
	<package name="vo"/>
</typeAliases>
<environments default="mysql">
	<environment id="mysql">
		<transactionManager type="JDBC"></transactionManager>
		<!-- 数据源的配置,URL,用户名 密码 数据库 -->
		<dataSource type="POOLED">
			<property name="driver" value="${db.driver}"/>
			<property name="url" value="${db.url}"/>
			<property name="username" value="${db.username}"/>
			<property name="password" value="${db.password}"/>
		</dataSource>
	</environment>
</environments>
<mappers>
	<mapper resource="com/sdbairui/mapper/XueShengMapper.xml"/>
</mappers>
</configuration>

XueShengMapper.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="mapper.EmpMapper">
	<sql id="empField">
		${prefix}.sname as sname,
		${prefix}.sex as sex,
		${prefix}.cid as cid
	</sql>
	<resultMap type="vo.XueSheng" id="xueshengresultmap">
		<id property="bianhao" column="sid"></id>
		<result property="xingming" column="sname"/>
		<result property="xingbie" column="sex"/>
		<result property="touxiang" column="newname"/>
		<result property="banjibianhao" column="cid"/>
		<association property="banji" column="cid" javaType="vo.Banji" select="selectClaByEmp" />
	</resultMap>
	<select id="selectClaByEmp" resultType="vo.Banji">
		select * from class where id = #{cid}
	</select>
	<select id="findAll" resultMap="xueshengresultmap">
		select 
		<include refid="empField"><property name="prefix" value="s"/></include>
		from stu s
	</select>
</mapper>

EmpMapper.java

package mapper;

import java.util.List;

import vo.Emp;
import vo.XueSheng;

public interface EmpMapper {
	//在DAO中定义的抽象方法要和映射文件中的id值匹配起来,映射中的参数就是此处的方法的参数
	public List<XueSheng> findAll();
}

XueShengTest.java

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import util.MySqlSessionFactory;
import vo.XueSheng;

public class XueShengTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SqlSession sqlSession = MySqlSessionFactory.getSqlSession();
		try {
			//insert(sqlSession);
			findAll(sqlSession);
			//提交
			sqlSession.commit();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			//如果出现了异常则回滚
			if(sqlSession!=null) {
				sqlSession.rollback();//回滚
			}
			
		}finally {
			//关闭sqlSession
			if(sqlSession!=null) {
				sqlSession.close();
			}
		}
	}
	
	public static void findAll(SqlSession sqlSession) {
		List<XueSheng> list = sqlSession.selectList("mapper.EmpMapper.findAll");
		for(XueSheng tst: list) {
			System.out.println("学生姓名:"+tst.getXingming()+","+"学生性别:"+tst.getXingbie()+","+"学生所在班级"+tst.getBanji().getCname());
		}
	}
}

在这里插入图片描述

发布了328 篇原创文章 · 获赞 110 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/qq_42249896/article/details/92844780