MyBatis:生命周期、作用域、结果集映射 ResultMap、日志、分页、使用注解开发、Lombok
文章目录
- MyBatis:Day 02
- 一、生命周期和作用域
- 二、结果集映射:ResultMap
- 三、日志工厂
- 1. 标准日志:STDOUT_LOGGING
- 2. LOG4J
- 四、分页
- 五、使用注解开发
- 六、Lombok
- 注意:
MyBatis:Day 02
一、生命周期和作用域
理解不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了;
- 最佳作用域是方法作用域(也就是局部方法变量)。
SqlSessionFactory :相当于数据库连接池
- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,最佳实践是在应用运行期间不要重复创建多次;
- 最佳作用域是应用作用域;
- 最简单的就是使用单例模式或者静态单例模式。
SqlSession :相当于连接到连接池的一个请求
- 每个线程都应该有它自己的 SqlSession 实例;
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域;
- 用完之后需要赶紧关闭,否则资源被占用。
二、结果集映射:ResultMap
当属性名和字段名不一致时,会出现读取数据为 null 的情形。
两种解决方法:
- 在写 sql 语句时,将查询到的字段起别名,与属性名一致;
- 使用结果集映射
resultMap标签。

注意点:
- 第二种方式,记得要把标签
resultType改为resultMap,resultMap标签的名字可以随便起,但要对应;- 第二种方式,
resultMap标签中的type为返回值类型、property为实体类中的属性、column为数据库中的字段;- 第二种方式,只需要映射属性名和字段名不一致的即可;
resultMap元素是 MyBatis 中最重要最强大的元素。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
三、日志工厂
如果一个数据库操作出现了异常,此时可以用日志来帮助我们排错。
可以在 MyBatis 核心配置文件中,指定 MyBatis 所用日志的具体实现。

常用的日志有:STDOUT_LOGGING、LOG4J(3.5.9 起废弃)。
1. 标准日志:STDOUT_LOGGING
在 MyBatis 核心配置文件中进行配置
<settings><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
注意:注意字母大小写,不能多空格,严格按照参考文档规范。
日志输出

注意:由日志可以看到,MyBatis 会自动开启事务,但增删改操作需要手动提交事务。
2. LOG4J
由于漏洞影响,IntelliJ 平台彻底停止使用 LOG4J,建议切换到 java.util.logging 作为标准日志框架。
四、分页
MyBatis 实现分页,使用的是 limit 分页,核心还是在写 sql。
举例:查询名字带有“张”的人,并进行分页。


除了自己进行分页,还可以使用 MyBatis 分页插件 PageHelper,点此进入。

五、使用注解开发
-
注解本质上是一个接口,该接口默认继承了
java.lang.annotation.Annotation接口。 -
面向接口编程的原因:解耦,达到定义(规范、约束)与实现的分离。
-
MyBatis 除了用
Mapper.xml映射器类映射,还有另一种方法可以完成语句映射:使用 Java 注解来配置。 -
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
-
选择何种方式来配置映射,永远不要拘泥于一种方式,可以很轻松地在基于注解和 XML 的语句映射方式间自由移植和切换。
-
注解开发的本质是:反射机制实现;底层:使用了动态代理。
步骤:
- 在接口的方法上添加注解,编写 sql 语句;
- 在核心配置文件中绑定接口;
- 测试。


注意:
- 有了注解,就不需要
Mapper.xml配置文件了,并且需要在 MyBatis 核心配置文件中绑定接口;- 写注解中的 sql 语句时,注意参数的对应关系:
- 参数有
@Param("x")注解的,#{x}从 Param 注解中找对应名字拿参;- 参数是实体类,
#{属性名}从实体类中依据属性名拿参;- 参数是 Map 集合,
#{键}从集合中依据键名拿参。- 关于
@Param("")注解:
- 基本数据类型或 String 类型的参数,需要在参数前加上该注解;
- 引用类型不需要加;
- 如果只有一个基本数据类型,可以不用加,但是最好加上。
六、Lombok
-
Lombok 项目是一个 Java 库,它可以自动插入到编辑器和构建工具中,增强 Java 的性能;
-
不需要再写 getter、setter 或 equals 方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等。
使用步骤:
-
在 IDEA 中安装 Lombok 插件
注意:打开 IDEA 设置,找到
Plugins上面搜索 Lombok,如果搜得到就可以直接下载。如果搜索不到,进入官网下载安装包,并导入,Lombok 官网点此进入。从 IntelliJ 2020.3 版开始,Lombok 插件将默认集成并包含在 IntelliJ 中。

- 在项目中导入 Lombok 的 jar 包(Maven 项目导入依赖)
<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version>
</dependency>
-
使用 Lombok:在实体类中加注解
常用的注解(下图圈出来的):
@Data:除了有参构造器,其他都会自动生成;@AllArgsConstructor:生成有参构造器,注意此时无参构造器会消失;@NoArgsConstructor:生成无参构造器。


注意:
- MyBatis 分页插件 PageHelper:https://pagehelper.github.io/
- Lombok 官网下载:https://plugins.jetbrains.com/plugin/6317-lombok/versions
相关文章:
MyBatis:生命周期、作用域、结果集映射 ResultMap、日志、分页、使用注解开发、Lombok
文章目录 MyBatis:Day 02一、生命周期和作用域二、结果集映射:ResultMap三、日志工厂1. 标准日志:STDOUT_LOGGING2. LOG4J 四、分页五、使用注解开发六、Lombok注意: MyBatis:Day 02 一、生命周期和作用域 理解不同作…...
PostgreSQL安装和开启SSL加密连接【配置双向认证】
SSL单向认证和双向认证: SSL单向认证:只有一端校验对端的证书合法性,通常都是客户端来校验服务器的合法性。即在一般的单向认证中,只要求服务器端部署了ssl证书就行,客户端可以无证书,任何用户都可以去访问…...
【ShenYu系列】ShenYu Dubbo插件全流程源码解析
网关启动 在ShenyuConfiguration注入ShenyuWebHandler。 Bean("webHandler")public ShenyuWebHandler shenyuWebHandler(final ObjectProvider<List<ShenyuPlugin>> plugins, final ShenyuConfig config, Lazy final ShenyuLoaderService shenyuLoaderS…...
spring解决循环依赖的三级缓存
一、Spring在创建Bean的过程中分三步 实例化,对应方法:AbstractAutowireCapableBeanFactory中的createBeanInstance方法,简单理解就是new了一个对象。属性注入,对应方法:AbstractAutowireCapableBeanFactory的populat…...
C++ - 标准库(STL)
目录 一、简介 二、什么时候使用STL 2.1、 vector 和 deque 的使用场景 2.2、 vector 和 deque 的比较 2.3、 list的使用场景 一、简介 C标准库是C编程语言的标准程式库,它提供了一个通用的容器类、算法和函数模板库。 其中包括了多种容器类型,例…...
Java使用 Scanner连续输入int, String 异常错误输出原因分析
目录 一、Scanner常用语法 1、sc.nextInt()介绍 2、sc.next()介绍 3、sc.nextLine()介绍 4、sc.hasNext()介绍 二、报错案例 1、使用next()来接收带有空格的字符串会输出异常 2、先输入数字再输入字符串的输出异常 一、Scanner常用语法 Scanner sc new Scanner(System.…...
pt13网络编程
网络编程 OSI 7层模型 建立了统一的通信标准 降低开发难度,每层功能明确,各司其职 七层模型实际规定了每一层的任务,该完成什么事情 TCP/IP模型 七层模型过于理想,结构细节太复杂在工程中应用实践难度大实际工作中以TCP/IP模型…...
华为云 绑定/更换证书
操作场景 为了支持HTTPS数据传输加密认证,在创建HTTPS协议监听的时候需绑定证书,您可以参考本章节绑定证书。如果弹性负载均衡实例使用的证书过期或者其它原因需要更换,您可以参考本章节更换证书。如果还有其他的服务也使用了待更换的证书&a…...
重大问题,Windows11出现重大BUG
重大问题,Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的,但是,今天我将代表所有微软用户,解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…...
傅里叶变换解析
p.s.本文无论是cos还是sin,都统一用“正弦波”(Sine Wave)一词来代表简谐波。 一、什么是频域 从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称…...
你的登录接口真的安全吗?
1.前言 大家学写程序时,第一行代码都是hello world。但是当你开始学习WEB后台技术时,很多人的第一个功能就是写的登录 (小声:别人我不知道,反正我是)。但是我在和很多工作经验较短的同学面试或沟通的时候&…...
ChatGPT情商很高,但并不适合当搜索引擎
微软和谷歌正急于使用大型语言模型技术来强化搜索引擎。但有充分的理由认为,相比于提供事实性信息,这项技术更适合作为人们情感上的伴侣。 美媒评论称,目前基于大型语言模型的人工智能工具,例如ChatGPT,更擅长共情而不…...
Mac 地址与 IP 地址有什么区别?
Mac 地址和 IP 地址是两个不同的概念,它们分别代表了计算机网络中的不同层次和地址。Mac 地址是物理地址,是在计算机硬件中存储的地址,通常是以特定的六进制格式表示。每个设备都有一个唯一的 MAC 地址,它可以用来在计算机之间进行…...
bootloaders
什么是BootLoader? 一般来说,bootloader是一种软件/固件,它在SoC上电后立即运行。bootloader的主要职责是启动软件的后续部分,例如操作系统、baremetal应用程序或在某些情况下另一个bootloader。当涉及到嵌入式时,bootloader通常…...
PC或服务器装双系统
1. 准备工作 1.1U盘启动盘的制作 ①准备一个 4G 以上的 U 盘,备份好U盘资料,后面会对 U 盘进行格式化。 ②去CentOS官网下载你想要安装的 ISO 格式镜像文件,现在通常是CentOS6、7或者8。如果你英文不太好,可以选择使用edge浏览…...
嵌入式代码查看分析利器---Understand
平时在开发嵌入式程序的时候大多数使用的都是keil软件,一般小的工程使用keil没感觉到有什么问题,但是当工程比较大的时候,比如移植了FreeRTOS系统或者LWIP网络系统时,代码全部编译一次就要花费很长世间,特别是开启了点…...
人群计数经典方法Density Map Estimation,密度图估计
(3)Density Map Estimation(主流) 这是crowd counting的主流方法 传统方法不好在哪里?object detection-based method和regression-based method无法从图像中提取更抽象的有助于完成人群计数任务的语义特征 概况&…...
【华为】Smart-Link基础知识
Smark-Link技术 Smark-Link(灵活链路or备份链路,华为/华三 私有用) Smark-Link定义 Smark-Link,又叫备份链路。一个Smark Link由两个接口组组成,其中一个接口作为另一个的备份。Smark-Link常用于双上行组网,提供可靠高效的备份与…...
分享24个强大的HTML属性 —— 建议每位前端工程师都应该掌握
前期回顾 是不是在为 API 烦恼 ?好用免费的api接口大全呼之欲出_0.活在风浪里的博客-CSDN博客APi、常用框架、UI、文档—— 整理合并https://blog.csdn.net/m0_57904695/article/details/130459417?spm1001.2014.3001.5501 👍 本文专栏:…...
NIO基础 - 网络编程
non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
