mybatis--多对一处理/一对多处理
多对一处理(association)
-
多个学生对一个老师
-
对于学生这边,关联:多个学生,关联一个老师[多对一]
-
对于老师而言,集合,一个老师有多个学生【一对多】
SQL:
测试环境搭建
1.导入依赖文件并编写配置文件
pom.xml
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
</dependency>
</dependencies>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 映入外部配置文件-->
<properties resource="db.properties"/>
<settings>
<!-- 标准的日志工厂实现-->
<setting name="logImpl" value="stdout_logging"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.lyc.mapper.StudentMapper"/>
<mapper class="com.lyc.mapper.TeacherMapper"/>
</mappers>
</configuration>
db.properties
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username = root
password = 211314
2.新建实体类
student
package com.lyc.pojo;
import lombok.Data;
import org.apache.ibatis.type.Alias;
@Data
@Alias("student")
public class Student {
private int id;
private String name;
//学生要关联一个老师
private Teacher teacher;
}
Teacher
package com.lyc.pojo;
import lombok.Data;
import org.apache.ibatis.type.Alias;
@Data
@Alias("teacher")
public class Teacher {
private int id;
private String name;
}
3.编写Mybatis工具包
package com.lyc.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
public SqlSession getsqlSession() throws IOException {
String resource = "mybatis-config.xml";
InputStream stream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
return sqlSessionFactory.openSession(true);
}
}
4.建立Mapper接口,建立Mapper.xml
studentMapper.java
package com.lyc.mapper;
import com.lyc.pojo.Student;
import java.util.List;
public interface StudentMapper {
List<Student> getStudent();
List<Student> getStudent2();
}
teacherMapper.java
package com.lyc.mapper;
import com.lyc.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface TeacherMapper {
// @Select("select * from mybatis.teacher where id = #{tid}")
Teacher getTeacher(@Param("tid") int id);
}
5.在核心配置文件中绑定注册我们的Mapper映射文件
<mappers>
<mapper class="com.lyc.mapper.StudentMapper"/>
<mapper class="com.lyc.mapper.TeacherMapper"/>
</mappers>
按照查询嵌套处理
studentmapper.xml
<mapper namespace="com.lyc.mapper.StudentMapper">
<!-- 思路:
1.查询所有的学生信息
2.根据查询出来的学生的tid查询到老师信息
-->
<select id="getStudent" resultMap="student-teacher">
select *
from mybatis.student;
</select>
<resultMap id="student-teacher" type="com.lyc.pojo.Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- 复杂的属性,我们需要单独处理
对象:association
集合:collection-->
<association property="teacher" column="tid" javaType="com.lyc.pojo.Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="com.lyc.pojo.Teacher">
select * from mybatis.teacher where id = #{id}
</select>
</mapper>
按照结果嵌套查询
studentmapper.xml
<!-- 按照结果嵌套处理-->
<select id="getStudent2" resultMap="student-teacher2">
select student.id,student.name,teacher.name as teacherName
from mybatis.student,mybatis.teacher
where student.tid = teacher.id
</select>
<resultMap id="student-teacher2" type="com.lyc.pojo.Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<association property="teacher" javaType="com.lyc.pojo.Teacher">
<result property="name" column="teacherName"/>
</association>
</resultMap>
注:单表查询时,当执行到tid时去调用映射,映射又去子查询,所以#{}里面自动填充了cloum的值,所以#{}的值可以随便添,记住,是单表查询时
回顾MySQL多对一查询方式:
-
子查询
-
联表查询
一对多处理(collection)
环境搭建: 与上文一致
实体类:
public class Student {
private int id;
private String name;
//学生要关联一个老师
private int tid;
}
public class Teacher {
private int id;
private String name;
//一个老师有多个老师
private List<Student> students;
}
mapper类:
teacherMapper.java
package com.lyc.mapper;
import com.lyc.pojo.Teacher;
import com.lyc.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TeacherMapper {
// List<Teacher> selectTeacher();
//获取指定老师下的所有学生及老师信息
Teacher selectTeacher(@Param("tid") int id);
Teacher selectTeacher2(@Param("tid") int id);
}
按照查询嵌套处理
TeacherMapper.xml
<select id="selectTeacher2" resultMap="teacher-student2">
select * from mybatis.teacher where id = #{tid};
</select>
<resultMap id="teacher-student2" type="com.lyc.pojo.Teacher">
<collection property="students" javaType="ArrayList" ofType="com.lyc.pojo.Student" select="getStudent" column="id"/>
</resultMap>
<select id="getStudent" resultType="com.lyc.pojo.Student">
select * from mybatis.student where tid = #{tid}
</select>
</mapper>
按照结果嵌套查询
TeacherMapper.xml
<select id="selectTeacher" resultMap="teacher-student">
select s.id sid,s.name sname,t.id tid,t.name tname
from mybatis.teacher t
join mybatis.student s on
t.id = s.tid and t.id = #{tid};
</select>
<resultMap id="teacher-student" type="com.lyc.pojo.Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!-- 复杂的属性,我们需要单独处理
对象:association
集合:collection
javaType:
指定属性的类型,集合中的泛型信息,我们使用ofType获取-->
<collection property="students" ofType="com.lyc.pojo.Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
小结
-
关联 association
-
集合:collection
-
javaType & ofype
-
javaType用来指定实体类中属性的类型
-
ofType 用来指定映射到List或者集合中的实体类,反省中的约束类型
-
注:
-
保证SQL的可读性,精良保证通俗易懂
-
注意一对多和多对一中 属性名和字段名的问题如果问题不好排查,可以使用日志,建议使用log4j
希望对大家有所帮助!