Mybatis-plus一对多、多对一关系映射使用案例

本文介绍了如何在Springboot项目中集成Mybatis-Plus,通过配置数据库连接,创建实体类,定义Mapper接口,实现一对多和多对一的查询操作。详细步骤包括引入依赖,设置数据库连接信息,建立数据库表,创建实体类,编写Mapper接口及XML文件,并进行测试。
摘要由CSDN通过智能技术生成
  1. 创建一个Springboot空项目

 

  1. 导入所以需要的依赖

     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.5.2</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

  2. 配置数据库连接信息

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/MP_TEST?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456

  3. 建库建表

  4. 创建实体类

    @Data
    public class Teacher {
        private String id;
        private String name;
        @TableField(exist = false)
        private List<Student> students;
    }
    @Data
    public class Student {
        private String id;
        private String name;
        private String sex;
        private String age;
        @TableField(exist = false)
        private Teacher teacher;
    }

    @TableField(exist = false) 代表该属性不从数据库表中查,默认为true

  5. 创建mapper

    public interface TeacherMapper extends BaseMapper<Teacher> {
    }
    public interface StudentMapper extends BaseMapper<Student> {
    }

    注意启动类要加上@MapperScan("com.example.mp_test.mapper"),否则mapper接口上需要加@Mapper

    测试一对多查询

    一个老师对应多个学生

public interface TeacherMapper extends BaseMapper<Teacher> {
    Teacher selectStudent(String id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.mp_test.mapper.TeacherMapper">
    <resultMap id="m_r" type="com.example.mp_test.entity.Teacher">
        <collection property="students" column="id"
            <!-- column代表查询的参数,此处id为从teacher表中查出的id,
                参数传给下面的方法,然后执行 -->
            select="com.example.mp_test.mapper.StudentMapper.selectByTeacherId">
            <!-- property代表查询结果应该注入到哪个属性中 -->
            <!-- select标签代表执行哪个类的哪个方法 -->
        </collection>
    </resultMap>
​
    <select id="selectStudent" resultMap="m_r">
        select *
        from student
        where id = #{id}
    </select>
</mapper>
public interface StudentMapper extends BaseMapper<Student> {
    @Select("select * from student where teacher_id = #{id}")
    List<Student> selectByTeacherId(String id);
    //使用@Select省略篇幅,复杂sql可以使用xml
}

执行测试方法

@Test
void teacher() {
    System.out.println(teacherMapper.selectStudent("1"));
}

执行结果

 

测试多对一查询

多个学生对应一个老师

public interface StudentMapper extends BaseMapper<Student> {
    Student selectTeacher(String id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.mp_test.mapper.StudentMapper">
    <resultMap id="m_r" type="com.example.mp_test.entity.Student">
        <association property="teacher" column="teacher_id"
           <!-- column代表查询的参数,此处teacher_id为从teacher表中查出的teacher_id
                参数传入下面的方法执行 -->
            <!-- TeacherMapper.selectById 为Mybatis-plus自带的方法,不用自己写 -->
        select="com.example.mp_test.mapper.TeacherMapper.selectById"/>
    </resultMap>
​
    <select id="selectTeacher" resultMap="m_r">
        select *
        from student
        where id = #{id}
    </select>
</mapper>

执行测试方法

@Test
void student() {
    System.out.println(studentMapper.selectTeacher("1"));
}

执行结果

此案例为Mybatis-plus官方案例简化版。

mybatis-plus官方案例icon-default.png?t=M7J4https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-resultmap

 

好的,让我来解答您的问题。使用Mybatis-Plus的连表查询需要首先定义实体类以及数据库表的关系,然后在Mapper中使用注解或者XML配置对应的SQL语句。 假设我们有一个User实体类,其中包含一个userId和一个List<Order>类型的orders属性,表示一个用户可以有多个订单。在数据库中,user和order分别对应user和order表,且order表中有一个userId字段与user表中的userId相关联。 我们可以通过以下方式实现一对多的查询: 1.定义实体类和数据库表的关系 ``` public class User { private Long userId; private List<Order> orders; //getter and setter } public class Order { private Long orderId; private Long userId; //getter and setter } CREATE TABLE user ( user_id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (user_id) ); CREATE TABLE order ( order_id int(11) NOT NULL AUTO_INCREMENT, user_id int(11), PRIMARY KEY (order_id) ); ``` 2.在Mapper中定义SQL语句 使用Mybatis-Plus注解,可以在Mapper接口方法上添加@TableId、@TableField、@Select等注解来直接映射关联表查询语句。示例如下: ``` public interface UserMapper extends BaseMapper<User> { @Select("select * from user left join order on user.user_id = order.user_id where user.user_id = #{userId}") User getUserOrders(@Param("userId") Long userId); } ``` 或者使用Mybatis XML配置方式映射查询语句。示例如下: ``` <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userMap" type="User"> <id column="user_id" property="userId"/> <collection property="orders" ofType="Order"> <id column="order_id" property="orderId"/> </collection> </resultMap> <select id="getUserOrders" resultMap="userMap"> select * from user left join order on user.user_id = order.user_id where user.user_id = #{userId} </select> </mapper> ``` 以上就是使用Mybatis-Plus实现一对多查询的示例代码,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值