Mybatis中的ResultMap介绍和一级缓存和二级缓存的介绍

发布时间:2024年01月16日

ResultMap介绍(重点!!!)

ResultMap是在程序开发中经常使用到的一种返回值类型当开发人员不知道如何进行结果集映射时可以
考虑使用 ResultMap
Mybatis官方文档中是这样描述的:
resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接
的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设
计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

具体用法:

注意:

  1. select中的 resultMap 属性值要和 resultMap 标签中的 id 属性值保持一致
  2. column 表示要映射的 表中的字段名
  3. property 表示要映射的 java的属性名
     <!-- 编写查询语句   -->
<select id="findByResultMap" resultMap="resultRM_User">
    select id user_id,name user_name,age user_age,sex user_sex from user
</select>
     <!--手动配置映射规则 -->
<resultMap id="resultRM_User" type="com.atguigu.pojo.User">
<!--1.主键必须映射-->
    <id column="user_id" property="id"></id>
    <!--2.剩余字段-->
    <result column="user_name" property="name"/>
    <result column="user_age" property="age"/>
    <result column="user_sex" property="sex"/>
</resultMap>

驼峰映射规则

在程序开发过程中,经常会出现 java中的属性用到的是 驼峰命名规则 而 数据库中的表用的是 下划线命名规则 为了在执行SQL语句的过程中
将 ? 字段名 ?和 ? 属性名 ? 进行 映射 Mybatis为我们提供了一个属性为 mapUnderscoreToCamelCase 默认值
false 默认是不开启的 将其设置为 true 则表示开启



在mybatis的配置文件中配置

<settings>
    <!--开启驼峰命名规则-->
    <setting mapUnderscoreToCamelCase="true"></setting>
</settings>

Mybatis查询中的注解模式(非重点)

Mybatis 为我们提供了用于进行SQL语句的4个注解分别用于对应增删改查操作

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

@Insert("SQL语句")
public void method insetUser(){
        ...
        }
@Delete("SQL语句")
public void method deleteUser(){
        ...
        }
@Update("SQL语句")
public void method updateUser(){
        ...
        }
@Select("SQL语句")
public void method selectUser(){
        ...
        }

多表查询

  • 一对一
  • 一对多
  • 多对多

一对一封装

标签:

association

属性:

  1. property java的映射属性 (实体类中的属性)
  2. javaType 返回的java类型
  3. autoMapping 自动映射属性。
<?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.atguigu.mapper.DeptUserMapper">


    <select id="findAll" resultMap="findDeptRM">
        SELECT dept_user.*,dept_name from dept_user,dept
        where dept_user.dept_id = dept.dept_id
    </select>

    <resultMap id="findDeptRM" type="com.atguigu.pojo.DeptUser" autoMapping="true">
        <!--主键id-->
        <id column="id" property="id"/>
        <!--其它属性-->
        <!--<result column="name" property="name"/>
        <result column="age" property="age"/>-->

        <!--一对一封装-->
        <association property="dept" javaType="com.atguigu.pojo.Dept" autoMapping="true">
            <id column="dept_id" property="deptId"/>
            <!--<result column="dept_name" property="deptName"/>-->
        </association>
    </resultMap>
</mapper>

一对多封装

标签:

collection

属性:

  1. property java的映射属性 (实体类中的属性)
  2. ofType 返回的java类型
  3. autoMapping 自动映射属性。
<?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.atguigu.mapper.DeptMapper">


    <select id="findAll" resultMap="findDeptRM">
       <!-- select dept.dept_name,dept_user.* from dept,dept_user
        where  dept.dept_id = dept_user.dept_id -->
        select d.dept_id, d.dept_name,u.id,u.name,u.age from dept d LEFT JOIN dept_user u
                                                     on d.dept_id = u.dept_id
    </select>

    <resultMap id="findDeptRM" type="com.atguigu.pojo.Dept" autoMapping="true">
        <!--主键必须写 看懂业务主键-->
        <id column="dept_id" property="deptId"></id>
        <!--<result column="dept_name" property="deptName"></result>-->

        <!--一对多-->
        <collection property="users" ofType="com.atguigu.pojo.DeptUser" autoMapping="true">
            <id column="id" property="id"/>
            <!--<result column="name" property="name"/>-->
        </collection>
    </resultMap>
</mapper>

子查询

应用场景: 在海量数据查询的情况下,通常使用子查询会有更高的效率。 但如果数据量比较小的情况下 子查询反而会影响查询效率。

<!--
        column="dept_id" 子查询时 依赖的数据字段
        select="子查询的关键属性"
    -->
<resultMap id="deptRM" type="com.atguigu.pojo.Dept">
    <id column="dept_id" property="deptId"/>
    <result column="dept_name" property="deptName"/>
    <collection property="users" ofType="com.atguigu.pojo.DeptUser"
                select="findDeptUserByDeptId" column="dept_id"></collection>
</resultMap>

<select id="findDeptUserByDeptId" resultType="com.atguigu.pojo.DeptUser">
    select * from dept_user where dept_id = #{dept_id}
</select>

懒加载机制

Mybatis提供了懒加载机制 配合 子查询一起使用 这样会方便 查询

 <!--
        column="dept_id" 子查询时 依赖的数据字段
        select="子查询的关键属性"
        fetchType="lazy" 子查询懒加载  用户使用时 才查询数据库
        fetchType="eager" 查询所有的数据  -->
    <resultMap id="deptRM" type="com.atguigu.pojo.Dept">
        <id column="dept_id" property="deptId"/>
        <result column="dept_name" property="deptName"/>
        <collection property="users" ofType="com.atguigu.pojo.DeptUser"
                    select="findDeptUserByDeptId" column="dept_id" fetchType="lazy"></collection>
    </resultMap>

    <select id="findDeptUserByDeptId" resultType="com.atguigu.pojo.DeptUser">
        select * from dept_user where dept_id = #{dept_id}
    </select>

缓存机制

一级缓存(重点)

Mybatis 中默认的缓存机制 同一个SqlSession中数据共享

二级缓存(几乎不用)

需要 手动开启 在映射文件中添加 <cache></cache> 标签
但是需要注意的是 在手动开启时 缓存时 在查询完毕后 需要手动的关闭连接。

Mybatis中二级缓存的注解写法

@CacheNamespace 标识Mapper接口 标识开启二级缓存

注意事项:

  • 注解和映射文件的二级缓存不能同时使用
  • 如果使用注解模式 则必须配合@Select注解查询
文章来源:https://blog.csdn.net/caomnnnnnn/article/details/135633047
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。