继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第十四天 MyBatis进阶-MyBatis日志管理与动态SQL

慕瓜6049866
关注TA
已关注
手记 28
粉丝 0
获赞 0

课程信息
● 学习课程:Java工程师2022版
● 章节名称:MyBatis进阶-MyBatis日志管理与动态SQL
● 讲师:八戒猪

课程内容
MyBatis日志管理
日志文件是用于记录系统操作事件的记录文件或文件集合
日志保存历史数据是诊断问题以及理解系统活动的重要依据
SLF4j Apache-Commons-Logging 日志门面
log4j Logback java.util.logging(jul) 日志实现
● MyBatis底层就是通过SLF4J支持logback
● 在Maven工程中的pom.xml文件中增加依赖
● logback-classic 模块需要在 classpath 添加 slf4j-api.jar、logback-core.jar 以及 logback-classic.jar。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

● 作为logback来说是允许对日志进行自定义的,具体的做法是需要在resources目录下新增xml文件,这个文件名称强制要求叫做logback.xml(在测试环境中给配置文件命名为 logback-test.xml,在生产环境中命名为 logback.xml。)
● 在标签中增加标签用于说明在什么地方进行日志的输出:

<appender name="console" class=" ch.qos.logback.core.ConsoleAppender"
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--    追加器,说明在什么地方进行日志的输出,使用class属性-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n</pattern>
        </encoder>
    </appender>
<!--    表明日志打印的跟标签,凡是debug级别以上的日志都会打印-->
    <root level="debug">
        <appender-ref ref="console"></appender-ref>
    </root>
</configuration>
<!--        在编码中规定日志输出的格式
%d{HH:mm:ss.SSS} 日志打印最前面的是时间,到毫秒
[%thread] 线程的名称
%-5level 日志级别,-5表明按5字符右对齐
%logger{36} 表明是哪个类产生的日志,最多36个字符
%msg 日志输出的内容
%n 换行
-->
<!--    日志输出级别(优先级高到低)
   error:错误-系统的故障日志
   warn:警告-存在风险或使用不当的日志
   info:一般性信息
   debug:程序内部用于调试信息
   trace:程序运行的跟踪信息
-->

动态SQL

<select id="dynamicSQL" parameterType="java.util.Map" resultType="com.cgdz.entity.Goods">
    select * from t_goods
    <where>
        <if test="title!=null">
            and title=#{title}
        </if>
    </where>
</select>

MyBatis二级缓存
● 一级缓存默认开启,缓存范围SqlSession会话
● 二级缓存手动开启,数据范围Mapper Namespace
二级开启后默认所有查询操作均使用缓存
写操作commit提交时对该namespace缓存强制清空
配置useCache=false 设置不用缓存(在返回的结果过多的时候在select标签中使用)
配置flushCache=true代表强制清空缓存(commit之前就清空)
在对应的xml文件中添加配置:
增加一个cache标签
里面填写四个属性:
eviction=“LRU” 缓存的清空策略/ 还有“FLU”(最近最少使用)
flushInterval=“600000” 缓存的刷新间隔
size=“512” 缓存最大数量
readOnly=“true” 缓存 只读
● 最好只保存单个的实体对象缓存!(因为一个List会当成一个缓存)

cache标签主要有4个属性:eviction、flushInterval、size、readOnly
evication 是缓存的清除策略,当缓存对象数量达到上限后,自动触发对应算法对缓存对象清除
1、LRU:最近一段时间内,最久未使用:移除最长时间不被使用的对象;
2、LFU:最近一段时间内,最少使用的
3、FIFO:先进先出,按对象进入缓存的顺序来移除它们;
4、SOFT:软引用,移除基于垃圾收集器状态和软引用规则的对象
5、WEAK:弱引用:更积极的移除基于垃圾收集器状态和弱引用规则的对象。
flushInterval 代表缓存的清除间隔,单位是毫秒,600000ms=10min,利用这个属性可以及时对内存进行回收
size 表示缓存存储上限,用于保存对象或集合(一个集合算一个对象),不推荐将集合作为缓存对象在二级缓存中进行保存,这样缓存命中率比较低
readOnly
设置为true,代表只读缓存,每次从缓存去除的是缓存对象本身,执行效率比较高
设置为false,代表每次取出的是缓存对象的“副本”,每一次取出的对象都是不同的,这种安全性较高
其他标签关于缓存的设置
useCache="false"代表查询结果不放入缓存,因此这个sql语句的查询结果太多,太占用缓存了,而且缓存命中率也比较低。

<select id="selectAll" resultType="com.imooc.myBatis.entity.Goods" useCache="false">
   select * from t_goods ORDER BY goods_id DESC limit 10;
</select>

flushCache="true"与SqlSession.commit()作用相同,也可以放在查询select和insert等标签上。

<!--    flushCache="true"强制清除缓存,sql执行完之后立即清除缓存-->
    <update id="update" parameterType="com.imooc.myBatis.entity.Goods" flushCache="true">
        update t_goods
        set
            title=#{title},
            sub_title=#{subTitle},
            original_cost=#{originalCost},
            discount=#{discount},
            current_price=#{currentPrice},
            is_free_delivery=#{isFreeDelivery},
            category_id=#{categoryId}
        where goods_id=#{goodsId}
    </update>

学习收获
MyBatis的日志管理logback使用,以及MyBatis的动态Sql,还有MyBatis的二级缓存,设置二级缓存使用的参数,以及每个参数的含义
打卡截图
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP