天气甚好,怎能不学习?

 

一、单向和双向

    包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种关系来讲,比如有员工和部门,一个部门中有多个员工,从部门方看,是一对多关系,而多名员工属于一个部门,是多对一关系,那么如果我们的业务需求只需要通过部门查找到所有的员工,那么我们就只需要进行单向一对多的映射,如果我们需要通过员工来查询出对应的部门,那么我们就需要进行单向多对一的映射,而如果我们这两个业务需求都需要实现,也就是不管从哪一方进行查找,都需要能够找到对方,那么此时就应该编写双向一对多或者双向多对一(双向一对多和双向多对一是一样的意思)。所以,不管是编写哪一种,都是根据业务需求来进行决策的。这就是单向和双向的意思。

    什么是多对多? 

       多对多就是不管从哪一方看,都是一对多,那么该关系就是多对多。比如学生跟选修课之间,从学生方看,一个学生能选多门选修课,一对多关系,从选修课之间,一门选修课可以被多个学生选择,也是一对多关系,那么学生跟选修课就是多对多关系。多对多关系之间都会由第三张表来表示这种关系。而不会相互设置外键。

二、测试环境

       

       Mybatis(四) 高级映射,一对一,一对多,多对多映射

三、一对一映射

    有了上面这个关系图,那我们测试就好做多了,就拿orders 和user来测试,从orders方看向user方,就是一对一映射。也就是单向一对一,只需要根据orders能找出user即可。

    两种方案,映射文件中输出映射使用resultType和resultMap。这里只关注映射文件,全局配置文件就不多说了,还是老样子的配置

    3.1、使用resultType

        UserMapper.xml  

            Mybatis(四) 高级映射,一对一,一对多,多对多映射

        UserExt.java

          因为需要在查询orders时,将对应的user也查询出来,那么使用resultType的话,就需要创建一个OrdersExt,将user和orders中的属性合并在一起,形成一个新的pojo。这样就能够将查询出来的记录都映射到该pojo上了

            Mybatis(四) 高级映射,一对一,一对多,多对多映射

    3.2、使用resultMap

        usermapper.xml

            Mybatis(四) 高级映射,一对一,一对多,多对多映射

          resultMap

              使用resultMap的话就不需要构造一个新的pojo,只需要将查询出来的记录的值通过resultMap帮我们映射到指定到哪个pojo的哪个属性上即可。

            Mybatis(四) 高级映射,一对一,一对多,多对多映射

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper    
 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    
 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="com.wuhao.onetoone.resultMap.UserMapper">
 6         <!-- 
 7             resultMap
 8             type:返回对象类型。全限定名,如果使用了typeAliases设置别名,则可以使用别名
 9             id:唯一标识,供下面使用
10             id标签:唯一标识位,也就是主键。
11                 column:从数据库中查询出来的列名。有时候会使用别名,主要看sql语句返回的列名是什么
12                 property:对应返回对象中属性名
13             result标签:映射普通属性
14                 column和property跟上面一样的功能
15          -->
16     <resultMap type="com.wuhao.onetoone.resultMap.Orders" >
17         <id column="oid" property="id"/>
18         <result column="number" property="number"/>
19         <result column="user_id" property="userId"/>
20         <result column="createtime" property="createtime"/>
21         <!-- 用户信息,
22             association:一对一映射
23             property:把关联查询的一对一的信息封装到哪个对象属性上
24             javaType:property属性的类型
25             其他的什么id,result标签都跟上面的一样。
26          -->
27          <association property="user" javaType="com.wuhao.onetoone.resultMap.User">
28              <id column="uid" property="id"/>
29              <result column="username" property="username"/>
30              <result column="sex" property="sex"/>
31          </association>
32     </resultMap>
33 
34     <!-- 
35         使用resultMap就能够解决这种麻烦,因为resultMap能进行高级映射,说是高级映射,其实就是可以将查询出来的列表映射到特定
36         的属性上去。    
37         使用resultMap之后,就会知道resultType的区别在哪里了
38             resultType:简单一些,是一种平铺式的映射,不用层级式映射用这个比较好。需要什么查什么
39             resultMap:比较繁琐,是一种层级式的映射,在企业中如果没有特殊要求,建议使用resultType来完成一对一映射,
40      -->
41     <select >
42         SELECT
43             orders.id oid,
44             orders.number,
45             orders.user_id,
46             orders.createtime,
47             user.id uid,
48             user.username,
49             user.sex
50          FROM orders,user WHERE orders.id = #{id} AND orders.user_id = user.id    
51     </select>
52     
53     
54 </mapper>
View Code

相关文章:

  • 2021-07-17
  • 2021-08-02
  • 2021-11-28
  • 2017-12-14
  • 2021-11-27
  • 2022-02-24
  • 2022-01-20
  • 2021-07-05
猜你喜欢
  • 2022-01-27
  • 2022-12-23
  • 2018-01-09
  • 2022-12-23
  • 2022-01-17
相关资源
相似解决方案