网站建设联系方式高级搜索百度
多对一处理(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 configurationPUBLIC "-//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 teacherNamefrom mybatis.student,mybatis.teacherwhere 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 tnamefrom mybatis.teacher tjoin mybatis.student s ont.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集合:collectionjavaType:指定属性的类型,集合中的泛型信息,我们使用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
希望对大家有所帮助!