Java面试——MyBatis相关知识

news2024/12/26 14:47:53

目录

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框架更为复杂,也更加严谨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python实战案例】Python3网络爬虫:“可惜你不看火影,也不明白这个视频的分量......”m3u8视频下载,那些事儿~

前言 哈喽&#xff01;上午好嘞&#xff0c;各位小可爱们&#xff01;有没有等着急了呀~ 由于最近一直在学习新的内容&#xff0c;所以耽搁了一下下&#xff0c;抱歉.jpg 双手合十。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移…

蓝海创意云获苏州电信2022年度“云业务优秀合作方”表彰

2月8日&#xff0c;中国电信苏州分公司召开产业数字化生态合作峰会&#xff0c;围绕“力量源于团结 奋斗创造奇迹”主题&#xff0c;凝聚合作伙伴合力&#xff0c;构建共生共赢的产业生态&#xff0c;蓝海创意云作为合作企业代表应邀出席峰会。会上&#xff0c;蓝海创意云荣获峰…

在阿里干了8年测试的表哥放假回来了,聊完之后大彻大悟

表哥是阿里某个项目组的测试开发&#xff0c;今年过年提前半个月放假回来了&#xff0c;一见面就给我们几个弟弟妹妹一人拿了部iPhone13pm。这一出手属实是阔绰&#xff0c;想想他的工作单位&#xff0c;也许对于他来说三四万也就是半个月工资而已。想想我那个小公司&#xff0…

第七节 平台设备驱动

在之前的字符设备程序中驱动程序&#xff0c;我们只要调用open() 函数打开了相应的设备文件&#xff0c;就可以使用read()/write() 函数&#xff0c;通过file_operations 这个文件操作接口来进行硬件的控制。这种驱动开发方式简单直观&#xff0c;但是从软件设计的角度看&#…

【Linux】操作系统进程概念

文章目录1. 冯诺依曼体系结构2. 操作系统3. 进程进程的基本概念查看进程和杀死进程父进程和子进程通过系统调用创建子进程1. 冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯诺依曼提出了计算…

适配器模式(Adapter Pattern)

1.什么是适配器模式&#xff1f; 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 这种模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接…

浅谈现代GNSS模拟中的软件定义架构

随着技术的迭代更新&#xff0c;GPS/GNSS模拟技术也在不断发展进步。在过去&#xff0c;想要进行GNSS仿真基本上只有一种选择&#xff1a;使用固定式或分配式的硬件进行模拟。而如今&#xff0c;带来颠覆性创新的新型软件定义架构正在迅速取代传统的定制架构&#xff0c;这种独…

7款应用最广泛的 Linux 桌面环境

多样性应该是 Linux 最好的特性之一&#xff0c;用户可以不断尝试各种喜欢和新鲜玩法与花样&#xff0c;并从中找出最适合自己的应用。无论你是 Linux 新人还是老鸟&#xff0c;层出不穷的应用和桌面环境可能都会让我们应接不暇&#xff0c;特别是尝试不同的 Linux 桌面环境&am…

基于微信小程序的国产动漫论坛小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

05- 线性回归算法 (LinearRegression) (机器学习)

线性回归算法(LinearRegression)就是假定一个数据集合预测值与实际值存在一定的误差, 然后假定所有的这些误差值符合正太分布, 通过方程求这个正太分布的最小均值和方差来还原原数据集合的斜率和截距。当误差值无限接近于0时, 预测值与实际值一致, 就变成了求误差的极小值。 fr…

你的 TypeScript 还只是用来声明 string、number……的吗?

深入TS类型 联合类型 使用|操作符将变量可能出现的数值类型连接起来&#xff0c;就是联合类型 function css(ele: Element, attr: string, value: string | number) {// value参数的类型只能是string或者number// ...... } 交叉类型 使用&操作符将多种类型合并在一起&a…

JavaSE · 常量介绍 · 变量类型转换 · 理解数值提升 · int 和 Stirng 之间的相互转换

书接上回 Java 变量介绍 我们继续学习以下内容. 四、常量字面值常量final 关键字修饰的常量五、理解类型转换int 和 long/double 相互赋值int 和 boolean 相互赋值int 字面值常量给 byte 赋值强制类型转换类型转换小结六、理解数值提升int 和 long 混合运算byte 和 byte 的运算…

你还在用CSS旧时代布局的王者:浮动float 吗?

写在前面 随着flex、grid等布局的兼容性越来越好&#xff0c;float几乎已经在大众的视野消失了&#xff0c;曾经默认的小妖精终究成为了时代的眼泪。 作为前端开发者&#xff0c;你经历过float的时代吗&#xff1f;还在用float吗&#xff1f; 一、什么是浮动&#xff1f; 首…

ccc-台大林轩田机器学习基石-hw0

文章目录1 Probability and Statistics2 Linear Algebra3.Calculus一览图hw0题目链接1 Probability and Statistics 不妨假设C(n,K)C(n,K)&#xff0c;0≤K≤NC(n, K)C(n, K) &#xff0c;0 \le K\le NC(n,K)C(n,K)&#xff0c;0≤K≤N成立&#xff0c;只需证明C(n1,K)(n1)!K!(…

list类的使用和模拟实现

目录 一、list类的介绍 二、list的使用 1.构造、拷贝构造函数和迭代器 2.数据的增删查改 三、list的部分接口实现 1.节点定义 2.list类的组织 四、list的迭代器 1.迭代器的设计思路 2.const迭代器 3.->操作符的重载 4.反向迭代器 一、list类的介绍 list就是C库…

Elasticsearch基本概念和索引原理

一、Elasticsearch是什么&#xff1f; Elasticsearch是一个基于文档的NoSQL数据库&#xff0c;是一个分布式、RESTful风格的搜索和数据分析引擎&#xff0c;同时也是Elastic Stack的核心&#xff0c;集中存储数据。Elasticsearch、Logstash、Kibana经常被用作日志分析系统&…

[CCS 2022] 皇帝没有衣服:用于网络安全的AI/ML

AI/ML for Network Security: The Emperor has no ClothesCCS 22: Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Securityhttps://dl.acm.org/doi/abs/10.1145/3548606.3560609摘要最近的一些研究工作提出了基于机器学习&#xff08;ML&…

工业废水的种类及其处理工艺有哪些?特定目标污染物的深度去除

随着工业的迅速发展&#xff0c;工业废水的种类和数量随之增加&#xff0c;对水体的污染也日趋严重&#xff0c;威胁人类的健康和正常生活。所以工业废水的处理对于环保至关重要。 保护生态环境、更好地做好工业废水的处理&#xff0c;了解工业废水及其种类与处理非常必要。 工…

MySQL 删除数据库

使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库&#xff0c;所以我们这边使用 root 用户登录&#xff0c;root 用户拥有最高权限。 当数据库不再使用时应该将其删除&#xff0c;以确保数据库存储空间中存放的是有效数据。删除数据…

【Hello Linux】 Linux基础命令

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux基础命令ls指令lsls -als -dls -ils -sls -lls -nls -Fls -rls -tls -Rls -1总结思维导图pwd指令whoami指令…