微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关联查询

 5、MyBatis的关联查询

在关系型数据库中,我们经常要处理一对多,多对一和多对多的关系。

 

 

   (1)案例3:关联映射一对多

           以国家和省份对应的一对多关系举例。

 

       Student表

       

 

       Teacher表

       

 

       创建Student.java类如下:

     

       

 

 

 

   创建Teacher类如下:

 

 

 

 

 

   创建StuT.java接口如下:

 

  

 

   

   创建IStudentDao.xml文件如下

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

在IStudentDao.xml文件中导入CountryMapper.xml文件

 

 

编写app测试程序:

package com.wdkseft.test;

import com.wdkseft.dao.Address_Sum;
import com.wdkseft.dao.ISmbmsRoleDao;
import com.wdkseft.dao.IStudentDao;
import com.wdkseft.entity.*;
import com.wdkseft.util.sqlSessionUtils;
import org.apache.ibatis.session.sqlSession;
import org.junit.Test;

import java.util.List;

public class Tester {
    sqlSession session = sqlSessionUtils.getSession();
    @Test
    public void getAllPro(){

        Address_Sum mapper = session.getMapper(Address_Sum.class);
        List<ceishi> allPro = mapper.getAllPro("1", "2");
        for (ceishi cs:allPro) {
            System.out.println(cs.getName());
        }
    }

    @Test
    public void getProInData(){
        Address_Sum mapper = session.getMapper(Address_Sum.class);
        List<ceishi> proInData = mapper.getProInData(new String[]{"4", "6"});
        for (ceishi cs:proInData) {
            System.out.println(cs.getName());
        }
    }

    @Test
    public void AddallPro(){
        Address_Sum mapper = session.getMapper(Address_Sum.class);
        //添加
        ceishi cs = new ceishi();
        cs.setName("8");
        cs.setPhone("1475");
        cs.setEmail("114@ii.com");
        mapper.addAddressById(cs);
        session.commit();
    }

    @Test
    public void getRoleAndUser(){
        ISmbmsRoleDao mapper = session.getMapper(ISmbmsRoleDao.class);
        SmbmsRole role = mapper.getRoleAndUser(3);

        System.out.println("角色:"+role.getRoleName());
        for (SmbmsUser user:role.getUserList()) {
            System.out.print("\t用户:"+user.getUserName());
        }
    }

    @Test
    public void getUserList(){
        ISmbmsRoleDao mapper = session.getMapper(ISmbmsRoleDao.class);
        List<SmbmsUser> userList = mapper.getUserList();
        for (SmbmsUser user:userList) {
            System.out.println("用户:"+user.getUserName()+"\t角色:"+user.getRole().getRoleName());
        }
    }

    @Test
    public void getStudentInfo(){
        IStudentDao mapper = session.getMapper(IStudentDao.class);
        List<Student> studentInfo = mapper.getStudentInfo();
        for (Student stu:studentInfo){
            System.out.println("学员:"+stu.getStuname());
            for (Teacher teacher:stu.getTeachers()){
                System.out.print("\t教员:"+teacher.getTname());
            }
            System.out.println();
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   (2)案例4:自连接的一对多

        所谓自连接:就是表与自己本身发生关联关系,举个栗子。在U2的结业项目易买网中,分类表(Category)就是自关联的一张表。即一个分类下存在多个子分类

       

 

 

       创建Category类如下

       

 

 

     

 

 

 

 

   

   创建CategoryMapper.java如下

   

 

 

  

   

 

 

 

   创建CategoryMapper.xml文件如下:

   

 

 

 

 

 

 

 

 

 

 

 

       创建好对应的Mapper文件后,需要在configuration.xml文件中导入,但多次导入有些麻烦,我们可以使用包扫描(扫描对应包下的mapper.xml文件),之后就无需每次添加一个mapper.xml文件都要导入了(提升了效率)

      

 

      编写测试代码

 

 

 

 

 

 

 

 

 

 

 

 

   (3)案例5:关联映射多对一

      多对一的例子,我们沿用案例3中对应一对多的关系。

 

      数据表不变。

 

修改实体类如下,让多的一方维护关系。

 

 

 

 

     

     创建ProvincialMapper.java接口

 

 

 

     创建ProvincialMapper.xml文件

 

      

 

 

 

 

 

 

 

 

 

 

      创建测试代码

 

 

 

 

 

 

 

 

 

 

 

 

   (4)案例6:关联映射多对多

 

案例:学生与老师间的关系。一个学生可以被多个老师教,一个老师可以教多个学生。

表结构如下:

学生表:

 

 

教师表:

 

 

中间表:

    

 

 

    创建如下实体类:

学生实体

    

 

 

 

 

 

教师实体

     

 

  

 

 

创建TeacherMapper.java接口  

   

   

  

 

编写TeacherMapper.xml文件

  

 

 

 

 

 

 

 

 

 

 

编写测试类代码:

 

 

    

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。