Mybatis关联映射举例详解

目录
  • 一、关联映射
  • 二、一对一多对一的关系
    • 1.第一种形式-连表查询
    • 2.第二种形式-分步查询
  • 三、一对多
    • 第一种形式按照结果嵌套处理
    • 第二种形式按照查询嵌套处理

一、关联映射

举例关系说明

数据库创建表,student,teacher

关系说明:

  1. 一个老师可以有多个学生
  2. 一个学生只有一个老师
  3. 一个老师对学生:一对多的关系
  4. 一个学生老师:一对一的关系

二、一对一多对一的关系

查询学生信息及其对应的教师信息

学生实体:用对象来存储教师信息,因为一个学生对应一个教师对象

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

教师实体:

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

1.第一种形式-连表查询

数据库查询sql:

SELECT  student.id,student.name,teacher.name FROM student LEFT JOIN teacher  on student.t_id = teacher.id

mybatis多表联查查询语句:(嵌套其他实体对象)

对于特殊数据:

  • 如果是对象:用association :< association property=“teacher” javaType=“com.qcby.entity.Teacher”>,特殊数据特殊处理
  • < result property=“id” column=“id”/> :所要查询的字段,property代表java中实体的属性名称,column:表示数据库的字段
   <!--    按照结果嵌套处理-->
<select id="getStudent1" resultMap="StudentTeacher1">
   SELECT  student.id,student.Sname,teacher.Tname FROM student  LEFT JOIN teacher  on student.t_id = teacher.id
</select>
   <resultMap id="StudentTeacher1" type="com.qcby.entity.Student">
       <result property="id" column="id"/>
       <result property="Sname" column="Sname"/>
       <result property="sex" column="sex"/>
       <result property="age" column="age"/>
       <result property="t_id" column="t_id"/>
     <!-- 复杂的属性我们需要单独去处理 对象:association   集合:collection   -->
   	 <!-- property="teacher" student类当中的关联字段 -->
   	 <!-- javaType="com.javen.model.Teacher" 为复杂属性设置类类型-->
       <association property="teacher" javaType="com.qcby.entity.Teacher">
           <result property="id" column="id"/>
           <result property="Tname" column="Tname"/>
       </association>
   </resultMap>

2.第二种形式-分步查询

数据库查询sql:

SELECT s.id,s.Sname,t.Tname FROM student s,teacher t where s.t_id = t.id

mybatis分布查询查询语句:

<select id = "getStudent"  resultMap="StudentTeacher">
    select * from student;
</select>
<!--结果映射集-->
<resultMap id="StudentTeacher"  type="com.qcby.entity.Student">
    <result property="id" column="id"/>
    <result property="Sname" column="Sname"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="t_id" column="t_id"/>
    <!-- select="getTeacher"  :调用下一个查询语句       -->
    <!-- column="t_id" 两个表的关联字段-->
    <association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="com.qcby.entity.Teacher">
    select  * from  teacher where id = #{t_id};    <!-- #{id}; 可以写任何东西,因为会自动匹配 t_id -->
</select>

三、一对多

查询教师对应的学生信息

设立教师实体:用集合来存储对应的学生信息,因为一个教师对应多个学生

public class Teacher {
    private Integer id;
    private String Tname;
    //这个一定要有
    private List<Student> students;
}

第一种形式按照结果嵌套处理

mybatis查询语句:

<!--按照结果进行查询-->
<select id="getTeacher" resultMap="TeacherStudent">
    SELECT  teacher.id,teacher.Tname,student.Sname FROM teacher
        LEFT JOIN student  on student.t_id = teacher.id
 </select>
<resultMap id="TeacherStudent" type="com.qcby.entity.Teacher">
    <result property="id" column="id"/>
    <result property="Tname" column="Tname"/>
    <!-- 复杂的属性我么需要单独去处理 对象:association   集合:collection
      在集合中的泛型信息,我们使用ofType获取
      -->
    <collection property="students" ofType="com.qcby.entity.Student">
    	<!-- 查询什么写什么 -->
        <result property="Sname" column="Sname"/>
    </collection>
</resultMap>

第二种形式按照查询嵌套处理

mybatis查询语句: 对于特殊字段集合采用分布查询的方式,特殊字段特殊处理:< collection property=“students” column=“t_id”

ofType=“com.qcby.entity.Student” select=“getStudentByTeacherId” />,getStudentByTeacherId一个新的查询语句

<!--按照查询嵌套处理:分布查询-->
<select id="getTeacher" resultMap="TeacherStudent2">
    select * from teacher
</select>
<resultMap id="TeacherStudent2" type="com.qcby.entity.Teacher">
    	<!--column="t_id"  传值-->
    <collection property="students" column="t_id"
                ofType="com.qcby.entity.Student" select="getStudentByTeacherId" />  <!--实现分布查询-->
</resultMap>
<select id="getStudentByTeacherId" resultType="com.qcby.entity.Student">
    select * from student where id = #{t_id}
</select

到此这篇关于Mybatis关联映射举例详解的文章就介绍到这了,更多相关Mybatis关联映射内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis多对多关联映射创建示例

    目录 示例 [通过班级查询老师信息] 示例 [通过班级查询老师信息] 创建t_classes 创建t_classessTeacher 创建t_teacher 创建Classes package com.po; import java.util.List; public class Classes { private Integer cid; private String cname; private List<Teacher> teachers; public Integer getCid()

  • Mybatis一对多关联关系映射实现过程解析

    这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List<另一方> 属性名 作为少的一方的属性. 用户和订单就是一对多的关系,从用户角度看就是一对多关系,从订单的角度来看就是多对一的关系. /** * 订单持久化类 */ public class Orders { p

  • 深入浅出MyBatis中映射文件和实体类的关联性

    mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~: 以User对象和UserMap.xml为例讲解,代码如下: User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略): import com.google.common.collect.Lists; import com.gukeer.common.persisten

  • mybatis实现一对一关联映射实例代码

    前言 在客观世界中,对象很少是孤独存在的,如班级与学生之间的关系,学生与课程之间的关系,它们的实例之间可以互相访问,这就是关联关系.MyBatis 的关联映射可以大大简化持久层数据的访问,关联关系的分类如下: 一对一 一对多 多对多 我们首先绘制一个简化的 E-R 图来表示三种关联关系. 上图表示的三种关系: 一对一:一个班主任只属于一个班级,一个班级也只能有一个班主任 一对多:一个班级有多个学生,一个学生只属于一个班级 多对多:一个学生可以选多门课,一门课可以有多个学生选 引言 而在实际项目开

  • Mybatis实现关联关系映射的方法示例

    目录 数据库表结构 一.实现Project关联Company一对一关联 二.实现Company关联Project一对多关系 三.Mybatis子查询方式实现关联关系查询 类和类有关联,将查询的结果注入到对象和对象的关联关系中 Mybatis处理的关联关系 包括一对一关联 和 一对多关联 ,例如学生关联班级是一对一 :班级关联学生是一对多. Mybatis实现关联关系映射,有两种方式:多表连接 和 子查询 数据库表结构 tb_project tb_cmpany 一.实现Project关联Compa

  • Mybatis关联映射举例详解

    目录 一.关联映射 二.一对一多对一的关系 1.第一种形式-连表查询 2.第二种形式-分步查询 三.一对多 第一种形式按照结果嵌套处理 第二种形式按照查询嵌套处理 一.关联映射 举例关系说明 数据库创建表,student,teacher 关系说明: 一个老师可以有多个学生 一个学生只有一个老师 一个老师对学生:一对多的关系 一个学生老师:一对一的关系 二.一对一多对一的关系 查询学生信息及其对应的教师信息 学生实体:用对象来存储教师信息,因为一个学生对应一个教师对象 public class S

  • MyBatis输入映射和输出映射实例详解

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 我们知道,mapper.xml是我们配置操作数据库的sql语句的地方.其中每个sql语句对应着一个方法,每个方法都有自己的

  • Mybatis模糊查询及自动映射实现详解

    这篇文章主要介绍了Mybatis模糊查询及自动映射实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis的模糊查询 1. 参数中直接加入%% 1 2 3 4 5 6 7 8 9 param.setUsername("%CD%"); param.setPassword("%11%"); <select id="selectPersons" resultType="p

  • MyBatis中的JdbcType映射使用详解

    Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate.Mybatis等这些持久化支持. 项目中用到了MyBatis,和JDBC最显著的区别,就是SQL语句配置化,通过xml文件定义SQL语句,当然JDBC也可以将SQL配置化,需要定制开发,MyBatis则直接支持这种方法. 官方对于MyBatis的介绍, MyBatis is a first class persistence framework with support for custom SQL, stored

  • Mybatis中 XML配置详解

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <

  • mybatis分页插件pageHelper详解及简单实例

    mybatis分页插件pageHelper详解及简单实例 工作的框架spring springmvc mybatis3 首先使用分页插件必须先引入maven依赖,在pom.xml中添加如下 <!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.7.5

  • springmvc与mybatis集成配置实例详解

    简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.ve

  • mybatis的动态sql详解(精)

    MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用 JSTL或其他相似的基于XML的文本处理器相似.在MyBatis之前的版本中,有很多

  • MyBatis查询缓存实例详解

    查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存 一.一级查询缓存 MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession.在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将

  • Hibernate组件映射代码详解

    本文研究的主要是Hibernate组件映射的相关内容,具体如下. 组件关联映射的属性是复杂类型的持久化类,但不是实体类,即数据库中没有表与该属性对应,但该类的属性要持久保存. 比如:外国人的名字name分为firstName和lastName. MyName.java: public class MyName { private String firstName; private String lastName; public String getFirstName() { return fir

随机推荐