mybatis的外键关联
时间: 2024-04-23 21:21:07 浏览: 14
MyBatis是一种Java持久化框架,它提供了一种简单而灵活的方式来将Java对象映射到数据库表中。在MyBatis中,外键关联可以通过两种方式来实现:一对一关联和一对多关联。
1. 一对一关联:
在一对一关联中,两个表之间存在一个外键关系,其中一个表的主键作为另一个表的外键。在MyBatis中,可以通过在映射文件中使用<association>标签来实现一对一关联。该标签可以指定关联的属性、关联的查询语句以及如何映射结果。
2. 一对多关联:
在一对多关联中,一个表的一条记录可以对应另一个表的多条记录。在MyBatis中,可以通过在映射文件中使用<collection>标签来实现一对多关联。该标签可以指定关联的属性、关联的查询语句以及如何映射结果。
相关问题
mybatis 外键级联删除
MyBatis并不支持直接的外键级联删除操作。然而,你可以通过在代码中手动实现级联删除的逻辑来达到这个目的。一种常见的方法是在删除父表数据之前,先删除关联的子表数据。这样可以避免因为外键约束而无法删除父表数据的情况发生。
你可以使用`delete`语句来删除子表数据,并且确保先删除子表数据再删除父表数据。下面是一个示例代码:
```xml
<delete id="deleteApplicationByIds">
<!-- 先删除子表数据 -->
delete from tc_application_role where application_id in (
select id from tc_application where id in (
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
);
<!-- 再删除父表数据 -->
delete from tc_application where id in (
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
);
</delete>
```
在上述示例代码中,`deleteApplicationByIds`方法首先删除了子表`tc_application_role`中与要删除的父表`tc_application`相关联的数据,然后再删除父表数据。这样就实现了外键级联删除的效果。
mybatis-plus 外键关联
Mybatis-Plus 支持外键关联的操作,具体实现方式可以分为两种:
1. 通过 `@TableField` 注解指定关联属性,使用 `@TableField(exist = false)` 标识该属性为非数据库字段,然后通过 `@TableField(value = "foreign_key")` 指定关联的外键字段。具体代码如下:
```java
@Data
public class User {
private Long id;
private String name;
private Integer age;
@TableField(value = "dept_id")
private Long deptId;
}
@Data
public class Dept {
private Long id;
private String name;
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("select u.*, d.name as dept_name from user u left join dept d on u.dept_id = d.id where u.id=#{id}")
User selectUserWithDept(Long id);
}
```
2. 使用 Mybatis-Plus 提供的 `@TableName` 注解的 `excludeProperty` 属性指定不需要插入的属性,然后使用 `@TableId` 注解指定主键,使用 `@TableField` 注解指定外键。具体代码如下:
```java
@Data
@TableName(excludeProperty = "dept")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField("dept_id")
private Long deptId;
@TableField(exist = false)
private Dept dept;
}
@Data
@TableName("dept")
public class Dept {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("select u.*, d.name as dept_name from user u left join dept d on u.dept_id = d.id where u.id=#{id}")
@Results({
@Result(column = "dept_id", property = "deptId"),
@Result(column = "dept_name", property = "dept.name")
})
User selectUserWithDept(Long id);
}
```
这里使用 `@Results` 注解来指定结果集中的属性映射关系,其中 `column` 指定查询结果中的列名,`property` 指定实体类中的属性名。