如果是小白建议先看这篇mybatis的快速入门上手:点我查看
在此基础上,我们重新创建一个Maven项目。开始mybatis的一对多的对的映射关系。
①数据准备
两个实体类:分别为员工和部门,一个员工对一个部门而一个部门可以对多个员工,两者之间就产生了一对多的关系。
package com.lsq.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {
private Integer d_id;
private String d_name;
//部门对员工的一对多关系
private List<Employee> employees;
}
package com.lsq.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
private Integer e_id;
private String e_name;
private String e_gender;
private Integer e_age;
//员工对部门的一对一关系
private Integer e_depart_id;
}
然后在数据库中创建对应属性的各个表与字段,如下表:
将mybatis-config.xml文件中的一次扫描一个Mapper的方式改为一次扫描一个包下
<mappers>
<!--一次引入一个-->
<!-- <mapper class="com.lsq.dao.UserMapper"></mapper>-->
<!--一次性全部引入一个包-->
<package name="com.lsq.dao"/>
</mappers>
②编写Dao层的Mapper和xml头文件
DepartmentMapper
package com.lsq.dao;
import com.lsq.pojo.Department;
public interface DepartmentMapper {
Department FindDepById(Integer id);
}
EmployeeMapper
package com.lsq.dao;
import com.lsq.pojo.Employee;
import java.util.List;
public interface EmployeeMapper {
List<Employee> findByBid(Integer did);
}
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="此处填写Mapper的全路径">
</mapper>
③分析问题:现要求根据id查询部门和属于该部门下的员工
如果我们直接将语句写成这样(下面这个是错误示范):
<select id="FindDepById" parameterType="int" resultType="Department">
SELECT * from department WHERE d_id=#{id};
</select>
那么将会因为实体类中存在 ‘ private List<Employee> employees; ’而导致无法正常映射,这种情况下就需要我们手动映射。也就是说用到了mybatis的resultMap映射。那么我们应该将查询语句写成这样。
<select id="FindDepById" parameterType="int" resultMap="DepBase">
SELECT * from department WHERE d_id=#{id};
</select>
其中 resultMap使我们最后查询出结果集要映射的Map。其中DepBase是resultMap的id,即是一个唯一的名字,这时我们还需要通过该标签去编写如何映射?这其中又包含许多标签(在此处使用了3种标签,其他不一一举例),其中id标签用于映射主键字段,result标签用于映射普通字段,collection标签(重点)用于映射一个集合类型;这其中有许多的标签内的属性,如:column表示数据库中的字段,property表示该字段在实体类中的对应属性,javaType是指要映射成的具体集合类型(此处为List),ofType是表示的javaType下对的的具体对象,而select是调用其他接口方法的方法名,所以需要填写要调用的全路径下的方法名。
<resultMap id="DepBase" type="Department">
<!--id映射主键字段-->
<id column="d_id" property="d_id"></id>
<!--result映射普通字段-->
<result column="d_name" property="d_name"></result>
<!--描述部门和员工之间的映射关系-->
<!--column 数据库中的字段名-->
<!--property 实体类中对应的属性 该关键字可以省略... -->
<!--javaType java集合的类型 该关键字可以省略... -->
<!--ofType 是javaType中的单个对象类型-->
<!--select是调用其他接口方法的方法名需要填写全路径下的方法名-->
<collection
property="employees"
javaType="list"
ofType="Employee"
column="d_id"
select="com.lsq.dao.EmployeeMapper.findByBid">
</collection>
</resultMap>
此时,我们再编写 com.lsq.dao.EmployeeMapper路径下的findByBid方法。
<?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.lsq.dao.EmployeeMapper">
<select id="findByBid" parameterType="int" resultType="Employee">
SELECT * FROM employee WHERE e_depart_id = #{did};
</select>
</mapper>
但是根据部门id查找员工是需要传入一个int类型的参数的,那如何将这个参数传入到映射集合中的collection呢?这是就需要在collection标签中的column属性,在这里它的意思时表示映射集(部门表)中哪个字段是要作为参数传入select标签指定的方法中的呢?其中javaType和ofType可以省略。
<?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.lsq.dao.DepartmentMapper">
<select id="FindDepById" parameterType="int" resultMap="DepBase">
SELECT * from department WHERE d_id=#{id};
</select>
<!--手动的映射-->
<resultMap id="DepBase" type="Department">
<!--id映射主键字段-->
<id column="d_id" property="d_id"></id>
<!--result映射普通字段-->
<result column="d_name" property="d_name"></result>
<!--描述部门和员工之间的映射关系-->
<!--column 数据库中的字段名-->
<!--property 实体类中对应的属性 该关键字可以省略... -->
<!--javaType java集合的类型 该关键字可以省略... -->
<!--ofType 是javaType中的单个对象类型-->
<!--select是调用其他接口方法的方法名需要填写全路径下的方法名-->
<collection
property="employees"
column="d_id"
select="com.lsq.dao.EmployeeMapper.findByBid">
</collection>
</resultMap>
</mapper>
④测试
import com.lsq.dao.DepartmentMapper;
import com.lsq.pojo.Department;
import com.lsq.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class test1 {
@Test
public void test_demo1(){
//利用工具类获得sqlSession
SqlSession sqlSession = MybatisUtils.getSession();
//获得接口实现类 【动态代理模式】
DepartmentMapper departmentMapper = sqlSession.getMapper(DepartmentMapper.class);
//通过mapper调用自定义的方法
Department department = departmentMapper.FindDepById(1);
System.out.println(department);
//释放资源
sqlSession.close();
}
}