MyBatis级联查询(多对一或一对多)

MyBatis级联查询

一、级联查询:多对一
1、实体类(多方表关联一方表)
// 员工表和部门表做逻辑外键关联
private Dept dept;

public Dept getDept() {
    return dept;
}

public void setDept(Dept dept) {
    this.dept = dept;
}
2、mapper接口
 /**
  * 级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称
  * @param number
  * @return
  */
EmpEntity selectEmpById(Integer number);
3、映射文件
<resultMap id="EmpSelDept" type="EmpEntity">
    <id column="number" property="number"/>
    <result column="name" property="name"/>
    <result column="job" property="job"/>
    <result column="mgr" property="mgr"/>
    <result column="hiredate" property="hiredate"/>
    <result column="sal" property="sal"/>
    <result column="comm" property="comm"/>
    <result column="deptno" property="deptno"/>
    <association property="dept" javaType="Dept" >
        <id column="deptno" property="deptno"/>
        <result column="dname" property="dname"/>
        <result column="loc" property="loc"/>
    </association>
</resultMap>

<!--级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称-->
<!--结果集中包含两个表的数据,结果集使用resultMap-->
<select id="selectEmpById" parameterType="integer" resultMap="EmpSelDept">
    SELECT * FROM emp e INNER JOIN dept d ON e.deptno = d.deptno WHERE e.number = #{number}
</select>
4、测试类
// 级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称
@Test
public void findEmpById(){
    EmpEntity emp = sqlSession.getMapper(EmpMapper.class).selectEmpById(1007);
    // javaBean导航
    System.out.println("员工部门:" + emp.getDept().getDname());
}
二、级联查询:一对多
1、实体类(一方表关联多方表)
 // 部门表关联员工表
private List<EmpEntity> emps;

public List<EmpEntity> getEmps() {
    return emps;
}

public void setEmps(List<EmpEntity> emps) {
    this.emps = emps;
}
2、mapper接口层
/**
 * 级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息
 * @param deptno
 * @return
 */
Dept selectEmpByDept(Integer deptno)
3、映射文件
<resultMap id="DeptSelEmp" type="Dept">
    <id column="deptno" property="deptno" />
    <result column="dname" property="dname"/>
    <result column="loc" property="loc"/>
    <collection property="emps" ofType="EmpEntity" >
        <id property="number" column="number"/>
        <result column="name" property="name"/>
        <result column="job" property="job"/>
        <result column="mgr" property="mgr"/>
        <result column="hiredate" property="hiredate"/>
        <result column="sal" property="sal"/>
        <result column="comm" property="comm"/>
        <result column="deptno" property="deptno"/>
    </collection>
</resultMap>

<!--级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息-->
<select id="selectEmpByDept" parameterType="int" resultMap="DeptSelEmp">
    SELECT * FROM dept d LEFT JOIN emp e ON e.deptno = d.deptno WHERE d.deptno = #{deptno}
</select>
4、测试类
// 级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息
@Test
public void findEmpByDept(){
    sqlSession.getMapper(EmpMapper.class).selectEmpByDept(70);
}
三、总结

一对多:以一的一方为主表; 多对一:以多的一方为主表

Association 封装一的一方的数据,固定类型搭配 :javaType

collection封装多的一方的数据,固定类型搭配:ofType

MyBatis提供了一种简便的方式来实现一对级联查询。在这种情况下,一个实体类中包含了个子实体类的集合,这些子实体类与该实体类是一对的关系。 下面是一对级联查询的示例: 1. 首先,我们创建以下两个实体类: Order.java ```java public class Order { private int id; private String code; private List<OrderItem> items; // 省略getter和setter方法 } ``` OrderItem.java ```java public class OrderItem { private int id; private int orderId; private String product; private int quantity; // 省略getter和setter方法 } ``` 2. 接下来,我们需要创建一个映射文件来进行一对级联查询。在这个映射文件中,我们需要使用`<collection>`标签来定义一个集合属性,用来存储子实体类的列表。 OrderMapper.xml ```xml <mapper namespace="com.example.OrderMapper"> <resultMap id="orderMap" type="com.example.Order"> <id property="id" column="id"/> <result property="code" column="code"/> <collection property="items" ofType="com.example.OrderItem"> <id property="id" column="item_id"/> <result property="product" column="product"/> <result property="quantity" column="quantity"/> </collection> </resultMap> <select id="getOrders" resultMap="orderMap"> SELECT o.id, o.code, i.id as item_id, i.product, i.quantity FROM orders o LEFT JOIN order_items i ON o.id = i.order_id ORDER BY o.id </select> </mapper> ``` 在这个映射文件中,我们使用了`<resultMap>`标签来定义一个结果集映射,它包含了一个`<collection>`标签来定义子实体类的集合属性。在查询语句中,我们使用了`LEFT JOIN`来将订单和订单项关联起来,并使用`ORDER BY`子句来按订单ID排序。 3. 最后,我们需要创建一个接口来调用映射文件中的查询方法。 OrderMapper.java ```java public interface OrderMapper { List<Order> getOrders(); } ``` 现在,我们可以使用这个接口来查询订单和订单项的信息,如下所示: ```java SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = factory.openSession(); OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orders = orderMapper.getOrders(); for (Order order : orders) { System.out.println(order.getCode()); for (OrderItem item : order.getItems()) { System.out.println("\t" + item.getProduct() + " x" + item.getQuantity()); } } ``` 这个示例中,我们首先创建了一个`SqlSessionFactory`对象,然后使用它来创建一个`SqlSession`对象。接下来,我们使用`getMapper()`方法来获取一个`OrderMapper`接口的实现类。最后,我们调用查询方法来获取订单和订单项的信息,并遍历结果集来输出这些信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值