尚硅谷--SSM--Mybatis篇

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

代码地址:https://gitee.com/empirefree/SpringBoot-summarize/tree/%E5%B0%9A%E7%A1%85%E8%B0%B7-mybatis%E7%AF%87/

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语句源码时会使用到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9gfPhzgG-1654857079584)(https://1-1257837791.cos.ap-nanjing.myqcloud.com/202206091617637.png)]

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)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nJyrE05R-1654857079585)(https://1-1257837791.cos.ap-nanjing.myqcloud.com/202206081930747.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福宇乔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值