Mybatis的一对多映射

如果是小白建议先看这篇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();
    }

}

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狗铂西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值