mybatis-210719-03---映射文件_select_resultMap_关联查询&分步查询

mybatis-210719-03—映射文件_select_resultMap_关联查询&分步查询


DepartmentMapper.java

package com.bgy.mybatis.dao;
import com.bgy.mybatis.bean.Department;

public interface DepartmentMapper {
	
	public Department getDeptById(Integer id);
}

DepartmentMapper.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.bgy.mybatis.dao.DepartmentMapper">
	<select id="getDeptById" resultType="com.bgy.mybatis.bean.Department">
		select 
			id,dept_name departmentName 
		from 
			tbl_dept 
		where 
			id=#{id}
	</select>
</mapper>

EmployeeMapper.java

package com.bgy.mybatis.dao;
import com.bgy.mybatis.bean.Employee;

public interface EmployeeMapper {

	public Employee getEmpAndDept(Integer id);
	
	public Employee getEmpByIdStep(Integer id);
}

EmployeeMapper.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.bgy.mybatis.dao.EmployeeMapper">
	
	<!--
		场景1:
			查询Employee的同时查询员工对应的部门
			Employee=====Department
			一个员工对应的关系
	-->
	<!--
		方法1
			 联合查询:级联属性封装结果集
	-->
	<resultMap type="com.bgy.mybatis.bean.Employee" id="MyEmp01">
		<id column="id" property="id"/>
		<result column="last_name" property="lastName"/>
		<result column="gender" property="gender"/>
		<result column="email" property="email"/>
		
		<!--
			property="dept.id"中
				dept对应Employee.java中的dept属性
				id对应Department.java中的id属性
			property="dept.departmentName"
				dept对应Employee.java中的dept属性
				departmentName对应Department.java中的departmentName属性
		-->
		<result column="did" property="dept.id"/>
		<result column="dept_name" property="dept.departmentName"/>
	</resultMap>
	
	<!--
		方法2	 
			使用association定义关联单个对象的封装规则
	-->
	<resultMap type="com.bgy.mybatis.bean.Employee" id="MyEmp02">
		<id column="id" property="id"/>
		<result column="last_name" property="lastName"/>
		<result column="gender" property="gender"/>
		<result column="email" property="email"/>
		
		<!--
			association可以指定联合JavaBean对象
				property:指定哪个属性是联合的对象
				javaType:指定这个属性对象的类型【一定要有】
		-->
		<!--
			property="id"
			property="departmentName"
				对应着Department.java中的属性
		-->
		<association property="dept" javaType="com.bgy.mybatis.bean.Department">
			<id column="did" property="id"/>
			<result column="dept_name" property="departmentName"/>
		</association>
	</resultMap>
	
	<select id="getEmpAndDept" resultMap="MyEmp02">
		select 
			e.id id,e.last_name last_name,e.gender gender,e.email email,
			e.d_id d_id,d.id did,d.dept_name dept_name 
		from 
			tbl_employee e,tbl_dept d 
		where 
			d.id=e.d_id and e.id=#{id}
	</select>
	
	
	<!--
		方法3
			使用association进行分步查询:
				1)先按照员工id查询员工信息
				2)根据查询员工信息中的d_id值去部门表查出部门信息
				3)部门设置到员工中
	-->
	<resultMap type="com.bgy.mybatis.bean.Employee" id="MyEmpStep">
		<id column="id" property="id"/>
		<result column="last_name" property="lastName"/>
		<result column="gender" property="gender"/>
		<result column="email" property="email"/>
		
		<!--
			association定义关联对象的封装规则
				property="dept" 中dept是Employee.java中的属性
				select:表明当前属性是调用select指定的方法查出来的结果
				column:指定将哪一列的值传给这个方法
			
			流程:使用select指定的方法(传入column指定的这一列参数的值)查出对象,并封装给property指定的属性
		-->
		<association property="dept" 
			select="com.bgy.mybatis.dao.DepartmentMapper.getDeptById"
			column="d_id">
		</association>
	</resultMap>
	<select id="getEmpByIdStep" resultMap="MyEmpStep">
		select * from tbl_employee where id=#{id}
	</select>
	
	
	<!--
		方法4
			分布查询————延迟加载(懒加载)(按需加载)
			Employee====>Dept
				我们每次查询的Employee对象的时候,把Employee和Department都一起查出来了
				我们希望部门(Department)信息在我们使用的时候再去查询
				
				解决:
					在分布查询的基础上加上两个配置
					<settings>
						<setting name="lazyLoadingEnabled" value="true"/>
						<setting name="aggressiveLazyLoading" value="false"/>
					</settings>
	-->
</mapper>

MybatisTest.java

package com.bgy.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import com.bgy.mybatis.bean.Employee;
import com.bgy.mybatis.dao.EmployeeMapper;

class MybatisTest {
	
	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		return new SqlSessionFactoryBuilder().build(inputStream);
	}

	/**
	 * 测试测试关联查询————联合查询
	 * @throws IOException
	 */
	@Test
	public void test03() throws IOException{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		try {
			EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
			
			Employee employee = mapper.getEmpAndDept(1);
			
			System.out.println("关联查询————联合查询");
			System.out.println(employee);
		} finally {
			sqlSession.close();
		}
	}
	
	/**
	 * 测试关联查询————association分步查询
	 * @throws IOException
	 */
	@Test
	public void test04() throws IOException{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		try {
			EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
			
			Employee employee = mapper.getEmpByIdStep(1);
			
			System.out.println("关联查询————association分步查询");
			System.out.println(employee.getDept());
//			System.out.println(employee);
			
             // 使用了延迟加载后
			// 当查询跟部门信息无关的,不会查部门信息
//			System.out.println(employee.getLastName());
		} finally {
			sqlSession.close();
		}
	}
}

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>

	<!-- 
		1. mybatis可以使用properties引入外部properties配置文件內容
			resource=""		引入类路径下的资源
			url=""			引入网络路径或者磁盘路径下的资源
	-->
	<properties resource="dbconfig.properties"></properties>
    
    <!-- ====================================================================================== -->
	
	<!--
		 2. settings包含很多重要的设置项
		 	setting用来设置每一个设置项
		 		name:设置项名
		 		value:设置项取值
	-->
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"></setting>
		<setting name="jdbcTypeForNull" value="NULL"/>
        
        <!-- 设置延迟加载 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>
	
    <!-- ====================================================================================== -->
	
	<!--
		3. typeAliases:别名处理器,可以为我们的java类型起别名 
		   别名不区分大小写
	-->
	<typeAliases>
		<!--
			方法1.
				type:指定要起的别名的类型全类名,默认别名就是类名小写,employee
				alias:指定新的别名
		-->
		<typeAlias type="com.bgy.mybatis.bean.Employee" alias="employee"/>
		
		<!--
			方法2.
				package:为某个包下的所有类批量起别名
				name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名【类名小写】)
		-->
		<package name="com.bgy.mybatis.bean"/>
		
		<!-- 
			方法3.
				批量起别名的情况下,如果类名重复,使用@Alias注解为某个类型执指定新的别名 
		-->
	</typeAliases>
    
    <!-- ====================================================================================== -->
	
	<!-- 
		4.
		environments:环境,mybatis可以配置多种环境;default指定使用某种环境
			environment:配置一个具体的环境信息;必须要一下两个标签;id代表当前环境的唯一标识
				transactionManager:事务管理器
					type:事务管理器的类型
						JDBC | MANAGED
						自定义事务管理器:实现TransactionFactory接口.type指定为全类名
				dataSource:数据源
					type:数据源类型
						UNPOOLED | POOLED | JNDI
						自定义数据源:实现DataSourceFactory接口,type是群类名
					
	-->
	<environments default="development">
	
		<environment id="test">
			<transactionManager type=""></transactionManager>
			<dataSource type=""></dataSource>
		</environment>
		
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
    
     <!-- ====================================================================================== -->
    <!--
    	5.
		databaseIdProvider:支持多数据库厂商
			type="DB_VENDOR"
				作用就是得到数据库厂商的标识,mybatis就能根据数据库厂商标识来执行不同的sql
				MySQL | Oracle | SQL Server ....
	-->
	<databaseIdProvider type="DB_VENDOR">
		<!-- 为不同的数据厂商起别名 -->
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
		<property name="SQL Server" value="sqlserver"/>
	</databaseIdProvider>
    
    <!-- ====================================================================================== -->

	<!-- 
		6.
		将我们写好的sql映射文件(EmployeeMapper.xml)注册到全局配置文件(mybatis-config.xml)中	
	-->
	<mappers>
		<!--
			mapper:注册一个sql映射
				注册配置文件:
					resource:引用类路径下的sql映射文件
					url:引用网络路径或者磁盘路径下的sql映射文件
						file:///var/mappers/AuthorMapper.xml
				注册接口:
					class:引用(注册)接口
						方法1)有sql映射文件,映射文件名必须和接口名相同,并且放在与接口同一目录下
						方法2)没有sql映射文件,所有的sql都是利用注解写在接口上的
		-->
		<!-- <mapper url="file:///var/mappers/AuthorMapper.xml"/> -->
		
		<!-- <mapper resource="EmployeeMapper.xml" /> -->
		
		<!-- 方法1)有sql映射文件,映射文件名必须和接口名相同,并且放在与接口同一目录下 -->
		<!-- <mapper class="com.bgy.dao.EmployeeMapper"/> -->
		
		<!-- 方法2)没有sql映射文件,所有的sql都是利用注解写在接口上的 -->
		<!-- <mapper class="com.bgy.mybatis.dao.EmployeeMapperAnnotation"/> -->
		
		<!-- 
			批量注册 
			映射文件名必须和接口名相同,并且放在与接口同一目录下
			把EmployeeMapper.xml文件和EmployeeMapper.java文件,都放在com.bgy.dao包下
		-->
		<!-- <package name="com.bgy.dao"/> -->
		<package name="com.bgy.mybatis.dao"/>
	</mappers>
</configuration>

Department.java

package com.bgy.mybatis.bean;

public class Department {
	private Integer id;
	private String departmentName;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getDepartmentName() {
		return departmentName;
	}
	public void setDepartmentName(String departmentName) {
		this.departmentName = departmentName;
	}
	@Override
	public String toString() {
		return "Department [id=" + id + ", departmentName=" + departmentName + "]";
	}
}

测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值