MyBatis学习笔记6-深入学习MyBatis配置及关联映射          返回主页

配置mapper的其他方式

  1. 除了使用resource的方式加载文件夹中的Mapper映射文件还可以将于Mapper接口同名的配置文件放置在Mapper接口同路径下,配置Mappers项为

    <mappers>
            <mapper class="com.mybatis.mapper.UserMapper"/>
    </mappers>
    
  2. 同样支持批量配置,通过package自动扫描包下的接口 要求:

    1. 接口与映射文件同目录下

  3. 返回简单类型

    如果查询的记录结果集一条记录且一列,使用返回简单类型。
    
  4. resultType

       sql查询的列名,要和resultType制定的pojo的属性名相同;
       相同的属性方可映射成功
       如果属性名和sql查询的别名全部不同,list中无法创建pojo对象
    
  5. resultMap

        将sql查询结果映射为java对象。
        如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)
    
  6. 动态sql

        <sql id="query_user_where">
            <!-- 如果 userQueryVo中传入查询条件,再进行sql拼接-->
            <!-- test中userCustom.username表示从userQueryVo读取属性值-->
            <if test="userCustom!=null">
                <if test="userCustom.username!=null and userCustom.username!=''">
                    and username like '%${userCustom.username}%'
                </if>
                <if test="userCustom.sex!=null and userCustom.sex!=''">
                    and sex = #{userCustom.sex}
                </if>
                <!-- 根据id集合查询用户信息 -->
                <!-- 最终拼接的效果:
                SELECT id ,username ,birthday  FROM USER WHERE username LIKE '%小明%' AND id IN (16,22,25)
                collection:集合的属性
                open:开始循环拼接的串
                close:结束循环拼接的串
                item:每次循环取到的对象
                separator:每两次循环中间拼接的串
                 -->
                 <foreach collection="ids" open=" AND id IN ( " close=")" item="id" separator=",">
                    #{id}
                 </foreach>
                 <!--
                 SELECT id ,username ,birthday  FROM USER WHERE username LIKE '%小明%' AND (id = 16 OR id = 22 OR id = 25)
                  <foreach collection="ids" open=" AND ( " close=")" item="id" separator="OR">
                    id = #{id}
                 </foreach>
                  -->
                <!-- 还有很的查询条件 -->
            </if>
    </sql>
    

mybatis关联映射

一对一

  1. 需求:查询订单信息关联查询用户信息
  2. sql语句

        查询语句:
        先确定主查询表:订单信息表
        再确定关联查询表:用户信息
        通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接
        SELECT
          orders.,
          user.username,
          user.sex
        FROM
          orders,
          USER
        WHERE orders.user_id = user.id;
    
  3. 使用resultType实现

        创建po类
        基础的单表的 po类:
        一对一查询映射的pojo
        创建pojo包括 订单信息和用户信息,resultType才可以完成映射。
        创建OrderCustom作为自定义pojo,继承sql查询列多的po类。
    
  4. mapper.xml 定义mapper.xml文件,

  5. 使用resultMap实现一对一 resultMap映射思路 resultMap提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将关联查询的信息映射到pojo中,如下: 在Orders类中创建一个User属性,将关联查询的信息映射到User属性中。

小结

        resultType:要自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。
        resultMap:使用association完成一对一映射需要配置一个resultMap,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。

一对多

  1. 需求 查询所有订单信息及订单下的订单明细信息。
  2. sql语句 主查询表:订单表 关联查询表:订单明细 SELECT orders., user.username, user.sex , orderdetail.id orderdetailid, orderdetail.itemsnum, orderdetail.items_id FROM orders, USER, orderdetail WHERE orders.userid = user.id AND orders.id = orderdetail.ordersid
  3. resultMap进行一对多映射思路 resultMap 提供collection完成关联信息映射到集合对象中。 在orders类中创建集合属性
  4. 一对多查询(复杂) 需求 查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息
  5. sql 主查询表:用户信息 关联查询:订单、订单明细,商品信息

    SELECT
      orders.,
      user.username,
      user.sex ,
      orderdetail.id orderdetail_id,
      orderdetail.items_num,
      orderdetail.items_id,
      items.name items_name,
      items.detail items_detail
    FROM
      orders,
      USER,
      orderdetail,
      items
    WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id
    

延迟加载

  1. 使用延迟加载意义

    在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。
    
    如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。
    
    mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。
    
    
            <!-- 全局配置参数 -->
                <settings>
                    <!-- 延迟加载总开关 -->
                    <setting name="lazyLoadingEnabled" value="true" />
                    <!-- 设置按需加载 -->
                    <setting name="aggressiveLazyLoading" value="false" />
                </settings>
                9resultType、resultMap、延迟加载使用场景总结
    
                延迟加载:
                延迟加载实现的方法多种多样,在只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。
    
                mybatis提供延迟加载的功能用于service层。
    
  2. resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中。 场合: 常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

  3. resultMap: 使用association和collection完成一对一和一对多高级映射。

                association:
                作用:
                    将关联查询信息映射到一个pojo类中。
                场合:
                    为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。
    
  4. collection: 作用: 将关联查询信息映射到一个list集合中。 场合: 为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。