-
创建一个Springboot空项目
-
导入所以需要的依赖
<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>
-
配置数据库连接信息
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
-
建库建表
-
创建实体类
@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
-
创建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官方案例简化版。