栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

快速入门mybatis关联映射(详解)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速入门mybatis关联映射(详解)

目录

零、建表

1、学生表

2、老师表

一、多对一的关联映射

1、实体类、接口、mapper

2、连表查询 注意看下column不同情况下作用

3、分步查询

二、一对多的关联映射

1、实体类、接口、mapper

2、连表查询

3、分步查询

三、真正的分布查询


零、建表

1、学生表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROp TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `t_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三', '男', 18, 1);
INSERT INTO `student` VALUES (2, '李四', '女', 18, 1);
INSERT INTO `student` VALUES (3, '王五', '男', 18, 1);
INSERT INTO `student` VALUES (4, '小白', '女', 18, 1);
INSERT INTO `student` VALUES (5, '小黑', '男', 18, 1);
INSERT INTO `student` VALUES (6, '小红', '女', 20, 2);
INSERT INTO `student` VALUES (7, '小李', '男', 20, 2);
INSERT INTO `student` VALUES (8, '小张', '女', 20, 2);
INSERT INTO `student` VALUES (9, '小赵', '男', 20, 2);
INSERT INTO `student` VALUES (10, '小王', '女', 20, 2);

SET FOREIGN_KEY_CHECKS = 1;

2、老师表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Tname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '张老师');
INSERT INTO `teacher` VALUES (2, '李老师');

SET FOREIGN_KEY_CHECKS = 1;

一、多对一的关联映射

1、实体类、接口、mapper

Teacher类

package com.qcby.entity;

public class Teacher {
    private Integer id;
    private String  Tname;
    


}

Student类

public class Student {

    private Integer id;
    private String Sname;
    private String sex;
    private Integer age;
    private Integer t_id;
    
    //这个是重点
    private Teacher teacher;
}

注意哈,Student类里有一个Teacher类

接口

public interface StudentDao
{
    public List getStudentAndTeacher1();
    public List getStudentAndTeacher2();

}

Test

package com.qcby;

import com.qcby.dao.StudentDao;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class StudentTest {
    private InputStream in = null;//输入流
    private SqlSession session = null;//数据库会话
    private StudentDao mapper = null;//mapper-->映射

    @Before  //前置通知, 在方法执行之前执行
    public void init() throws IOException {
        //加载主配置文件,目的是为了构建SqlSessionFactory对象
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //通过SqlSessionFactory工厂对象创建SqlSesssion对象
        session = factory.openSession();
        //通过Session创建UserDao接口代理对象
        mapper = session.getMapper(StudentDao.class);
    }

    @After  //@After: 后置通知, 在方法执行之后执行 。
    public void destory() throws IOException {
        //释放资源
        session.close();
        in.close();
    }


   @Test
    public void getStudentAndTeacher1(){
        mapper.getStudentAndTeacher1();

    }

    @Test
    public void getStudentAndTeacher2(){
        mapper.getStudentAndTeacher2();
}

2、连表查询 注意看下column不同情况下作用

首先认识一下子标签:

resultMap与resultType只能存在一个,而resultmap是映射

在select写完后,下面写resultmap的标签 id要与select中的一致。

type映射类型

result返回标签,
property实体类的对象
columnn查询数据库所返回的标签

当在association里的时候是向下传参的意思

association用于处理特殊类型如实体类,集合的标签
collection处理集合
javaType  java类后面是包名

上代码:

    
       select * from student
   
    
        
        
        
        
        
        
        
    
    
    SELECT  teacher.id,teacher.Tname,student.Sname FROM teacher
        LEFT JOIN student  on student.t_id = teacher.id
 

    
    
    
    
        
    

因为是集合类型,所以不用association而是用collection 类型是ofType类型

注意这点即可。

3、分步查询


    select * from student where t_id = #{t_id}

上面懂了 这个也就懂了。

三、真正的分布查询

不知道你有没有注意到分布查询查询teahcer的语句放入student类里,查询student同理。

这样其实还不算分布查询

我们应该讲查询老师的语句放在老师的mapper里。

现在我们来修改下多对一的

studentDao.xml


    select  * from  teacher where id = #{t_id};

TeacherDao

Teacher getTeacher(Integer id);

可能出现的错误:

主配置文件没有对应mapper

调用select方法名与select的id不一致

自己完成真正的一对多的分布查询知之后,可以接着这个学习延迟加载

 MyBatis延迟加载策略(看了就会)_何妨徐行的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/888319.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号