• 尚硅谷SSMMybatis篇


    参考视频:https://www.bilibili.com/video/BV1VP4y1c7j7?p=66&vd_source=510ec700814c4e5dc4c4fda8f06c10e8

    代码地址:https://gitee.com/empirefree/SpringBoot-summarize/tree/尚硅谷-mybatis篇/

    csdn csdn csdn csdn csdn


    1. 基本概念

    1.1. Mybatis基本概念

    1.1.1 名词

    Mybatis是个半自动ORM框架的持久化框架

    1.1.2 ${}、#{}

    ${}:字符串拼接

    {}:占位符赋值

    1.1.3 @Param

    类似于Map存储

    xml分为命名空间和使用函数,就是包 + select,在进入mapper语句源码时会使用到

    image-20220609161734537

    1.1.4 ResultMap
        <!-- 通用查询映射结果 第一个是id 后面是result字段 -->
        <resultMap id="BaseResultMap" type="">
            <id column="id" property="id" />
            <result column="external_userid" property="externalUserid" />
        </resultMap>
    
    1.1.5 association

    association多对一查询,强制多对多也只会查询出第一条记录

    1.1.6 collection

    collection 一对多、多对多查询

    1.1.7 分步查询、延迟加载

    分步查询:查询一个员工SQL之后另外去调用另一个部门SQL,在assocation, collection的select 属性实现

    延迟加载:只加载需要的部分,需要开启mybatis的lazyloadingEnabled=true,这样上面分步查询如果只查员工就不会查询部门

    (感觉目前用不到,现在都讲究高速,而且分成2条SQL查询效率也比较低)

    1.2 动态SQL

    1.2.1 基本概念

    为了解决拼接SQL中字符串的语法问题

    1.2.2 If
     <!-- if判断不查询null, '', size()为空的值 -->  
    <if test="XXX != null and XXX.size() > 0">
          and
    </if>
    
    1.2.3 where
        <!--<where> 可以去掉前置的and, or标签, 若内部条件都不满足,则失效,与where 1=1 一样-->
        <select id="selectWhere" resultType="com.empirefree.mybatisplus.entity.Dept">
            select * from dept
            <where>
                <if test="did != null and did != '' ">
                    and did = #{did}
                </if>
                <if test="did != null and did != '' ">
                    or did = #{did}
                </if>
            </where>
        </select>
    
    1.2.4 trim

    prefix, suffix:为整条语句前置后置添加指定字符,可用于select 的where、and、or,insert的分隔符

            <trim prefix="where" prefixOverrides="and" suffixOverrides="and | or">
                <if test="did != null and did != '' ">
                    and did = #{did}
                </if>
                <if test="did != null and did != '' ">
                    or did = #{did} or
                </if>
            </trim>
    
    1.2.5 choose|when|otherwise
            /*when: 类似于else if 可以有一个或多个,而otherwise最多只能有一个,也可以放在select条件中 */
            <choose>
                <when test="did != null and did != '' ">
                    did = #{did}
                </when>
                <otherwise>
                    did = 2
                </otherwise>
            </choose>
    
    1.2.6 foreach
            <foreach collection="e" item="eid" separator="or" open="(" close=")"></foreach>
    
    
    1.2.7 SQL标签
    <!--字段拼接成SQL片段 -->    
    <sql id="Base_Column_List">
            id, name
        </sql>
        
         select <include refid="Base_Column_List"/> from table
    

    2.Mybatis缓存

    2.1. 基本概念

    2.1.1 一级缓存

    默认开启,为SQLSession

    2.1.1.1 四种失效情况

    1、不同SQLSession对应不同一级缓存(springboot中若没开启事务,则每次CRUD都会重新创建一个SQLSession)

    2、同一个SQLSession查询条件不同

    3、同一个SQLSession2个查询中执行了任何CUD操作

    4、同一个SQLSession2个查询中手动清空了缓存

    2.1.2 二级缓存
    2.1.2.1 开启条件

    ​ 二级缓存内部有SqlSessionFactory,开启后每次会重新创建SqlSessioin,但是内部会复用cache的SQL

    1、核销配置文件设置cacheEnabled=true 默认开心

    2、映射mapper文件设置标签

    3、二级缓存必须在SQLSession提交或关闭后有效

    4、查询的实体类必须实现序列化接口Serializable

    (个人博客链接:https://www.cnblogs.com/meditation5201314/p/14854788.html)

    2.1.2.2 失效情况

    2次查询之间执行了任何增删改之后,一二级缓存都会失效

    2.1.2.3 缓存配置
    1. eviction:缓存回收策略
      1. LRU:默认
      2. FIFO
    2. FlushInterval:刷新间隔,仅在增删改时刷新
    3. size: 引用数目,缓存多少个对象
    4. readOnly: 默认false,设置成true就不能修改,就会出现和数据库里数据不一致情况,但是设置成true确实可以增加查询效率
    2.1.3 查询顺序
    1. 先查二级缓存
    2. 二级缓存没有,查一级缓存
    3. 一级缓存也没有,查数据库
    4. SQLSession关闭后,一级缓存写入二级缓存

    ​ (程序->底层servelt 数据库实现类-> JDBC)

    image-20220608193009636

  • 相关阅读:
    Go 交叉编译
    go module 基本使用
    win10中安装Linux子系统
    VsCode/Pycharm配合python env 使用
    python virtualenv 基本使用
    Django 知识点小记
    Django中一种常见的setting与账密保存/读取方式
    win安装python模块出现依赖问题的解决方法 & No module named 'MySqldb'
    MySQL数据库文件
    如何在MySQL中分配innodb_buffer_pool_size
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/16364307.html
Copyright © 2020-2023  润新知