Mybatis⾯试题汇总2022
⼀、⾸先是⼀个优秀的持久层ORM框架,它对jdbc的操作数据库的过程进⾏封装,使得开发者只需要关注SQL本⾝。不需要花费精⼒去处理⼀些重复和繁琐的步骤。最后通过java对象和statement中的sql进⾏映射⽣成最终执⾏的sql语句。最后由mysql框架执⾏sql并将结果映射成java对象并返回。
ORM:对象关系映射,简单点说就是将数据库中的表和java中的对象建⽴映射关系,可以让我们操作对象来间接的操作数据库。
半ORM:在查询关联对象或关联集合对象时,需要⼿动编写sql来完成。
⼆、MyBatis编程步骤
创建SqlSessionFactory
通过SqlSessionFactory创建SqlSession
通过Mapper接⼝执⾏数据库操作(实际还是调⽤的SqlSession的)
mysql面试题大全调⽤sessionmit()提交事务
调⽤session.close关闭会话
三、MyBatis的⼯作原理
1.在DatasourceAutoConfiguration完成后,会去执⾏MybatisAutoConfiguration。该⾃动配置类会开启MybatisProperties类的初始化。会先读取MyBatis配置⽂件,⽤
加载映射⽂件。(SQL映射⽂件,其中配置了操作数据库的SQL语句)
构造会话⼯⼚:通过MyBatis的环境等配置信息构建会话⼯⼚SqlSessionFactory
创建会话对象:有会话⼯⼚创建SqlSession对象,该对象包括了执⾏SQL语句的所有⽅法
Executor执⾏器:根据SqlSession传递的参数动态的⽣成需要执⾏的SQL语句,同时负责查询缓存的维护
Mappedstatement对象:⽤于存储要映射的SQL语句的id、参数等信息
输⼊参数映射:参数类型可以为Map、List等集合类型也可以使⽤基本数据类型和POJO类型
输出结果映射:和输⼊类似。
四、MyBatis的优点
基于SQL语句编程,相当灵活。SQL写在XML中,解除sql与程序代码的耦合,便于统⼀管理。提供XML标签,⽀持编写动态SQL语句,并可重⽤
消除了 JDBC ⼤量冗余的代码,不需要⼿动开关连接;
很好的与各种数据库兼容
能够与 Spring 很好的集成;
提供映射标签,⽀持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,⽀持对象关系组件维护。
五、MyBatis框架的缺点
SQL 语句的编写⼯作量较⼤,尤其当字段多、关联表多时,对开发⼈员编写SQL 语句的功底有⼀定要求。
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
MyBatis与Hibernate有哪些不同
MyBatis是⼀个半ORM框架,需要⾃⼰编写sql语句,灵活性⾼,但是需要⾃定义多套sql映射⽂件,⼯作量⼤
Hibernate数据库⽆关性好,节省代码,提⾼效率
六、#{}和${}的区别
#{}:是预编译处理,会把sql中的#{}替换为?,调⽤PreoaredStatement的set⽅法来赋值
{}替换为变量的值。
使⽤#{}可以有效的防⽌SQL注⼊,提⾼系统的安全性 。
七、当实体类的属性名和表中的字段名不⼀致如何处理
通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名⼀致。
通过类映射字段名和实体类属性名的⼀⼀对应的关系
熟练掌握htmlcss⼋、模糊查询like怎么编写
在Java代码中添加sql通配符
unity3d就业前景2021
网站制作手机版中文版下载在sql语句中拼接通配符(但是会引起sql注⼊问题)
通常⼀个Xml映射⽂件,都会写⼀个Dao接⼝与之对应。那么Dao接⼝的⼯作原理是什么。
Dao接⼝就是Mapper接⼝。
九、接⼝的全限定名就是映射⽂件的namespace的值
接⼝的⽅法名就是映射⽂件中Mapper的Statement的id值
接⼝⽅法内的参数就是传递给sql的参数
Mapper接⼝是没有实现类的,当调⽤接⼝⽅法的时候,接⼝的全限定名+⽅法名拼接字符串作为key值,可以唯⼀定位⼀个MapperStatement。在MyBatis中,每⼀个、、、标签都会被解析为⼀个MapperStatement对象
⼗、Dao接⼝的⽅法,参数不同时,⽅法能重载吗
Mapper接⼝⾥的⽅法,是不能重载的,因为使⽤全限定名+⽅法名的保存和寻策略。所以不能重载。
⼗⼀、Mapper接⼝的⼯作原理是JDK动态代理,MyBatis运⾏时会使⽤JDK动态代理为Mapper接⼝⽣成代理对象proxy,代理对象会拦截接⼝⽅法,转⽽执⾏MapperStatement所代表的sql,然后将sql执⾏结果返回。
⼗⼆、MyBatis是如何进⾏分页的以及分页插件的原理是什么
MyBatis使⽤RowBounds对象进⾏分页,它是针对ResultSet结果集执⾏的内存分页,⽽⾮物理分页。可以在sql内直接书写带有物理分页的参数来完成物理的分页功能,或者使⽤分页插件来完成物理分页
分页插件的基本原理就是使⽤MyBatis提供的插件接⼝,实现⾃定义插件,在插件的拦截⽅法内拦截待执⾏的sql,然后重写sql,根据dialect,添加对应的物理分页语句和物理分页参数。
⼗三、Mybati是如何将sql执⾏机构封装为对象并返回的?有哪些映射形式
使⽤标签,逐⼀定义数据库列名和对象属性名之间的映射关系。
使⽤sql列的别名功能,将列别名书写为对象属性名
有了列名和属性名的映射关系后,MyBatis通过反射创建对象,同时使⽤反射给对象的属性逐⼀赋值并返回,那些不到映射关系的属性,是⽆法完成赋值的
⼗四、如何进⾏批量插⼊
⼗五、如何获取⾃动⽣成的主键值
使⽤JDBC内置⽅法
插⼊后查询获取
插⼊前查询获取主键
⼗六、如何在mapper中传递多个参数
Dao层函数
delphi最稳定版本
使⽤@param注解
多个参数封装成map
⼗七、MyBatis动态sql
MyBatis动态sql可以在Xml映射⽂件内,以标签的形式编写动态sql,执⾏原理是根据表达式的值完成逻辑判断并动态拼接sql功能
MyBatis提供了九种sql标签
trim
where
set
foreach
if
choose
when
otherwise
bind
数据库系统概论考研重点⼗⼋、MyBatis的Xml映射⽂件中,不同的Xml⽂件id是否可以重复
如果配置了namespace那么id可以重复,要是没有配置namespace,id就不可以重复
⼗九、MyBatis实现⼀对⼀有⼏种⽅式
联合查询
⼏个表联合查询,只查询⼀次,通过配置collection节点
嵌套查询
先查⼀个表,再根据查出的id去另外⼀个表⾥查询数据,也是通过配置collection,但是另外⼀个表的查询通过select节点配置
⼆⼗、MyBatis是否⽀持延迟加载,以及如何实现
Mybatis仅⽀持association关联对象和collection关联集合对象的延迟加载。可以通过配置lazyLoadingEnabled来进⾏配置。
原理
使⽤ CGLIB 创建⽬标对象的代理对象,当调⽤⽬标⽅法时,进⼊⽅法,⽐如调⽤ a.getB().get
Name(), invoke()⽅法发现a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调⽤ a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()⽅法的调⽤。这就是延迟加载的基本原理。
⼆⼗⼀、MyBatis的缓存
⼀级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作⽤域为Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开⼀级缓存。
⼆级缓存与⼀级缓存其机制相同,默认也是采⽤ PerpetualCache,HashMap存储,不同在于其存储作⽤域为 Mapper(Namespace),并且可⾃定义存储源,如 Ehcache。默认不打开⼆级缓存,要开启⼆级缓存,使⽤⼆级缓存属性类需要实现 Serializable 序列化接⼝(可⽤来保存对象的状态),可在它的映射⽂件中配置 ;
缓存更新
进⾏增删改
调⽤清除⽅法
设置清除属性
⼆⼗⼆、MyBatis的接⼝绑定,以及实现⽅式
接⼝绑定:就是在MyBatis中任意定义接⼝,然后把接⼝⾥⾯的⽅法和SQL语句进⾏绑定,我们在使⽤的时候直接调⽤接⼝⽅法即可
实现⽅式
通过注解绑定
通过xml⾥⾯写sql语句来绑定,需要指定xml中namespace必须为接⼝的全路径名。
Mybatis的mapper接⼝调⽤时有哪些要求
Mapper接⼝的⽅法名和l中sql的id相同
Mapper 接⼝⽅法的输⼊参数类型和 l 中定义的每个 sql 的parameterType 的类型相同
Mapper 接⼝⽅法的输出参数类型和 l 中定义的每个 sql 的resultType 的类型相同
⼆⼗三、Mybatis 的插件运⾏原理,以及如何编写⼀个插件。
Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这 4 种接⼝的插件,Mybatis 使⽤JDK 的动态代理,为需要拦截的接⼝⽣成代理对象以实现接⼝⽅法拦截功能,每当执⾏这 4 种接⼝对象的⽅法时,就会进⼊拦截⽅法,具体就是 InvocationHandler 的 invoke()⽅法,当然,只会拦截那些你指定需要拦截的⽅法。
编写插件:实现 Mybatis 的 Interceptor 接⼝并复写 intercept()⽅法,然后在给插件编写注解,指定要拦截哪⼀个接⼝的哪些⽅法即可,记住,别忘了在配置⽂件中配置你编写的插件。
⼆⼗四、预编译
定义
SQL预编译是指数据库驱动在发送SQL语句和参数给DBMS之前对SQL语句进⾏编译,这样DBMS执⾏SQL时,就不需要重现编译
预编译作⽤
可以优化SQL的执⾏。预编译后的⼤多数SQL可以直接运⾏,同时预编译语句对象可以重复利⽤。还可以防⽌SQL注⼊
⼆⼗五、MyBatis有哪些Executor执⾏器,他们之间的区别是什么
有三种基本的Executor执⾏器:SimpleExecutor、ReuseExxecutor、BatchExecutor
SimpleExecutor
每执⾏⼀次update或者select就开启⼀个Statement对象,⽤完就⽴即关闭
ReuseRxecutor
执⾏update或者select,以sql为key查Statement对象。为了重复使⽤Statement对象
BatchExecutor
执⾏update,将所有sql都添加到批处理中,等待同⼀执⾏。其魂村了多个Statement对象。
⼆⼗六、当实体类中的属性名和表中的字段名不⼀样,怎么办
通过在查询的SQL语句中定义字段名的别名,让字段名和实体类的属性名⼀致
通过resultMap来映射字段名和实体类属性名的⼀⼀对应的关系
ResultType和ResultMap的区别
⾸先MyBatis在查询进⾏select映射的时候,返回类型可以⽤resultType也可以⽤resultMap,其中resultType是直接表⽰返回类型的,⽽resultMap则是对外部ResultMap的引⽤。这两不能同时存在
在MyBatis进⾏查询映射的时候,其实查询出来的每⼀个属性都是放在⼀个对应的Map中,键是属性名、值是对应的值。
⼆⼗七、Mybatis的SqlSession下的四⼤对象
(1)Executor
调度执⾏StatementHandler、ParmmeterHandler、ResultHandler执⾏相应的SQL语句
(2)StatementHandler
使⽤数据库中Statement(PrepareStatement)执⾏操作,即底层是封装好了的prepareStatement;
(3)ParammeterHandler
处理SQL语句的参数
(4)ResultHandler
结果集ResultSet封装处理返回
⼆⼗⼋、Executor的分类
(1)SimpleExecutor 默认的,每次执⾏sql时,都会创建⼀个新的statement
(2)ReuseExecutor ⽤于预编译statement的
(3)BatchExecutor ⽤于批处理
PS:部分直接搬运来的,⽇后会加上⾃⼰的见解(等到新⼯作,哭哭)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。