下面是详细讲解“Mybatis实现关联关系映射的方法示例”的完整攻略。
在实际开发中,我们往往会涉及到多个数据表之间的关联关系,比如一对多、多对多等关系。Mybatis作为一款优秀的ORM框架,在这方面也提供了相应的支持。关联关系映射是将多个表之间的关系映射到Java类之间的过程,使得Java类之间可以方便地进行关联操作。下面我们通过两个示例来详细讲解Mybatis实现关联关系映射的方法。
首先我们需要创建两个数据表,一个是部门表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)
);
接下来我们创建两个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,表示该员工所属的部门。
接下来我们需要创建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
接下来我们需要创建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语句实现查询操作。
接下来我们需要创建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>
最后,我们可以通过测试代码来验证上述关联查询是否实现成功。
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
可以看到,成功查询到部门的名称以及该部门下的所有员工信息。
接下来我们再解释一下多对一关系映射的方法。多对一关系映射指的是多个数据表与一个数据表之间存在关联关系。
首先我们需要创建两个数据表,一个是员工表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)
);
接下来我们创建两个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,表示该员工所属的部门。
接下来我们需要创建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
接下来我们需要创建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语句实现查询操作。
接下来我们需要创建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>
最后,我们可以通过测试代码来验证上述关联查询是否实现成功。
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