MyBatis细节

1.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第 1种:++通过在查询的sql语句中定义字段名的别名++,让字段名的别名和实体类的属性名一致。

第2种:++通过<ResultMap>来映射字段名和实体类属性名的一一对应的关系++。

2.通常一个Xml映射文件,都会写一个Dao接口与之对应, 请问,这个Dao接口的工作原理是什么?Dao接口里的方法, 参数不同时,方法能重载吗?

Dao 接口即 Mapper 接口。 ++接口的全限名,++ 就是映射文件中的 namespace的值; ++接口的方法名++ ,就是映射文件中Mapper的Statement的 id值;++接口方法内的参数++,就是传递给sql的参数。

Mapper 接口里的方法,是不能重载的,因为是使用 ++全限名+方法名++ 的保存和寻找策略。++Mapper 接口的工作原理是 JDK动态代理++,

Mybatis++运行时会使用 JDK 动态代理为Mapper 接口生成代理对象++ proxy,++代理对象会拦截接口方法,转而执行MapperStatement 所代表的 sql,然后将 sql 执行结果返回++

3.Mybatis是如何进行分页的?分页插件的原理是什么?

++Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。++

分页插件的基本原理是++使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。++

4.Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?

****第一种是使用标签 ,逐一定义数据库列名和对象属性名之间的映 射关系。

****第二种是使用sql列的别名功能 ,将列的别名书写为对象属性名

5.如何获取自动生成的(主)键值?

insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。 如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

6.Mybatis 动态sql有什么用?执行原理?有哪些动态sql?

Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能

7.MyBatis实现一对一有几种方式?具体怎么操作的?

****有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成;

****嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association 配置,但另外一个表的查询通过 select 属性配置。

8.MyBatis实现一对多有几种方式,怎么操作的?

有联合查询和嵌套查询。联合查询 ++是几个表联合查询,只查询一次,通过在 resultMap 里面的 collection 节点配置一对多的类就可以完成;++

嵌套查询 是++先查 一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过 配置collection,但另外一个表的查询通过 select 节点配置++

9.Mybatis的一级、二级缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源, 如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要 实现Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将 被 clear。

10.简述Mybatis的插件运行原理,以及如何编写一个插件

****Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、 StatementHandler、Executor 这 4 种接口的插件,Mybatis 使用 JDK 的动态代 理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler 的 invoke() 方法,当然,只会拦截那些你指定需要拦截的方法。

****编写插件:实现Mybatis 的 Interceptor 接口并复写 intercept()方法,然后在给 插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文 件中配置你编写的插件。

相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔2 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说7 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json