SpringBoot整合mybatis
前言
简单介绍mybatis 1对1 1对多 多对多 的xml与注解实现
一、前期环境搭建
两张很简单表,student表有teacher的id
然后分别创建对应的PO(数据库对象)和DTO(业务对象)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TeacherDTO {
private String id;
private String name;
private List<StudentPO> studentPO;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private String id;
private String name;
}
//一个是数据库对象,一个是业务对象,放在一起好看清楚
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String id;
private String name;
private Teacher teacher;
)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentPO {
private String id;
private String name;
}
接下来一些mybatis与springboot的搭建
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: pojo包位置 #mapper缩写
spring:
datasource:
url: jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: 本地mysql账号
password: 本地mysql密码
其他细节:略,请去百度自行搜索学习
二、1对1 1对多简单配置
1.mapper.xml配置
代码如下(示例):
@Repository
@Mapper
public interface TeacherMapper {
List<TeacherDTO> findAllTeacher();
}
//都是全部查询
@Repository
@Mapper
public interface StudentMapper {
List<Student> findAllStudent();
}
接下配置StudentMapper.xml
<?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.heng.dao.StudentMapper">
<resultMap id="student_teacher" type="student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!--将查询出来的新表属性,拼入Teacher属性中-->
<association property="teacher" column="teacher_id" javaType="com.heng.pojo.Teacher">
<id property="id" column="tea_id"/>
<result property="name" column="tea_name"/>
</association>
</resultMap>
<select id="findAllStudent" resultMap="student_teacher">
select
stu.id as id,
stu.name as name,
tea.id as tea_id,
tea.name as tea_name
from student stu
inner join teacher tea
on stu.teacher_id = tea.id
</select>
</mapper>
TeacherMapper.xml
<?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.heng.dao.TeacherMapper">
<resultMap id="TeacherToStudent" type="teacherDTO">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 查询出的新表属性进行拼接, ofType泛型类型 -->
<collection property="studentPO" ofType="StudentPO" javaType="ArrayList" column="stu_id">
<result property="id" column="stu_id"/>
<result property="name" column="stu_name"/>
</collection>
</resultMap>
<select id="findAllTeacher" resultMap="TeacherToStudent">
select
tea.id as id,
tea.name as name,
stu.name as stu_name,
stu.id as stu_id
from teacher tea,student stu
where tea.id = stu.teacher_id
</select>
</mapper>
使用MVC测试
@RequestMapping("/studentlist")
public List findAllStudent(){
List<Student> list = studentMapper.findAllStudent();
return list;
}
@RequestMapping("/teacherlist")
public List findAllTeacherDTO(){
List<TeacherDTO> list = teacherMapper.findAllTeacher();
return list;
}
结果如下
2.使用mybatis注解
mybatis注解实现其实本质就是二次查询
Student对象查询
//Studnet中需要Teacher类,所以就去TeacherMapper接口中,二次查询放入
//如果对应属性名与字段名不同,用@Result手动对应装配
@Select("select * from `student`")
@Results(
@Result(property = "teacher",column = "teacher_id",//column:查询出来的teacher_id当作条件二次查询
one = @One(
select = "自己的包.TeacherMapper.findTeacherById"
))
)
List<Student> findStuentWithTeacher();
// 通过id查询Teacher,而查询出来的对象,就是Student中的属性
@Select("select * from `teacher` where id = #{id}")
Teacher findTeacherById(int id);
Teacher对象查询
//Teacher中需要List<StudentPO>属性,所以就去StudentMapper接口中二次查询装配
@Select("select * from `teacher`")
@Results({
@Result(property = "id",column = "id"), //装配查询出的id到属性中
@Result(property = "studentPO",column = "id", //column:查询出来的id当作条件二次查询
many = @Many(
select = "com.heng.dao.StudentMapper.findStudentPOByTeacherid",
fetchType = FetchType.EAGER
)
)
})
List<TeacherDTO> findTeacherWithStudent();
//
@Select("select * from `student` where teacher_id = #{teacher_id}")
List<StudentPO> findStudentPOByTeacherid(int teacher_id);
一样使用MVC测试
@RequestMapping("/studentwith")
public List findAllStudentByWith(){
List<Student> list = studentMapper.findStuentWithTeacher();
return list;
}
@RequestMapping("/teacherwith")
public List findAllTeacherDTOByWith(){
List<TeacherDTO> list = teacherMapper.findTeacherWithStudent();
return list;
}
结果成功
总结
以上就是springboot简单整合使用mybatis两种方式,其中XML的ResultMap映射association和collection也可以使用二次查询装配,就是属性select配置,但是在这里就不介绍了,因为本来就是简单学习,读者需要自行搜索学习。