Mybatis之collection与association标签

摘要:
collection与association标签的功能就是为了解决查询条件映射到一个类或一个集合上,适用于对于多对一,一对多的映射结果,现在我们就探究其具体使用吧。--association关联属性property属性名javaType属性类型column在多的一方的表中的列名--˃select*fromteacherwhereid=#{id}方式二:按结果嵌套查询selects.idsid,s.namesname,t.nametnamefromstudents,teachertwheres.tid=t.id在核心配置文件注册。测试:1@Test2publicvoidtestGetStudents(){3SqlSessionsession=MybatisUtils.getSession();4StudentMappermapper=session.getMapper;56Liststudents=mapper.getStudents();78for{9System.out.println;12}13}testGetStudents一对多的理解:一个老师拥有多个学生如果对于老师这边,就是一个一对多的现象。--column是一对多的外键,写的是一的主键的列名--˃˂collectionproperty="students"javaType="ArrayList"ofType="Student"column="id"select="g

collection与association标签的功能就是为了解决查询条件映射到一个类或一个集合上,适用于对于多对一,一对多的映射结果,现在我们就探究其具体使用吧。


环境搭建:

  • 数据库搭建
CREATE TABLEteacher (
  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 TABLEstudent (
  id INT(10) NOT NULL,
  name VARCHAR(30) DEFAULT NULL,
  tid INT(10) DEFAULT NULL,
  PRIMARY KEY(id),
  KEYfktid (tid),
  CONSTRAINT fktid FOREIGN KEY (tid) REFERENCESteacher (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'); 
  • pojo
//GET,SET,ToString,有参,无参构造
public classTeacher {
    private intid;
    privateString name;
}
//Get,Set,ToString, 有参,无参构造
public classStudent {
    private intid;
    privateString name;
    //多个学生可以是同一个老师,即多对一
    privateTeacher teacher;
}

多对一的理解:

  • 多个学生对应一个老师
  • 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!

接口编写方法:

//获取所有学生及对应老师的信息
public List<Student> getStudents();

配置文件:

方式一:按查询嵌套查询

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ttt.mapper.StudentMapper">

    <select id="getStudents"resultMap="StudentTeacher">select * from student
    </select>
    <resultMap id="StudentTeacher"type="Student">
        <!--association关联属性  property属性名 javaType属性类型 column在多的一方的表中的列名-->
        <association property="teacher"column="tid"javaType="Teacher"select="getTeacher"/>
    </resultMap>
    <!--这里传递过来的id,只有一个属性的时候,下面可以写任何值
    association中column多参数配置:
        column="{key=value,key=value}"
        其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。
    -->
    <select id="getTeacher"resultType="teacher">select * from teacher where id = #{id}
    </select>

</mapper>

方式二:按结果嵌套查询

<select id="getStudents2"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="Student">
    <id property="id"column="sid"/>
    <result property="name"column="sname"/>
    <!--关联对象property 关联对象在Student实体类中的属性-->
    <association property="teacher"javaType="Teacher">
        <result property="name"column="tname"/>
    </association>
</resultMap>

在核心配置文件注册。

测试:

Mybatis之collection与association标签第1张Mybatis之collection与association标签第2张
1 @Test
2 public voidtestGetStudents(){
3     SqlSession session =MybatisUtils.getSession();
4     StudentMapper mapper = session.getMapper(StudentMapper.class);
5 
6     List<Student> students =mapper.getStudents();
7 
8     for(Student student : students){
9 System.out.println(
10                 "学生名:"+student.getName()
11                         +"	老师:"+student.getTeacher().getName());
12 }
13 }
testGetStudents

一对多的理解:

  • 一个老师拥有多个学生
  • 如果对于老师这边,就是一个一对多的现象。

接口编写方法:

//获取指定老师,及老师下的所有学生
public Teacher getTeacher(int id);

mapper配置文件:

方式一:按查询嵌套查询

<select id="getTeacher2"resultMap="TeacherStudent2">select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2"type="Teacher">
    <!--column是一对多的外键 , 写的是一的主键的列名-->
    <collection property="students"javaType="ArrayList"ofType="Student"column="id"select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId"resultType="Student">select * from student where tid = #{id}
</select>

方式二:按结果嵌套查询

<mapper namespace="com.ttt.mapper.TeacherMapper">
    <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>
</mapper>

在核心配置文件注册。

测试:

Mybatis之collection与association标签第1张Mybatis之collection与association标签第4张
1 @Test
2 public voidtestGetTeacher2(){
3     SqlSession session =MybatisUtils.getSession();
4     TeacherMapper mapper = session.getMapper(TeacherMapper.class);
5     Teacher teacher = mapper.getTeacher2(1);
6 System.out.println(teacher.getName());
7 System.out.println(teacher.getStudents());
8 }
testGetTeacher

小结:

1、关联-association 集合-collection

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

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

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

免责声明:文章转载自《Mybatis之collection与association标签》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇进程基础知识 操作系统 操作系统的发展史(多道技术) 进程介绍 python并发编程之:多进程Delphi初始化与结束化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

013.PGSQL-查看sql正在运行的进程、查看表是否被锁、解锁表

1.PGSQL-查看sql正在运行的进程 SELECT datname,pid,state,query FROM pg_stat_activity where state='active' SELECTprocpid, START, now() - START ASlap, current_query FROM( S...

Eclipse利用Maven快速上手搭建MyBatis

一、what is maven? Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多...

SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

五、锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。 SQL Server 数据库引擎支持所有这些隔离级别: · 未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据) · 已提交读(数据库引擎的默认级...

mysql批量更新数据(性能优化) 第一种方式

   首先想到的是,一条一条更新的速度太慢了,然后就想批量更新,一次更新N条数据。实践是检验真理的唯一标准,不一会儿,代码就敲完了,重新试了一下,效果依旧不理想。啊哦,真是要崩溃!后面又想到了利用异步,我一下子开多个mysql连接,同时处理,可是依旧慢的一笔。然后就放弃了,更新的效率肯定是满足不了了。然后就想着绕弯子了,我新建一张表,把旧表数据取出来,处理...

el-autocomplete select事件传递多个参数

转自:https://yuyuye958.github.io/2019/03/10/el-autocomplete/ 问题 <el-autocomplete v-model="state" :fetch-suggestions="querySearchAsync" placeholder="请输入内容" @select="handle...

使用SQL Server语句统计某年龄段人数占总人数的比例(多层查询语句嵌套-比例分析)

需求:需统计出某个集合内,某个段所占的比例,涉及SELECT查询语句的嵌套,如有疑问可留言。 如下: --按性别进行年度挂号年龄段分析--男SELECT 年龄段,SUM(人数) 数量,cast(cast((SUM(人数)/((select count(*) from YXHIS2020..VTBMZGHMX2020 WHERE BTH=0 AND CXB=...