MyBatis的级联查询(分布查询)
<!-- 使用 association 进行分布查询
1 先按照员工id查询员工信息
2 根据查询员工信息中的d_id的值去部门表查出部门信息
3 部门设置到员工中
-->
EmployeeMapperPlus.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.cn.mybatis.dao.EmployeeMapperPlus">
<!-- 使用 association 进行分布查询
1 先按照员工id查询员工信息
2 根据查询员工信息中的d_id的值去部门表查出部门信息
3 部门设置到员工中
-->
<resultMap type="com.cn.zhu.bean.Employee" id="MyEmpByStep">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<!-- association 定义管理对象的封装规则
select: 表明当前属性是调用select 指定的方法
colum: 指定将哪一列的值传给这个方法
流程 : 使用select 指定的方法(传入column指定的这列参数的值)查出对象
并封装给property 指定的属性
-->
<association property="dept" select="com.cn.mybatis.dao.DepartmentMapper.getDeptById"
column="d_id">
</association>
</resultMap>
<!-- public Employee getEmpByIdStep(Integer id); -->
<select id="getEmpByIdStep" resultMap="MyEmpByStep">
select * from tbl_employee where id=#{id}
</select>
<!-- 分布好处
Employee==>Dept
我们每次查询Employee对象的时候,都将一起查询出来。
部门信息在我们使用的时候再去查询
分段查询的基础之上加上两个配置
-->
</mapper>
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.cn.mybatis.dao.DepartmentMapper">
<!-- public Department getDeptById(Integer id); -->
<select id="getDeptById" resultType="com.cn.zhu.bean.Department">
select id,dept_name
departmentName from tbl_dept where id=#{id}
</select>
</mapper>
DepartmentMapper.java
package com.cn.mybatis.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import com.cn.zhu.bean.Department;
import com.cn.zhu.bean.Employee;
public interface DepartmentMapper {
public Department getDeptById(Integer id);
public Department getDeptByIdPlus(Integer id);
public Department getDeptByIdStep(Integer id);
public List<Employee> getEmpsByDeptId(Integer deptId);
}
Department.java
package com.cn.zhu.bean;
import java.util.List;
public class Department {
private Integer id;
private String departmentName;
private List<Employee> emps;
public List<Employee> getEmps() {
return emps;
}
public void setEmps(List<Employee> emps) {
this.emps = emps;
}
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 [departmentName=" + departmentName + ", id=" + id
+ "]";
}
}
EmployeeMapperPlus.java
package com.cn.mybatis.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import com.cn.zhu.bean.Employee;
public interface EmployeeMapperPlus {
public Employee getEmpById(Integer id);
public Employee getEmpAndDept(Integer id);
public Employee getEmpByIdStep(Integer id);
}
在config.xml加上
mybatis-config.xml
<mappers>
<mapper resource="mybatis/mapper/EmployeeMapperPlus.xml" />
<mapper resource="mybatis/mapper/DepartmentMapper.xml" />
</mappers>
MyBatisTest.java
package com.cn.zhu.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
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.Test;
import com.cn.mybatis.dao.CopyOfEmployeeMapperAnnotation;
import com.cn.mybatis.dao.DepartmentMapper;
import com.cn.mybatis.dao.EmployeeMapper;
import com.cn.mybatis.dao.EmployeeMapperPlus;
import com.cn.zhu.bean.Department;
import com.cn.zhu.bean.Employee;
/**
* 1 接口式编程
* 原生 dao ====> DaoImpI
* mybatis Mapper====>xxMapper.xml
*
* 2 Sql Session 代表 和数据库的一次回话,用完必须关闭
* 3 SqlSession 和 connection 一样她都是非线程安全。
* @author Administrator
*
*/
public class MyBatisTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 1. 根据xml配置文件( 全局配置文件)创建一个sqlsessionFactory对象
* 有数据源一些运行环境信息
* 2 sql映射文件: 配置了每一个sql,以及sql的 封装规则等
* 3 将sql映射文件注册在全局配置文件中
* 4 写代码
* 1 根据全局配置文件得到sqlSessionFactory
* 2 使用sqlsession工厂,获取到sqlsession对象使用池来执行增删改查
* 一个sqlsession就是代表和数据库的一次回话。用完也要关闭
* @throws IOException
*/
/* @Test
public void test() throws IOException{
*//**
* 2 获取sqlsession实例,能直接执行已经映射的sql语句
*//*
SqlSession openSession=getSqlSessionFactory().openSession();
try{
Employee employee= openSession.selectOne("com.cn.mybatis.EmployeeMapper.selectEmp", 1);
System.out.println(employee);
}finally{
openSession.close();
}
}*/
@Test
public void test05() throws IOException{
SqlSessionFactory sqlsessionFactory=getSqlSessionFactory();
// 1 获取到的sqlsession不会自动提交数据
SqlSession openSession=sqlsessionFactory.openSession();
try{
EmployeeMapperPlus mapper=openSession.getMapper(EmployeeMapperPlus.class);
//级联查询
Employee empAndDept=mapper.getEmpAndDept(1);
System.out.println(empAndDept);
System.out.println(empAndDept.getDept());
// 分布查询
Employee employee=mapper.getEmpByIdStep(1);
System.out.println(employee);
System.out.println(employee.getDept());
}finally{
openSession.commit();
}
}
}
测试结果
接下来会写mybatis对集合的遍历查询