Java框架 —— Mybatis(面试)
什么是Mybatis?
Mybatis 是一款轻量级的持久层框架,它通过XML或注解方式将Java对象和数据库表进行映射,简化了JDBC的冗余代码,同时保留了开发者对SQL的完全控制权,与全自动框架(Hibernate)不同,Mybatis 更注重SQL和业务代码的解耦,适合需要精细优化SQL的场景
Mybatis 和 Hibernate 对比
核心区别:对SQL的控制权。 Hibernate是全自动框架,适合标准化业务和快速开发,通过对象操作,屏蔽了数据库细节,而Mybatis是半自动框架,强调SQL的可控性,适合需要精细优化SQL的场景
Mybatis 的优缺点
优点:
灵活性和SQL控制:直接编写和优化SQL,适合复杂查询
动态SQL支持:通过XML或注解提供动态SQL标签,灵活拼接SQL
解耦SQL和代码:SQL写在XML或注解中,便于管理
扩展性强:插件机制可轻松扩展功能,如分页插件(PageHelper)
缺点:
手动编写SQL的工作量大
数据库移植性差
缓存机制较弱
Mybatis 的运行原理
核心是一个全局配置文件和多个映射文件。Mybatis采用的是构建者模式,使用
SQLSessionFactoryBuilder
的build()
方法加载配置文件,生成SQLSessionFactory
对象,它采用的是工厂模式,通过openSession()
方法获取SQLSession
对象,它不像JDBC一样可以直接操作数据库,它本身是一个接口,内部提供了操作数据库数据的方法,通过调用执行器来操作mapperStatement
对象执行SQL语句,返回结果
代理模式规范
接口和映射文件必须同包同名
映射文件的命名空间必须是全限定接口名
接口中的方法名必须与映射文件中SQL的id相同
接口中方法参数只能有一个(使用@Param注解除外),类型必须与
parameterType
保持一致接口中方法的返回值类型必须与
ResultMap
或者ResultType
保持一致
通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗
Dao接口的工作原理是MyBatis通过动态代理为接口生成实现类。当调用接口方法时,代理对象会根据方法名和参数类型,在对应的XML映射文件中查找同名的SQL语句(通过namespace和id匹配),然后将参数绑定到SQL并执行。MyBatis的代理模式使得开发者只需关注接口定义和SQL映射,无需手动编写实现类,符合“约定优于配置”的设计理念。
不可以重载,虽然Java允许方法重载,但是Mybatis中要求方法名要与XML文件中的id唯一对应,如果两个重载方法对应同一个id的SQL,会因id重复导致冲突
分页
- RowBounds
先将数据查询到内存中,在内存中进行分页处理(数据量大时不建议使用)
- PageHelper
分页插件:导包 --- 在Mybatis全局配置文件中进行配置 --- 调用
如何获取自动生成的(主)键值
- 使用useGeneratedKeys和keyProperty属性
配置
<insert>
标签的useGeneratedKeys
和keyProperty
属性,useGeneratedKeys="true"表示启动主键生成策略,keyProperty则指定生成的主键值应该赋值给实体类的哪个属性
- 使用
<selectKey>
元素使用
元素,它允许在插入语句执行前后通过特定的SQL语句来获取主键值。这种方式更加灵活
Mybatis中动态SQL有什么用,执行原理是什么,有哪些动态SQL
Mybatis 通过一组XML标签实现灵活的条件拼接,能够根据参数动态生成安全、高效的SQL语句,解决了传统SQL拼接的维护困难和安全隐患,特别适用于多条件查询、批量操作等场景
<if test="条件">
:条件判断(可结合<where>
使用,去除多余的AND、OR)
<choose> <when> <otherwise>
:多条件选择
<foreach item="元素变量" collection="集合参数" open="开始标志" separator="分隔符" close="结束标志">
:遍历集合
<set>
:动态更新字段(可结合<if>
使用,去除结尾多余的,
)
<trim prefix="" prefixOverrides="">
:可代替where
或set
使用
多表查询
MyBatis处理多表查询主要依赖ResultMap的关联映射和动态SQL。对于固定关联关系(如一对一、一对多),可以通过
和 配置映射,结合JOIN查询提升性能。动态SQL则适合条件多变的场景,通过标签灵活拼接SQL。需要注意避免N+1问题,合理使用延迟加载和列别名。
Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复
在 MyBatis 中,不同 XML 映射文件的 id 是可以重复的,前提是它们的 namespace 不同。因为 MyBatis 最终通过 namespace.id 作为唯一标识来定位 SQL 语句。
动态代理机制:通过 namespace 绑定 Mapper 接口后,调用接口方法时,MyBatis 会将方法名映射为 id,再结合 namespace 找到对应的 SQL,因此跨文件的重复 id 不会影响这一过程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~