关键词

Mybatis实现关联关系映射的方法示例

下面是详细讲解“Mybatis实现关联关系映射的方法示例”的完整攻略。

一、什么是关联关系映射

在实际开发中,我们往往会涉及到多个数据表之间的关联关系,比如一对多、多对多等关系。Mybatis作为一款优秀的ORM框架,在这方面也提供了相应的支持。关联关系映射是将多个表之间的关系映射到Java类之间的过程,使得Java类之间可以方便地进行关联操作。下面我们通过两个示例来详细讲解Mybatis实现关联关系映射的方法。

二、一对多关系映射

  1. 创建数据表

首先我们需要创建两个数据表,一个是部门表department,另一个是员工表employee。其中员工表与部门表存在一对多的关系,一个部门拥有多个员工。

CREATE TABLE department (
  dep_id INT PRIMARY KEY,
  dep_name VARCHAR(20)
);

CREATE TABLE employee (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR(20),
  sex VARCHAR(2),
  age INT,
  dep_id INT,
  FOREIGN KEY (dep_id) REFERENCES department(dep_id)
);
  1. 创建Java实体类

接下来我们创建两个Java实体类Department和Employee,分别对应数据库中的部门和员工表。

public class Department {
  private Integer depId;
  private String depName;
  private List<Employee> emps;

  // 省略setter、getter方法
}

public class Employee {
  private Integer empId;
  private String empName;
  private String sex;
  private Integer age;
  private Integer depId;

  private Department department;

  // 省略setter、getter方法
}

可以看到,Department类中包含了一个List类型的属性emps,表示一个部门下的所有员工,而Employee类中包含了一个Department类型的属性department,表示该员工所属的部门。

  1. 创建Mapper映射文件

接下来我们需要创建Mapper映射文件,对应SQL语句的查询以及Java实体类的映射。

<!-- DepartmentMapper.xml -->
<mapper namespace="com.example.DepartmentMapper">
  <select id="getDeptById" parameterType="int" resultType="Department">
    select * from department where dep_id=#{id};
  </select>
</mapper>
<!-- EmployeeMapper.xml -->
<mapper namespace="com.example.EmployeeMapper">
  <select id="getEmpById" parameterType="int" resultType="Employee">
    select * from employee where emp_id=#{id};
  </select>

  <select id="getEmpsByDepId" parameterType="int" resultType="Employee">
    select * from employee where dep_id=#{id};
  </select>
</mapper>

可以看到,DepartmentMapper中定义了一个查询部门信息的SQL语句,返回类型为Department;而EmployeeMapper中定义了两个SQL语句,一个查询单个员工信息,返回类型为Employee;另一个查询某个部门下的所有员工信息,返回类型为List

  1. 创建Mapper接口及其实现类

接下来我们需要创建Mapper接口及其实现类,用于调用Mapper映射文件中定义的SQL语句。

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

public interface EmployeeMapper {
  Employee getEmpById(Integer id);
  List<Employee> getEmpsByDepId(Integer depId);
}
public class DepartmentMapperImpl implements DepartmentMapper {
  // 省略方法实现
}

public class EmployeeMapperImpl implements EmployeeMapper {
  // 省略方法实现
}

可以看到,DepartmentMapper中定义了一个查询部门信息的方法getDeptById;EmployeeMapper中定义了两个方法getEmpById和getEmpsByDepId,分别对应Mapper映射文件中定义的两个SQL语句。这两个实现类分别实现Mapper接口的方法,并通过SqlSessionFactory获取SqlSession对象来调用SQL语句实现查询操作。

  1. 创建Mybatis配置文件

接下来我们需要创建Mybatis的配置文件,用于配置mapper、别名、数据库连接等信息。

<configuration>
  <typeAliases>
    <typeAlias type="com.example.Department" alias="Department" />
    <typeAlias type="com.example.Employee" alias="Employee" />
  </typeAliases>

  <mappers>
    <mapper resource="com/example/DepartmentMapper.xml"/>
    <mapper resource="com/example/EmployeeMapper.xml"/>
  </mappers>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
      </dataSource>
    </environment>
  </environments>
</configuration>
  1. 测试关联查询

最后,我们可以通过测试代码来验证上述关联查询是否实现成功。

public class Test {
  public static void main(String[] args) {
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Test.class.getClassLoader().getResourceAsStream("mybatis-config.xml"));
    SqlSession session = factory.openSession();

    DepartmentMapper departmentMapper = session.getMapper(DepartmentMapper.class);
    Department department = departmentMapper.getDeptById(2);

    System.out.println(department.getDeptName());
    List<Employee> employees = department.getEmps();
    for (Employee emp : employees) {
      System.out.println(emp.getEmpName());
    }

    session.close();
  }
}

运行测试代码,输出如下:

Human Resources Department
Tom
Jerry

可以看到,成功查询到部门的名称以及该部门下的所有员工信息。

三、多对一关系映射

接下来我们再解释一下多对一关系映射的方法。多对一关系映射指的是多个数据表与一个数据表之间存在关联关系。

  1. 创建数据表

首先我们需要创建两个数据表,一个是员工表employee,另一个是部门表department。其中员工表与部门表存在多对一的关系,一个员工只属于一个部门,而一个部门可以拥有多个员工。

CREATE TABLE department (
  dep_id INT PRIMARY KEY,
  dep_name VARCHAR(20)
);

CREATE TABLE employee (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR(20),
  sex VARCHAR(2),
  age INT,
  dep_id INT,
  FOREIGN KEY (dep_id) REFERENCES department(dep_id)
);
  1. 创建Java实体类

接下来我们创建两个Java实体类Employee和Department,分别对应数据库中的员工和部门表。

public class Department {
  private Integer depId;
  private String depName;

  // 省略setter、getter方法
}

public class Employee {
  private Integer empId;
  private String empName;
  private String sex;
  private Integer age;
  private Integer depId;

  private Department department;

  // 省略setter、getter方法
}

可以看到,Employee类中包含了一个Department类型的属性department,表示该员工所属的部门。

  1. 创建Mapper映射文件

接下来我们需要创建Mapper映射文件,对应SQL语句的查询以及Java实体类的映射。

<!-- DepartmentMapper.xml -->
<mapper namespace="com.example.DepartmentMapper">
  <select id="getDeptById" parameterType="int" resultType="Department">
    select * from department where dep_id=#{id};
  </select>
</mapper>
<!-- EmployeeMapper.xml -->
<mapper namespace="com.example.EmployeeMapper">
  <select id="getEmpById" parameterType="int" resultType="Employee">
    select * from employee where emp_id=#{id};
  </select>

  <select id="getEmpsByDepId" parameterType="int" resultType="Employee">
    select * from employee where dep_id=#{id};
  </select>
</mapper>

可以看到,DepartmentMapper中定义了一个查询部门信息的SQL语句,返回类型为Department;而EmployeeMapper中定义了两个SQL语句,一个查询单个员工信息,返回类型为Employee;另一个查询某个部门下的所有员工信息,返回类型为List

  1. 创建Mapper接口及其实现类

接下来我们需要创建Mapper接口及其实现类,用于调用Mapper映射文件中定义的SQL语句。

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

public interface EmployeeMapper {
  Employee getEmpById(Integer id);
  List<Employee> getEmpsByDepId(Integer depId);
}
public class DepartmentMapperImpl implements DepartmentMapper {
  // 省略方法实现
}

public class EmployeeMapperImpl implements EmployeeMapper {
  // 省略方法实现
}

可以看到,DepartmentMapper中定义了一个查询部门信息的方法getDeptById;EmployeeMapper中定义了两个方法getEmpById和getEmpsByDepId,分别对应Mapper映射文件中定义的两个SQL语句。这两个实现类分别实现Mapper接口的方法,并通过SqlSessionFactory获取SqlSession对象来调用SQL语句实现查询操作。

  1. 创建Mybatis配置文件

接下来我们需要创建Mybatis的配置文件,用于配置mapper、别名、数据库连接等信息。

<configuration>
  <typeAliases>
    <typeAlias type="com.example.Department" alias="Department" />
    <typeAlias type="com.example.Employee" alias="Employee" />
  </typeAliases>

  <mappers>
    <mapper resource="com/example/DepartmentMapper.xml"/>
    <mapper resource="com/example/EmployeeMapper.xml"/>
  </mappers>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
      </dataSource>
    </environment>
  </environments>
</configuration>
  1. 测试关联查询

最后,我们可以通过测试代码来验证上述关联查询是否实现成功。

public class Test {
  public static void main(String[] args) {
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Test.class.getClassLoader().getResourceAsStream("mybatis-config.xml"));
    SqlSession session = factory.openSession();

    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
    Employee employee = employeeMapper.getEmpById(1);

    Department department = employee.getDepartment();
    System.out.println(department.getDepName());

    session.close();
  }
}

运行测试代码,输出如下:

Human Resources Department

可以看到,成功查询到员工所属的部门信息。

以上是Mybatis实现关联关系映射的方法示例的完整攻略。

本文链接:http://task.lmcjl.com/news/13168.html

展开阅读全文