mybatis多表查询:一对多

思想:设每个员工对应一个部门,而我将员工查询出来要带出相应的部门信息

我的emp表:

在这里插入图片描述

我的dept表:

在这里插入图片描述
设我有一个部门表的实体类:
Dept.java

public class Dept {
	private int deptNo;
	private String dname;
	private List<Emp> emp;
	
	public int getDeptNo() {
		return deptNo;
	}
	public void setDeptNo(int deptNo) {
		this.deptNo = deptNo;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public List<Emp> getEmp() {
		return emp;
	}
	public void setEmp(List<Emp> emp) {
		this.emp = emp;
	}
	@Override
	public String toString() {
		return "Dept [deptNo=" + deptNo + ", dname=" + dname + ", emp=" + emp + "]";
	}
	
}

部门对应的接口类:

public interface deptMapper {
	public Dept queryDept(int deptNo);
}

员工对应的接口类

public interface EmpMapper { 	
	
}

员工的实体类:
Emp.java

public class Emp {
	private int empno;
	private String ename;
	private String myJob;
	private Dept dept;
	
	public Dept getDept() {
		return dept;
	}
	public void setDept(Dept dept) {
		this.dept = dept;
	}
	public String getMyJob() {
		return myJob;
	}
	public void setMyJob(String myJob) {
		this.myJob = myJob;
	}
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", myJob=" + myJob + ", dept=" + dept + "]";
	}	
}

mybatis的confing.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>
	
	<!-- 打印出运行日志 -->
	<settings>
		<setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
	<!-- 设置一段路径的别名,可以在映射的xml文件中使用 -->
	<typeAliases>
		<typeAlias type="com.pk.resultMap.Emp" alias="emps" />
	</typeAliases>
	
	<!-- 这里是资源文件路径 -->
	<properties resource="jdbc.properties" />
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbcDriver}" />
				<property name="url" value="${jdbcUrl}" />
				<property name="username" value="${jdbcUsername}" />
				<property name="password" value="${jdbcPassword}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 路径需要自己设 -->
	<mappers>
		<mapper resource="com/pk/resultMap/empMapping.xml" />
	</mappers>
</configuration>

部门表dept的映射文件:deptMapper.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.pk.resultMap.deptMapper">
	
	<!-- autoMapping属性设置是否启动自动映射功能 -->
	<resultMap type="com.pk.resultMap.Dept" id="depts" autoMapping="true">
		<!-- 将主键的值映射到实体类中的字段 -->
		<result column="deptNo" property="deptNo" />
		<!-- collection标签:往这个标签定义的 ‘类’ 的 list 属性中设置值, 如何设置值? 还要根据其 select="selectAuthority"  , 把值查询出来。 -->
		<!-- 
			property:实体类中的字段
			javaType:返回的类型,list
			select:调用方法
			column:往方法里面传参
		 -->
		<collection property="emp" javaType="list"
			select="com.pk.resultMap.EmpMapper.queryByDeptNo" column="deptNo" />
	</resultMap>

	<!-- 一对多:当我查询一个部门的时候带出多个员工 -->
	<select id="queryDept" parameterType="int" resultMap="depts">
		select *
		from dept where deptNo = #{0}
	</select>
</mapper>

员工表emp的映射文件:empMapping.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.pk.resultMap.EmpMapper">
	<!-- 一对多 -->
	<select id="queryByDeptNo" resultType="com.pk.resultMap.Emp">
		select e.* from emp e
		where e.deptNo = #{0}
	</select>
</mapper>

测试:

package com.pk.resultMap;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

/**
 * mybatis的终极思想:1.为了解决sql语句硬编码的问题(约定大于配置) 2.解决面向对象设计问题(面向接口编程)
 * 每个对象对应一个xml文件(映射文件 MAPPING) 设:emp表 emp.xml dept表 dept.xml
 * 
 * @author 
 *
 *         2018年11月10日上午9:06:27
 */
public class TestMybatis {
	// 获取SqlSession对象
	public static SqlSession getSession() {
		String resource = "config.xml";
		InputStream resourceAsStream = TestMybatis.class.getResourceAsStream(resource);
		// session工厂 负责产生会话
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
		// 会话就是打开了和数据库的链接
		SqlSession openSession = sqlSessionFactory.openSession();
		return openSession;
	}
	@Test
	public void test4() {
//		一对一多 查询部门带出员工
		SqlSession session = getSession();
		deptMapper mapper = session.getMapper(deptMapper.class);
		Dept queryDept = mapper.queryDept(1);
		System.out.println(queryDept);
	}


}

猜你喜欢

转载自blog.csdn.net/wufewu/article/details/84206695