mybatis--多表关联查询

Mybatis框架的基本原理
在这里插入图片描述
多表关联查询:表中存在一对多,多对一的现象
关联集合
association标签在装配一个对象时使用,其中column属性指将哪个当前表哪个列的值作为参数传入sql语句中,
property属性指对象在类中的属性名,
select属性指通过哪个查询语句查询出该对象信息
id与result,id用于设置主键的映射关系(这里也包括外联表的主键),而result则用于设置非主键的映射关系
collection中,用于设置外联表的映射,使用ofType来设置外联表的Bean类,而原本表的bean类由resultMap中的Type属性确定

2。多表查询
	<select  resultMap="resultMap标签的id值" ...></select>
	<resultMap type="结果集映射的实体类" id="">
		<!--主键值-->
		<id column="查询出的结果中的列名" property="实体类的属性名"/>
		
		<!--普通字段-->
		<result column="查询出的结果中的列名" property="实体类的属性名"/>
		
	</resultMap>
	多对一(一对一):
	resultMap标签中:	
		使用<association property="属性名" javaType="属性的实体类型">进行关联对象映射
		在association标签中,使用id  resul标签 映射出关联的对象的属性
		
	一对多
	resultMap标签中:
	使用<collection property="实体类集合的属性名" ofType="集合中元素的类型">进行关联对象映射	
	在association标签中,使用id  resul标签 映射出关联的对象的集合

在JavaBean中:
实体类Dept

package com.hadwinling.entity;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
	private int deptno;
	private String dname;
	private String loc;
	//一对多查询
	private List<Emp> emps;

}

实体类Emp

package com.hadwinling.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
	private int empno;
	private String ename;
	private String job;
	private double sal;
	private int deptno;
	//多对一(一对一) 查询
	private Dept dept;

}

对应的Mapper文件
Dept的Mapper文件

<?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.hadwinling.dao.DeptDao">
		<!-- 一对多查询:查询所有部门及部门关联的所有员工 -->
		<select id="findAllDept" resultMap="deptMap">
			select d.*,e.empno,e.ename,e.job,e.sal,e.deptno did
			from dept d left join emp e
			 on d.deptno=e.deptno
		</select>
		<resultMap type="Dept" id="deptMap">
			<id column="deptno" property="deptno"/>
			<result column="dname" property="dname"/>
			<result column="loc" property="loc"/>
			<!-- 关联集合 
			association标签在装配一个对象时使用,
			其中column属性指将哪个当前表哪个列的值作为参数传入sql语句中,
			property属性指对象在类中的属性名,
			select属性指通过哪个查询语句查询出该对象信息
			id与result,id用于设置主键的映射关系(这里也包括外联表的主键),
				而result则用于设置非主键的映射关系
			collection中,用于设置外联表的映射,使用ofType来设置外联表的Bean类,
				而原本表的bean类由resultMap中的Type属性确定
			-->
			<collection property="emps" ofType="Emp">
				<id column="empno" property="empno"/>
				<result column="ename" property="ename"/>
				<result column="job" property="job"/>
				<result column="sal" property="sal"/>
				<result column="did" property="deptno"/>
			</collection>
		
		</resultMap>
		
</mapper>

Emp对应的Mapper文件

<?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映射文件 -->
<!-- DAO的具体sql 
namespace:命名空间,sql语句进行模块管理
实现mybatis的动态代理配置
namespace="DAO的全路径"
sql的id值为DAO接口中的方法名
-->
<mapper namespace="com.hadwinling.dao.EmpDao">
	<select id="findAllEmps" resultMap="empMap">
		select e.empno eid,e.ename,e.job,e.sal,e.deptno,d.dname,d.loc from emp e,dept d 
		where e.deptno=d.deptno;
	</select>
	<resultMap type="Emp" id="empMap">
		<!-- 结果集映射 -->
		<!-- 如果查询结果的列名与实体类的属性名不一致,也可以使用resultMap映射  指明列名和属性名 -->
		<id column="eid" property="empno"/>
		<result column="ename" property="ename"/>
		<result column="job" property="job"/>
		<result column="sal" property="sal"/>
		<result column="deptno" property="deptno"/>
		<!-- 多对一 或者 一对一 -->
		<association property="dept" javaType="Dept">
			<id column="deptno" property="deptno"/>
			<result column="dname" property="dname"/>
			<result column="loc" property="loc"/>
		</association>
	</resultMap>
</mapper>

Mybatis的核心文件

<?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文件,配置数据库数据源 使用${}读取配置信息 -->
	<properties resource="db.properties"></properties>
	<!-- 起别名 -->
	<typeAliases>
		<!-- 给 "com.hadwinling.entity.Admin"起别名为Admin -->
<!-- 		<typeAlias type="com.hadwinling.entity.Admin" alias="Admin" /> -->
		<!-- 整个包起别名 name="包名"  包中所有的类的别名就是类名 -->
		<package name="com.hadwinling.entity" />
	</typeAliases>

	<!-- 配置mybatis运行环境 -->
	<environments default="default">
		<environment id="default">
			<transactionManager type="JDBC" />
			<!--设置数据库连接池 -->
			<dataSource type="POOLED">
				<!-- 数据源 -->
				<property name="driver" value="${jdbc.driver}"></property>
				<property name="url" value="${jdbc.url}"></property>
				<property name="username" value="${jdbc.username}"></property>
				<property name="password" value="${jdbc.password}"></property>
			</dataSource>
		</environment>
	</environments>
	<!-- 配置mapper映射文件 -->
	<mappers>
		<mapper resource="sqlmap/adminMapper.xml" />
		<mapper resource="sqlmap/deptMapper.xml" />
		<mapper resource="sqlmap/empMapper.xml" />
		<mapper resource="sqlmap/studentMapper.xml" />
	</mappers>

</configuration>

在mybatis核心文件中要把dept和emp的mapper映射文件加入

发布了85 篇原创文章 · 获赞 13 · 访问量 9112

猜你喜欢

转载自blog.csdn.net/Alingyuzi/article/details/105081607