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

Mybatis(3)一对多,多对一,一对一,多对多

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

Mybatis(3)一对多,多对一,一对一,多对多

一对多

举例分析:一个教室有多个学生。查询教室相关信息时,除了教室的名称,id还有它包含的多个学生信息

建表
CREATE TABLE `class`(
`cid`INT(10)NOT NULL  PRIMARY KEY ,
`cname` VARCHAr(10) NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `student`(
`sid`INT(10)NOT NULL  PRIMARY KEY ,
`sname` VARCHAr(10) NOT NULL ,
`cid` INT(10)NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `class` VALUES(1,"飞机班"),(2,"火箭班"),(3,"火车班")
INSERT INTO `student` VALUES(1,"张三",1),(2,"李四",1),(3,"王五",2)
实体类
//student 类相关信息
public class Student {
    private Integer sid;
    private String sname;
	//···省略get,set,tostring方法
}
public class Class {
    private Integer cid;
    private String cname;
    //studentList方法即一个班级包含的所有学生信息,一对多的体现
    private List studentList;
	//···省略get,set,tostring方法
}
ClassMapper 接口及其xml文件

根据班级id查询相关班级信息

public interface ClassMapper {
    Class getClass(int id);
    Class getClass1(int id);
}

	
    
        select c.*,s.sname,s.sid from class c left join student s on c.cid=s.cid where c.cid=#{cid}
    
    
        
        
        
            
            
        
    
    
	 
        select * from student where cid=#{cid}
    

测试及结果
public class myTest {
    SqlSession sqlSession;
    ClassMapper classMapper;
    @Before
    public void openSqlSession() throws IOException {
        //1.读取核心配置文件
        InputStream in = Resources.getResourceAsStream("mybatisConfig.xml");
        //2.创建工厂对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.取出sqlSession
        sqlSession = factory.openSession(true);//自动提交事务
        //4.取出动态代理的对象,完成接口中方法的调用,实则是调用xml文件中相的标签的功能
        classMapper = sqlSession.getMapper(ClassMapper.class);
    }
    @After
    public void closeSqlSession(){
        sqlSession.close();
    }
    @Test
    public void testOneTOMore(){
        Class aClass = classMapper.getClass(1);
        System.out.println(aClass);
    }
    @Test
    public void testOneTOMore1(){
        Class aClass = classMapper.getClass1(1);
        System.out.println(aClass);
    }
}
<>
==>  Preparing: select c.*,s.sname,s.sid from class c left join student s on c.cid=s.cid where c.cid=?
==> Parameters: 1(Integer)
<==    Columns: cid, cname, sname, sid
<==        Row: 1, 飞机班, 张三, 1
<==        Row: 1, 飞机班, 李四, 2
<==      Total: 2
Class{cid=1, cname='飞机班', studentList=[Student{sid=1, sname='张三'}, Student{sid=2, sname='李四'}]}

==>  Preparing: select * from class where cid=?
==> Parameters: 1(Integer)
<==    Columns: cid, cname
<==        Row: 1, 飞机班
====>  Preparing: select * from student where cid=?
====> Parameters: 1(Integer)
<====    Columns: sid, sname, cid
<====        Row: 1, 张三, 1
<====        Row: 2, 李四, 1
<====      Total: 2
<==      Total: 1
Class{cid=1, cname='飞机班', studentList=[Student{sid=1, sname='张三'}, Student{sid=2, sname='李四'}]}

分析:一对多实现的方式 联合查询
select c.*,s.sname,s.sid from class c left join student s on c.cid=s.cid where c.cid=?

通过对学生表和教室表采用左连接联合查询的方式,只查询一次,通过resultMap中的collection标签,对返回的class关联学生信息。


     
     
 

语句分析:property:实体类classroom中成员变量的名称
ofType:该List方法中存储类型 :student
id:student表的主键,property:student实体类中的名称
column:student表中的名称
result :student非主键列绑定

嵌套查询
select * from class where cid=id   //getclass方法参数为id
select * from student where cid=cid//查询到教室的cid后赋值给学生的cid

先对教室表进行查询使用,使用collection 利用学生表中教室的外键,使用select配置查询教室中包含学生的信息。



语句分析:property:实体类classroom中成员变量的名称
ofType:该List方法中存储类型 :student
column :向select传递的参数,需要的已经查询出来的表中列名。
select:绑定的查询学生表相关信息的语句

多对一

举例分析:多个学生拥有相同的教室,学生是多方,教室是一方

建表与上方相同 实体类
//student 类相关信息
public class Student {
    private Integer sid;
    private String sname;
    
    //多对一的体现
    private Class classroom; 
	//···省略get,set,tostring方法
}
StudentMapper接口及其xml文件
public interface StudentMapper {
    Student getStudent(Integer id);
}

    
        select *from student where sid=#{id}