MyBatis中的一对一,一对多关联

一对多
Mapper.xml

4.3.2. Mapper.xml
在UserMapper.xml添加sql,如下:
<resultMap type="user" id="userOrderResultMap">
    <id property="id" column="id" />
    <result property="username" column="username" />
    <result property="birthday" column="birthday" />
    <result property="sex" column="sex" />
    <result property="address" column="address" />

    <!-- 配置一对多的关系 -->
    <collection property="orders" javaType="list" ofType="order">
        <!-- 配置主键,是关联Order的唯一标识 -->
        <id property="id" column="oid" />
        <result property="number" column="number" />
        <result property="createtime" column="createtime" />
        <result property="note" column="note" />
    </collection>
</resultMap>

<!-- 一对多关联,查询订单同时查询该用户下的订单 -->
<select id="queryUserOrder" resultMap="userOrderResultMap">
    SELECT
    u.id,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.id oid,
    o.number,
    o.createtime,
    o.note
    FROM
    `user` u
    LEFT JOIN `order` o ON u.id = o.user_id
</select>

collection元素,一对多级联,其select元素指向SQL,将通过column制定的SQL字段作为参数进行传递。

一对一级联,使用association元素。

MyBatis的级联分为3种:
一对一(association):比如学生证和学生
一对多(collection):比如班主任和学生就是一种一对多的级联
鉴别器(discriminator):它是一个根据某些条件决定采用具体实现类级联的方案,比如体检表要根据性别去区分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis处理关联一对多的方式与处理其他一对多关系的方式类似。假设我们有一个Department表,每个部门可以有多个下属部门,我们可以在Department表增加一个parent_id字段表示上级部门的id,从而实现自关联。接下来,我们可以定义一个DepartmentMapper接口,使用Mybatis的注解或XML方式实现查询自关联表的一对多关系。 XML方式实现: ```xml <!-- 定义查询语句 --> <select id="getSubDepartments" resultType="Department"> select * from department where parent_id = #{parentId} </select> <!-- 定义DepartmentMapper接口 --> public interface DepartmentMapper { List<Department> getSubDepartments(Integer parentId); } ``` 注解方式实现: ```java @Select("select * from department where parent_id = #{parentId}") List<Department> getSubDepartments(Integer parentId); ``` 以上代码实现了查询某个部门的所有下属部门。如果需要查询某个部门的所有子部门,可以使用递归方式查询。例如,我们可以在Department类定义一个children属性表示子部门列表,然后在查询部门时同时查询其所有子部门,并通过递归方式将子部门添加到父部门的children属性。代码如下: ```java public class Department { private Integer id; private String name; private Integer parentId; private List<Department> children; // getter和setter省略 public void addSubDepartment(Department department) { if (children == null) { children = new ArrayList<>(); } children.add(department); } } public interface DepartmentMapper { @Select("select * from department where parent_id = #{parentId}") List<Department> getSubDepartments(Integer parentId); } public class DepartmentService { @Autowired private DepartmentMapper departmentMapper; public Department getDepartmentTree(Integer departmentId) { Department department = departmentMapper.getDepartment(departmentId); List<Department> subDepartments = departmentMapper.getSubDepartments(departmentId); if (subDepartments != null) { for (Department subDepartment : subDepartments) { Department subDepartmentTree = getDepartmentTree(subDepartment.getId()); department.addSubDepartment(subDepartmentTree); } } return department; } } ``` 以上代码实现了查询某个部门的所有子部门,并将其构造成树型结构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值