当前位置: 首页 > news >正文

Java面试——MyBatis相关知识

目录

1.什么是MyBatis

2.MyBatis优缺点

3.MyBatis工作原理

4.MyBatis缓存模式

5.MyBatis代码相关问题

6.MyBatis和hibernate区别


1.什么是MyBatis

MyBatis是一个半ORM持久层框架(对象关系映射),基于JDBC进行封装,使得开发者可以专注于SQL语句,不用关系JDBC操作的流程。

MyBatis支持定制化 、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOS(Plain Ordinary Java Object,普通的 Java对象,即实际开发中的实体类)映射成数据库中的记录。

2.MyBatis优缺点

MyBatis作为市面上应用最为广泛的数据库框架,具有以下优点:

  • 简单易学:本身就很小且简单。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

  • 灵活便捷:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。同时,减少了JDBC相关代码,大大减少了代码量。

  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

  • 兼容性好:基于JDBC进行封装,所以可以和很多数据库兼容。

  • 提供xml标签,支持编写动态sql。

但同时,MyBatis也还具有一定的缺点:

  • SQL语句编程量较大,较为考验使用者的SQL功力。
  • SQL语句与具体数据库依赖很大,使得数据库移植性差。

3.MyBatis工作原理

MyBatis的工作原理主要依赖于SqlSessionFactory和SqlSession两大类。其主要分为两大过程:

(1)MyBatis启动加载。Mybatis会获取一个SqlSessionFactory对象,完成全局配置文件和映射文件的加载解析操作,然后把相关信息保存到Configuration对象中。然后通过SqlSessionFactory获取SqlSession对象(基于DefaultSqlSessio对象实现)。

SqlSessionFactory类,它是单个数据库映射关系经过编译后的内存镜像,主要是创建DefaultSqlSessionFactory对象进行具体实现。而SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuildr则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

(2)MyBatis处理请求。SqlSession类中提供了处理请求的方法(select、update等),并调用对应的Executor处理。处理过程中,如果有配置缓存,先走二级缓存,再走一级缓存,缓存不命中,再走数据库操作。会通过StatementHandler处理,先通过ParameterHandler处理SQL中的占位符,再通过ResultSetHandler处理结果集的映射。

SqlSession类,同理,主要是创建DefaultSqlSession对象进行具体实现。SqlSession接口实例执行方法的过程中主要会去执行Executor类的方法,进行请求的具体处理。

总结来说,具体的工作流程就是通过SqlSessionFactoryBuilder从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例,再由SqlSessionFactory创建出一个SqlSession,并由该SqlSession进行请求的处理,执行事务和SQL语句。

4.MyBatis缓存模式

mybatis为减轻数据库压力,提高数据库性能,提供了两级缓存机制:

(1)一级缓存:

基于会话(session)的缓存。一级缓存是默认放开的,但需开启事务进行使用(就是同一个事务中的第二次查询会走缓存)。MyBatis中一级缓存也叫做本地缓存,于SqlSession层面实现的,所以作用范围是在同一个SqlSession中,不同的SqlSession及时查询相同的数据也不会走缓存。

(2)二级缓存:

基于进程(使用装饰器维护,涉及到了装饰器模式,需要了解可参考java设计模式——装饰器模式)的缓存。MyBatis中二级缓存的作用域是namespace(命名空间),所以很显然二级缓存是需要存储在SqlSession之外的:

二级缓存缓存范围比一级缓存更大,不同的SQLSession可以访问二级缓存的内容,所以二级缓存需要自己开启,哪些数据放入二级缓存需要自己指定。

开启方式(application.yml文件配置):

# mybatis相关配置
mybatis:configuration:#开启MyBatis的二级缓存cache-enabled: true

或是在mapper.xml文件中添加代码:

 其中eviction属性指缓存回收策略,flushInterval则是缓存更新时间(上述代码中为1分钟)

eviction:缓存的回收策略,默认的是 LRU。

  • LRU - 最近最少使用,移除最长时间不被使用的对象。
  •     FIFO - 先进先出,按对象进入缓存的顺序来移除它们。
  •     SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象。
  •     WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象。
     

(3)三级缓存:

三级缓存又称为自定义缓存,如使用Redis进行缓存等,需要自行进行配置操作。

实际代码中如何开启

5.MyBatis代码相关问题

(1)获取自增主键:如果数据库中设计了主键id自动增长,那么可以通过MyBatis中的mapper.xml文件中的属性配置,获取该值,并进行插入:

<insert id="addEmployee" parameterType="employee" useGeneratedKeys="true" keyProperty="id">insert into tbl_employee (id, name, email, gender)values (#{id}, #{name}, #{email}, #{gender});
</insert>

核心代码为: useGeneratedKeys="true" keyProperty="id"

(2)属性名和字段名不一致:主要通过resultMap标签处理。

<resultMap id="empResultMap" type="Emp"><id column="student_id" property="id"></id><result column="s_name" property="name"></result>    
</resultMap>
<select resultMap="empResultMap">select * from student where student_id = #{id}
</select>

(3)#和$的区别:

  • #{}是预编译处理,会把传入的数据都当成一个字符串来处理,所以会在传入的数据上面加一个双引号。其在mybatis处理时替换为?,然后进行赋值。
  • ${}是在mybatis处理时直接替换,作用相等于是字符串拼接,所以会有SQL注入风险。

例子:

select * from student where name= #{name}

上述语句中,该sql语句会将#{name}替换为?,然后获取到传入的@Param的参数值时(比如name="seven"),再传入(整个"seven"进行传入)。

select * from student where name= ${name}

 如果传入的name类型为整型类型,那么在执行sql语句时就不会出错,但是如果传入的name类型为字符串型,就会变成select * from student where name=seven,执行会报错。

所以,一般情况下,传入参数使用 #{},如果需要凭借SQL语句时,才使用${}。

6.MyBatis和hibernate区别

Hibernate也是一个对象关系映射框架,同样基于JDBC进行封装,工作原理与MyBatis类似。其余MyBatis之间主要区别如下:

MyBatisHibernate
半自动框架,需要手动编写SQL语句全自动的orm框架,hibernate可以自动生成SQL语句,自动执行
日志模块只有基本记录功能拥有完成的日志系统
缓存模块需要在每个表-对象进行详细配置缓存机制上更优
移植性较差移植性更强
由于sql都是手动编写,且存于xml文件中,优化更为便捷

由于sql都是自动生成,优化较为困难,且遇到一些较为复杂的sql操作时,无法达成目的。

总结来说,mybatis较为轻便简单,而直接使用sql语句,开发更方便,上手更快。Hibernate框架更为复杂,也更加严谨。

相关文章:

Java面试——MyBatis相关知识

目录 1.什么是MyBatis 2.MyBatis优缺点 3.MyBatis工作原理 4.MyBatis缓存模式 5.MyBatis代码相关问题 6.MyBatis和hibernate区别 1.什么是MyBatis MyBatis是一个半ORM持久层框架&#xff08;对象关系映射&#xff09;&#xff0c;基于JDBC进行封装&#xff0c;使得开发者…...

Cortex-M0编程入门

目录1.嵌入式系统编程入门微控制器是如何启动的嵌入式程序设计2.输入和输出3.开发流程4.C编程和汇编编程5.什么是程序映像6.C编程&#xff1a;数据类型7.用C语言操作外设8.Cortex微控制器软件接口标准&#xff08;CMSIS&#xff09;简介标准化内容组织结构使用方法优势1.嵌入式…...

字符串函数能有什么坏心思?

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的C语言宝藏 &#x1f4ac;总结&#xff1a;希望你看完之…...

Vue3 组件之间的通信

组件之间的通信 经过前面几章的阅读&#xff0c;相信开发者已经可以搭建一个基础的 Vue 3 项目了&#xff01; 但实际业务开发过程中&#xff0c;还会遇到一些组件之间的通信问题&#xff0c;父子组件通信、兄弟组件通信、爷孙组件通信&#xff0c;还有一些全局通信的场景。 …...

多路查找树

1.二叉树与 B 树 1.1二叉树的问题分析 二叉树的操作效率较高&#xff0c;但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的&#xff0c;如果二叉树的节点少&#xff0c;没有什么问题&#xff0c;但是如果二叉树的节点很多(比如 1 亿)&#xff0c; 就 存在如下问题:问…...

Mybatis——注入执行sql查询、更新、新增以及建表语句

文章目录前言案例dao和mapper编写XXXmapper.xml编写编写业务层代码&#xff0c;进行注入调用额外扩展--创建表语句前言 在平时的项目开发中&#xff0c;mybatis应用非常广泛&#xff0c;但一般都是直接CRUD类型sql的执行。 本片博客主要说明一个另类的操作&#xff0c;注入sq…...

即时通讯系列-4-如何设计写扩散下的同步协议方案

1. 背景信息 上篇提到了, IM协议层是主要解决会话和消息的同步, 在实现上, 以推模式为主, 拉模式为辅. 本文Agenda: (How)如何同步(How)如何设计同步位点如何设计 Gap过大(SyncGapOverflow) 机制如何设计Ack机制总结 提示: 本系列文章不会单纯的给出结论, 希望能够分享的是&…...

tui-swipe-action组件上的按钮点击后有阴影的解决方法

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 目录 前言问题描述问题解决前言 一直未敢涉足电商领域,总觉得这里面的道道很多,又是支付、又是物流的,还涉及到金钱,所以我们所做的项目,一直都是XXXX管理系统,XXX考核系统,移动端的也是,XX健康管理平台…… 但…...

【大数据Hadoop】Hadoop 3.x 新特性总览

Hadoop 3.x 新特性剖析系列11. 概述2. 内容2.1 JDK2.2 EC技术2.3 YARN的时间线V.2服务2.3.1 伸缩性2.3.2 可用性2.3.3 架构体系2.4 优化Hadoop Shell脚本2.5 重构Hadoop Client Jar包2.6 支持等待容器和分布式调度2.7 支持多个NameNode节点2.8 默认的服务端口被修改2.9 支持文件…...

Python-第三天 Python判断语句

Python-第三天 Python判断语句一、 布尔类型和比较运算符1.布尔类型2.比较运算符二、if语句的基本格式1.if 判断语句语法2.案例三、 if else 语句1.语法2.案例四 if elif else语句1.语法五、判断语句的嵌套1.语法六、实战案例一、 布尔类型和比较运算符 1.布尔类型 布尔&…...

失手删表删库,赶紧跑路?!

在数据资源日益宝贵的数字时代公司最怕什么&#xff1f;人还在&#xff0c;库没了是粮库、车库&#xff0c;还是小金库&#xff1f;实际上&#xff0c;这里的“库”是指的数据库Ta是公司各类信息的保险柜小到企业官网和客户信息大到金融机构的资产数据和国家秘密即便没有跟数据…...

技术树基础——16排它平方数(Bigdecimal,int,string,数组的转换)

题目&#xff1a;03879 * 203879 41566646641这有什么神奇呢&#xff1f;仔细观察&#xff0c;203879 是个6位数&#xff0c;并且它的每个数位上的数字都是不同的&#xff0c;并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个&#xff0c;请你…...

04动手实践:手把手带你实现gRPC的Hello World

这篇文章就从实践的角度出发,带大家一起体验一下gRPC的Hello World。文中的代码将全部使用Go语言实现,使用到的示例也是GitHub上提供的grpc-go,下面我们开始: Hello World官方示例 首先我们要clone GitHub上gRPC的源代码到我们本地 git clone https://github.com/grpc/g…...

区块链技术与应用1——BTC-密码学原理

文章目录比特币中的密码学原理1. 哈希函数2. 数字签名3. 比特币中的哈希函数和数字签名简单介绍&#xff1a;比特币与以太坊都是以区块链技术为基础的两种加密货币&#xff0c;因为他们应用最广泛&#xff0c;所以讲区块链技术一般就讲比特币和以太坊。比特币中的密码学原理 1…...

PyTorch学习笔记:data.WeightedRandomSampler——数据权重概率采样

PyTorch学习笔记&#xff1a;data.WeightedRandomSampler——数据权重概率采样 torch.utils.data.WeightedRandomSampler(weights, num_samples, replacementTrue, generatorNone)功能&#xff1a;按给定的权重(概率)[p0,p1,…,pn−1][p_0,p_1,\dots,p_{n-1}][p0​,p1​,…,pn…...

SpringMVC对请求参数的处理

如何获取SpringMVC中请求中的信息 &#xff1f; 默认情况下&#xff0c;可以直接在方法的参数中填写跟请求参数一样的名称&#xff0c;此时会默认接受参 数 &#xff0c;如果有值&#xff0c;直接赋值&#xff0c;如果没有&#xff0c;那么直接给空值 。Controller RequestMapp…...

12年老外贸的经验分享

回想这12年的经历&#xff0c;很庆幸自己的三观一直是正确的&#xff0c;就是买家第一不管什么原因&#xff0c;只要你想退货&#xff0c;我都可以接受退款。不能退给上级供应商&#xff0c;我就自己留着&#xff0c;就是为了避免因为这个拒收而失去买家。不管是什么质量原因&a…...

电子电路中的各种接地(接地保护与GND)

前言多年以前&#xff0c;雷雨天气下&#xff0c;建筑会遭遇雷击&#xff0c;从而破坏建筑以及伤害建筑内的人&#xff0c;为了避免雷击的伤害&#xff0c;人们发明了避雷针&#xff0c;并将避雷针接地线&#xff0c;从而引导雷击产生的电流经过地线流入到地下。地线&#xff1…...

php实现农历公历日期的相互转换

农历&#xff08;Lunar calendar&#xff09;和公历&#xff08;Gregorian calendar&#xff09;是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的&#xff0c;而农历是基于月亮的运动来计算时间的。农历中的月份是根据月亮的相对位置来确定的&#xff0c;而公历…...

基于SpringBoot的房屋租赁管理系统的设计与实现

基于SpringBoot的房屋租赁管理系统的设计与实现 1 绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高&#xff0c;越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中&#xff0c;大家也面临着各种各样的问题&…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...