【Mybatis】association solves one-to-one association query

In the previous article, we used cascading properties to find out and encapsulate data into Employee, and there is another way to implement data encapsulation.
Next, the editor will introduce the relevant knowledge of the association tag, including nested query and segmented query.

First, please refer to steps 1, 2, 3, 4 in the previous article, and start from step 5 here


1. Nested query

5. Add EmployeeMapper.xml file, the configuration information is as follows

<?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.atguigu.mybatis.dao.EmployeeMapper">  
 <!-- Use association to define the encapsulation rules of an associated single object: -->
	 <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDifEmp">
	 	<id column="id" property="id"/>
	 	<result column="last_name" property="lastName"/>
	 	<result column="gender" property="gender"/>
	 	
	 	<!-- association can specify the associated JavaBean object
	 	property="dept": specifies which property is the object of the union
	 	javaType: Specify the type of this attribute object [cannot be omitted]
	 	 -->
	 	<association property="dept" javaType="com.atguigu.mybatis.bean.Department">
	 		<id column="did" property="id"/>
	 		<result column="dept_name" property="departmentName"></result>
	 	</association>
	 </resultMap>
   
 <select id="getEmpAndDept" resultMap="MyDifEmp">  
             SELECT  
                 e.id,  
                 e.last_name last_name,  
                 e.gender gender,  
                 e.d_id d_id,  
                 d.id did,  
                 d.dept_name dept_name  
             FROM  
                 tbl_employee e,  
                 tbl_dept d  
             WHERE  
                 e.d_id = d.id  
             AND e.id = #{id}  
      </select>  
 <mapper/>  

6. New test method

	@Test
	public void test05() throws IOException{
		
		SqlSessionFactory sqlSesssionFactory = getSqlSesssionFactory();
		SqlSession openSession = sqlSesssionFactory.openSession();
		try {
			EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
			Employee empAndDept = mapper.getEmpAndDept (1);
			System.out.println(empAndDept);
			System.out.println(empAndDept.getDept());
		} finally {
			openSession.close();
		}
	}


7. Console Information

Employee [id=1, lastName=letty, email=null, gender=1, dept=Department [id=1, departmentName=开发部]]

Department [id=1, departmentName=Development Department]


2. Step-by-step query (that is, after checking one table, check another table, and execute it in multiple SQLs)

5. Create a new DepartmentMapper.java interface and add an interface getDeptById

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

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

7.修改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.atguigu.mybatis.dao.EmployeeMapper">  
  <!-- 使用association进行分步查询
	 	1.先按照员工id查询员工信息
	 	2.根据查询员工信息中的d_id值去部门表查询出部门信息
	 	3.部门设置到员工中
  -->
	 
	 
	 <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmpByStep">
	 	<id column="id" property="id"/>
	 	<result column="last_name" property="lastName"/>
	 	<result column="gender" property="gender"/>
	 	<result column="email" property="email"/>
	 	
	 	<!-- association定义关联对象的封装规则
	 		select:表明当前属性是调用select指定的方法查出的结果
	 		column:指定将哪一列的值传给这个方法
	 		
	 		流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
	 	 -->
	 	<association property="dept" 
	 		select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById"
	 		column="d_id">	 		
	 	</association>
	 </resultMap>
  
        <select id="getEmpByIdStep" resultMap="MyEmpByStep">
	 	select * from tbl_employee where id=#{id}
	</select>
<mapper/>  

8.新增测试方法
@Test
	public void test05() throws IOException{
		
		SqlSessionFactory sqlSesssionFactory = getSqlSesssionFactory();
		SqlSession openSession = sqlSesssionFactory.openSession();
		try {
			EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
			Employee employee = mapper.getEmpByIdStep(1);
			System.out.println(employee.getLastName());
			System.out.println(employee.getDept());
		} finally {
			openSession.close();
		}
	}

9.控制台信息


查询了2次SQL,达到了我们分步查询的目的


注:在分段查询的基础上可以使用懒加载(延迟加载,按需加载),即当需要的时候再查,不需要的时候不用把所有的信息都查出来。

方法:只需要在全局配置文件中加两个配置

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

新建test方法测试,先查名字

public void test05() throws IOException{
		
		SqlSessionFactory sqlSesssionFactory = getSqlSesssionFactory();
		SqlSession openSession = sqlSesssionFactory.openSession();
		try {
			EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
			Employee employee = mapper.getEmpByIdStep(1);
			System.out.println(employee.getLastName());
		} finally {
			openSession.close();
		}
	}

控制台信息:只查询了一次SQL,没有查部门

新建test方法测试,查名字和部门

public void test05() throws IOException{
		
		SqlSessionFactory sqlSesssionFactory = getSqlSesssionFactory();
		SqlSession openSession = sqlSesssionFactory.openSession();
		try {
			EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);			
			Employee employee = mapper.getEmpByIdStep(1);
			System.out.println(employee.getLastName());
			System.out.println(employee.getDept());
		} finally {
			openSession.close();
		}
	}

控制台信息:查询了两次SQL,都是分步查询


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325727709&siteId=291194637