Mybatis进阶

embedded/2024/9/25 5:33:55/

一、日志管理

1552d24110f34e49b68687d03456a882.jpg

 mybatis主要使用logback来管理日志,具体内容之前的java进阶有说,链接如下

java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类_java logs是什么意思-CSDN博客

二、动态SQL

动态SQL指的是根据参数数据动态组织SQL的技术。

三、MyBatis二级缓存

我们使用mybatis查询一条数据两次,第一次查询从硬盘读取,第二次查询还从硬盘读取是比较慢的,如果把第一次查询的结果存到内存一块空间中,在内存中读取会快至少几十倍。

1.二级缓存和缓存范围

478bd740533146e3b45978113fc15cea.jpg 88536da72e05414f9f89e3aea76ad4be.jpg

 一级缓存的存在时间比较短,SqlSession会话结束后缓存就会清空,所以需要mapper命名空间这个二级缓存。不同的命名空间对应不同的二级缓存区域,只有在使用相同命名空间执行相同的查询语句并且没有对查询结果进行修改等操作时,才会从二级缓存中获取数据。

2.二级缓存运行规则和开启 

08c56fa7a1c94fac9e5569bc166a2fa2.jpg

387ab5589a1d473cb479a640167f8cc3.jpg

mapper文件中在mapper标签的第一行添加cache标签 

3.cache标签属性的解读

(1)eviction

eviction是缓存的清除策略,当缓存对象数量达到上限后,自动触发对应算法对缓存对象清除

1.LRU    最近最久未使用:移除最长时间不被使用的对象。

2.FIFO  先进先出:按对象进入缓存的顺序来移除它们。

3.SOFT 软引用:移除基于垃圾收集器状态和软引用规则的对象。

4.WEAK 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

(2)flushInterval

代表间隔多长时间自动清空缓存,单位亳秒,600000毫秒=10分钟

(3)size

缓存存储上限,用于保存对象或集合(1个集合算1个对象)的数量上限

(4)readOnly

设置为true,代表返回只读缓存,每次从缓存取出的是缓存对象本身,这种执行效率较高

设置为false代表每次取出的是缓存对象的"副本”,每一次取出的对象都是不同的,这种安全性较高

4.useCache和flushCache

(1)useCache

可以在<insert>等四大sql标签使用useCache属性设置值为false表示不开启缓存。

(2)flushCache

可以在四大sql标签添加该属性,设置值为true表示一句sql执行完,立马刷新缓存空间。

四、分页查询

1.PageHelper分页

(1)PageHelper使用流程

直接浏览器搜pageHelper到官网有详细用法

d9f7b135d5a54e398d82bf3b085f6014.jpg

(2)引入PageHelper和jsqlparser依赖        

        <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.10</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>2.0</version></dependency>

(3)增加Plugin配置 

    <plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/><property name="reasonable" value="true"/></plugin></plugins>

说明:

(1)plugins插件是mybatis的一个特色,通过插件可以扩展mybatis的能力;

(2)interceptor属性:代表拦截器,需要配置PageHelper的核心类;

(3)helperDialect配置项,设置为mysql代表使用limit分页,不同数据库的分页操作不同,所以这个配置项必须设置。

(4)reasonable配置项,代表分页合理化。

(4)测试方法

    @Testpublic void testPageHelper(){SqlSession sqlSession = null;try {sqlSession = MybatisUtils.getSqlSession();PageHelper.startPage(10,10);Page page = (Page)sqlSession.selectList("goods.selectAll");System.out.println("总页数:"+page.getPages());System.out.println("总记录数:"+page.getTotal());System.out.println("开始行号:"+page.getStartRow());System.out.println("结束行号:"+page.getEndRow());List<Goods> list = page.getResult();for(Goods goods : list){System.out.println(goods.getTitle());}} catch (Exception e) {throw new RuntimeException(e);} finally {MybatisUtils.closeSqlSession(sqlSession);}}

2.不同数据库分页

(1)Mysql

b33653e6e8ed418694019482f6711a63.jpg

 从第10行开始读取20行

(2)Oracle

ca98fe531e514961a6bec7d6e256efba.jpg

 读取12行到20行数据

(3)SQL Server

2000年

e61ffd3dd51a45f08a78cdc3aa05cd1e.jpg

 读取第16 17 18行数据

2012年至今

267bbdcdad124dd5a90e7de6d91ce4a1.jpg

 读取到5 6 7 8 9行数据

五、mybatis整合C3P0连接池

mybatis自己生成的连接池并没有许多现有的连接池技术好,现在介绍一款。

1.引入maven依赖

2.建一个datasource包下创建一个工厂类

/*** C3PO与MyBatis兼容使用的数据源工厂类*/
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {public C3P0DataSourceFactory() {this.dataSource = new ComboPooledDataSource();}
}

3.配置文件mybatis-config.xml

 不同连接池的数据连接配置的属性名称不同(驱动、数据连接、用户名、密码)

还可以设置默认连接数量和最大最小连接数量

 

六、mybatis批次处理

使用foreach标签

1.批次插入,批次删除

346ac2974970432882e01d4878169606.jpg

 2.批次处理优缺点

优点: 比一条一条sql处理快

缺点:无法获得插入数据生成的id

         批量生成的SQL太长,可能会被服务器拒绝

七、mybatis注解开发

1.常用注解

08be093d6b27453d9e64210dd54485dd.jpg

2.注解开发流程

注解开发不需要使用mapper xml文件,需要建立一个dao包,里面存放操作sql的接口,在接口的抽象方法上面添加常用注解。

3.注解方式查询流程

(1)创建接口和查询方法

在dao包下创建接口和方法,并在方法上使用@Select注解,SQL传参使用@Param注解

06a05ad3b812496aa3e322e59ddba7a4.jpg

(2)在mybatis配置文件配置坐标

b27e93641d184b1d8344f7d672bfe068.jpg

 (3)测试方法

4.注解方式插入返回自动生成的主键

要添加@SelectKey注解,里面要配置statement属性(mysql查询主键id的SQL语句),

keyProperty属性(实体对象的主键属性名goodsId),returnType属性(主键的数据类型Integer.class)


http://www.ppmy.cn/embedded/116463.html

相关文章

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

Redis系列补充:聊聊布隆过滤器(go语言实践篇)

1 介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是 Redis 4.0 版本之后提供的新功能&#xff0c;我们一般将它当做插件加载到 Redis Service服务器中&#xff0c;给 Redis 提供强大的滤重功能。 它是一种概率性数据结构&#xff0c;可用于判断一个元素是否存在于一个集…

SylixOS 网络协议栈,struct netif 数据结构浅析(更新中)

SylixOS 网络协议栈&#xff0c;数据结构浅析 结构体定义 struct netif { #if !LWIP_SINGLE_NETIF/** pointer to next in linked list */struct netif *next; #endif#if LWIP_IPV4/** IP address configuration in network byte order */ip_addr_t ip_addr;ip_addr_t netmas…

批量发送邮件:性能优化与错误处理深度解析

目录 一、批量发送邮件的基础概述 1.1 批量发送邮件的定义 1.2 邮件发送流程 二、性能优化策略 2.1 发送速率控制 2.2 队列管理 2.3 动态IP池管理 2.4 智能调度 三、错误处理机制 3.1 暂时性发送错误处理 3.2 永久性发送错误处理 3.3 邮件反馈收集与分析 四、案例…

深入理解前端拖拽:从基础实现到事件冒泡与委托的应用【面试真题】

在前端开发中&#xff0c;拖拽功能是一项常见的交互需求。通过监听鼠标或触摸事件&#xff0c;用户可以拖动元素并将其放置到指定位置。理解拖拽的底层实现、如何判断拖拽的是子元素还是父元素&#xff0c;以及事件冒泡和事件委托的原理&#xff0c;可以帮助我们更好地实现复杂…

Unity-Camera代码相关

一 重要静态成员 1.获取摄像机 如果用之前的知识 来获取摄像机 主摄像机的获取 如果想通过这种方式 快速获取摄像机 那么场景上必须有一个 tag为MainCamera的摄像机 print(Camera.main.name); 获取摄像机的数量 Camera.allCamerasCount print(…

数据结构与算法学习day23-回溯算法-递增子序列

一、递增子序列 1.题目 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xf…

EasyExcel日常使用总结

文章目录 概要引入依赖常用操作方法折叠或隐藏列折叠或隐藏行单元格样式单行表头设置多行表头设置多个sheet写入自动列宽 概要 EasyExcel日常使用总结。 引入依赖 引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</a…