Mybatis-08一对多,多对一处理

    技术2024-11-11  23

    多对一处理

    多对一的处理 多对一的理解:

    多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!【多对一】 对于老师来说,集合,一个老师有很多学生【一对多】

    数据库的设计 sql

    CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); CREATE TABLE `student` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `tid` INT(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fktid` (`tid`), CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

    测试韩静搭建

    导入lombok <dependencies> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> </dependencies> 新建实体类 Teachr Student。 package com.Pojo; import lombok.Data; @Data public class Student { private int id; private String name; //多个学生同一个老师 private Teacher teacher; } package com.Pojo; import lombok.Data; @Data public class Teacher { private int id; private String name; } 建立Mapper接口 package com.Dao; public interface StudentMapper { } package com.Dao; import com.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); } 建立Mapper.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"/> <!-- <setting name="logImpl" value="LOG4J"/>--> </settings> <!--可以给实体类起别名--> <typeAliases> <typeAlias type="com.Pojo.Teacher" alias="teacher"></typeAlias> <typeAlias type="com.Pojo.Student" alias="student"></typeAlias> </typeAliases> <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="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper class="com.Dao.TeacherMapper"/> <mapper class="com.Dao.StudentMapper"/> </mappers> </configuration> 测试查询是否成功 import com.Pojo.Teacher; import com.Utils.Utils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class Mytest { public static void main(String[] args) { SqlSession sqlSession = Utils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); Teacher teacher = mapper.getTeacher(1); System.out.println(teacher); sqlSession.close(); } }

    按照查询嵌套处理

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.Dao.StudentMapper"> <!-- 思路: 1.查询所有的学生信息 2.根据查询出来的学生的tid,寻找出对应的老师!! 子查询--> <select id="getStudent" resultMap="StudentTeacher"> select *from mybatis.student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂的属性,我们需要单独的处理,对象:association 集合:collection--> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> <!-- <collection property=""/>--> </resultMap> <select id="getTeacher" resultType="Teacher"> select *from mybatis.teacher where id=#{id} </select>

    按照结果嵌套处理

    <mapper namespace="com.Dao.StudentMapper"> <select id="getStudent2" resultMap="StudentTeacher2"> select s.id sid ,s.name sname,t.name tname from mybatis.student s , mybatis.teacher t where s.tid=t.id; </select> <resultMap id="StudentTeacher2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap>

    回顾mysql多对一查询方式

    1.子查询 2.联表查询

    一对多处理

    比如一个老师拥有多个学生 对于老师而言,就是一对多的关系 1.搭建环境 Javabean

    package com.Pojo; import lombok.Data; @Data public class Student { private int id; private String name; //多个学生同一个老师 private int tid; } package com.Pojo; import lombok.Data; import java.util.List; @Data public class Teacher { private int id; private String name; //一个老师拥有多个学生 List<Student> students; }

    接口:

    package com.Dao; import com.Pojo.Teacher; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; public interface TeacherMapper { //获取老师 //List<Teacher> getTeacher(); //获取指定老师下的所有学生及老师的信息 public Teacher getTeacher(int id); //Teacher getTeacher2(@Param("tid") int id); }

    按照结果嵌套处理

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.Dao.TeacherMapper"> <!-- 思路: 1. 从学生表和老师表中查出学生id,学生姓名,老师姓名 2. 对查询出来的操作做结果集映射 1. 集合的话,使用collection! JavaType和ofType都是用来指定对象类型的 JavaType是用来指定pojo中属性的类型 ofType指定的是映射到list集合属性中pojo的类型。 --> <select id="getTeacher" resultMap="TeacherStudent"> select s.id sid, s.name sname , t.name tname, t.id tid from student s,teacher t where s.tid = t.id and t.id=#{id} </select> <resultMap id="TeacherStudent" type="Teacher"> <result property="name" column="tname"/> <collection property="students" ofType="Student"> <result property="id" column="sid" /> <result property="name" column="sname" /> <result property="tid" column="tid" /> </collection> </resultMap>

    按照查询嵌套处理

    <select id="getTeacher2" resultMap="TeacherStudent2"> select *from mybatis.teacher where id=#{tid} </select> <resultMap id="TeacherStudent2" type="Teacher"> <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/> </resultMap> <select id="getStudentByTeacherId" resultType="Student"> select *from mybatis.student where tid=#{tid} </select> </mapper> 小结

    1、关联-association

    2、集合-collection

    3、所以association是用于一对一和多对一,而collection是用于一对多的关系

    4、JavaType和ofType都是用来指定对象类型的

    JavaType是用来指定pojo中属性的类型 ofType指定的是映射到list集合属性中pojo的类型。

    注意说明:

    1、保证SQL的可读性,尽量通俗易懂

    2、根据实际要求,尽量编写性能更高的SQL语句

    3、注意属性名和字段不一致的问题

    4、注意一对多和多对一 中:字段和属性对应的问题

    5、尽量使用Log4j,通过日志来查看自己的错误

    一对多和多对一对于很多人来说是难点,一定要大量的做练习理解!

    Processed: 0.014, SQL: 9