Lombok、多对一处理、一对多处理

9、Lombok

使用步骤:

  1. 在IDEA中安装Lombok插件!(File->setting->Piugings)(我的IDEA没找到这个插件)

  2. 在项目中导入lombok的jar包

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.22</version>
    </dependency>
  3. 在实体类中加注解即可

10、多对一处理

  • 多个学生,对应一个老师

  • 对于学生这边而言,关联...多个学生,关联一个老师【多对一】

  • 对于老师而言,集合, 一个老师,有很多学生【一对多】

 

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'); `student`
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');

 

测试环境搭建
  1. 导入lombok

  2. 新建实体类Teacher,Student

  3. 建立Mapper接口

  4. 建立Mapper.xml文件

  5. 在核心配置文件中绑定注册我们的Mapper接口或者文件!【方式很多,随心选】

  6. 测试查询是否能够成功!

 

按照查询嵌套处理
    <select id="getStudent" resultMap="StudentTeacher">
--         select s.id,s.name,t.name from student s,teacher t where s.tid=t.id
  select * from student
   </select>
   <resultMap id="StudentTeacher" type="com.kuang.pojo.Student">
       <result property="id" column="id"></result>
       <result property="name" column="name"></result>
<!--       复杂的属性,我们需要单独处理
           对象:association
           集合:collection
-->
       <association property="teacher" column="tid" javaType="com.kuang.pojo.Teacher" select="getTeacher"></association>
   </resultMap>
   
   <select id="getTeacher" parameterType="int" resultType="com.kuang.pojo.Teacher">
      select * from teacher where id=#{id}
   </select>

 

按照结果嵌套处理
<!--    按照结果嵌套处理-->
   <select id="getStudent2" resultMap="StudentTeacher2">
  select s.id sid,s.name sname,t.name tname
  from student s,teacher t
  where s.tid=t.id
   </select>
   <resultMap id="StudentTeacher2" type="com.kuang.pojo.Student">
       <result property="id" column="sid"></result>
       <result property="name" column="sname"></result>
       <association property="teacher" javaType="com.kuang.pojo.Teacher" >
           <result property="name" column="tname"></result>
           <result property="id" column="tid"></result>
       </association>
   </resultMap>

 

回顾Mysql多对一查询方式:

  • 子查询

  • 联表查询

11、1对多处理

比如:一个老师拥有多个学生!

对于老师而言,就是一对多的关系

 

环境搭建,和刚才一样

实体类

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;

 

按照结果嵌套处理
<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 = #{tid}
   </select>

   <resultMap id="TeacherStudent" type="com.kuang.pojo.Teacher">
       <result property="id" column="tid"/>
       <result property="name" column="tname"/>
       <!--       复杂的属性,我们需要单独处理 对象:association 集合:collection
                   javaType=""   指定属性的类型!
                   集合中的泛型信息,我们使用ofType获取
         -->
       <collection property="students"  ofType="com.kuang.pojo.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="com.kuang.pojo.Teacher">
       <result property="id" column="id"></result>
<!--   column="id" 指的是上面老师传进来的id     -->
   <collection property="students"  javaType="ArrayList" select="getStudentByTeacherId" ofType="com.kuang.pojo.Student" column="id"></collection>
   </resultMap>
   <select id="getStudentByTeacherId" resultType="com.kuang.pojo.Student">
      select * from mybatis.student where tid=#{tid}
   </select>

 

小结
  1. 关联 - association 【多对一】

  2. 集合 - collection 【一对多】

  3. javaType & ofType

    1. JavaType 用来指定实体类中属性的类型

    2. ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!

association和collection中的peopertiy是写实体类中所定义的那个对象例如:

    private List<Student> students;  //老师中就是students
   
   //学生需要关联一个老师!
   private Teacher teacher; // 学生中就是写teacher

 

注意点:

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

  • 注意一对多和多对一中,属性名和字段的问题!

  • 如果问题不好排查错误,可以使用日志,建议使用Log4j

面试高频

  • Mysql引擎

  • InnoDB底层原理

  • 索引

  • 索引优化!

posted @ 2021-10-24 17:10  敲代码的体育生  阅读(227)  评论(0)    收藏  举报