一、MyBatis基础概念
- 什么是MyBatis?
- MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
- MyBatis的应用场景有哪些?
- MyBatis特别适合那些想要灵活控制数据库查询,又不想写太多重复代码的人。它常用于需要灵活编写复杂SQL、避免ORM生成低效查询、对已有数据库结构进行操作、需要手动优化SQL查询性能以及需要精确控制SQL语句和数据库操作的应用。
- MyBatis有哪些优点?
- 灵活性强:允许开发人员编写自定义SQL语句,能够根据项目需求进行灵活配置和扩展。
- 可读性好:使用简洁的XML或注解配置方式,可以清晰地表达SQL语句和数据映射关系。
- 性能高:提供了高效的缓存机制,能够有效地减少数据库操作的次数,并支持批量操作和分页查询等功能。
- 易于集成:可以与多种数据库和Web框架无缝集成,能够适应不同的应用场景。
- MyBatis有哪些缺点?
- 学习成本较高:相比于其他ORM框架,MyBatis需要开发人员熟悉SQL语句的编写和调优。
- 配置较为繁琐:MyBatis的配置文件较多,需要开发人员仔细配置,否则容易出现错误。
- SQL语句调试困难:MyBatis将SQL语句和Java代码分离,当SQL语句出现问题时,调试起来相对困难。
- 不适合小型项目:对于小型项目而言,MyBatis的优势可能不够明显,反而会增加项目的开发成本和复杂度。
二、MyBatis核心组件与工作原理
- MyBatis有哪些核心组件?
- SqlSessionFactory:创建和管理SqlSession对象的工厂。
- SqlSession:执行SQL语句的接口,管理数据库会话。
- Executor:负责执行SQL语句,管理缓存和事务。
- Mapper接口:映射SQL语句与Java对象的方法接口。
- Configuration:全局配置类,包含MyBatis的所有配置信息。
- MyBatis的工作原理是什么?
- MyBatis的工作原理主要包括以下几个步骤:读取配置文件、创建SqlSessionFactory、获取SqlSession、调用Mapper接口执行SQL语句、处理结果并返回。
- 为什么Mapper接口不需要实现类?
- MyBatis使用代理模式(动态代理)来为Mapper接口生成实现类,处理SQL语句的执行,避免手动编写实现代码。
三、MyBatis高级特性
- MyBatis如何进行分页?分页插件的原理是什么?
- MyBatis可以使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。也可以在SQL内直接书写带有物理分页的参数来完成物理分页功能,或者使用分页插件来完成物理分页。分页插件的基本原理是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,然后重写SQL,根据dialect方言,添加对应的分页语句。
- MyBatis的一级、二级缓存是什么?
- 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。
- 二级缓存:与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口。
- MyBatis如何将SQL执行结果封装为目标对象并返回?
- MyBatis可以通过标签逐一定义数据库列名和对象属性名之间的映射关系,或者使用SQL列的别名功能将列的别名书写为对象属性名。有了列名与属性名的映射关系后,MyBatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回。
- MyBatis支持动态SQL吗?有哪些动态SQL?
- MyBatis支持动态SQL,可以在XML映射文件内以标签的形式编写动态SQL。MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind。这些标签可以根据表达式的值完成逻辑判断并动态拼接SQL的功能。
- MyBatis能执行一对一、一对多的关联查询吗?
- MyBatis能执行一对一、一对多的关联查询。可以通过resultMap标签来定义Java对象和数据库表之间的映射关系,包括一对一和一对多的关联关系。
- MyBatis是否支持延迟加载?
- MyBatis支持延迟加载。延迟加载是一种在需要时才加载数据的技术,可以提高应用程序的性能。在MyBatis中,可以通过配置来实现延迟加载。
四、MyBatis常见问题与解决方案
- #{}和${}的区别是什么?
- #{}使用预编译的方式来处理SQL语句中的参数,将传入的参数值以安全的方式替换掉占位符。这种方式可以有效地防止SQL注入等安全问题。
- 则是直接将参数值替换到SQL语句中。这种方式的好处是可以直接拼接字符串,但也带来了一些安全问题,如SQL注入。因此,在使用{}时需要开发人员自行保证参数的合法性。
- 在mapper中如何传递多个参数?
- 在MyBatis的mapper中传递多个参数时,可以使用@Param注解来标注参数名称,以便在XML映射文件中引用。另外,也可以使用对象来封装多个参数,然后在XML映射文件中通过对象的属性来引用参数。
- 实体类属性名和表中字段名不一样怎么办?
- 当实体类属性名和表中字段名不一样时,可以在MyBatis的XML映射文件中使用resultMap标签来定义Java对象和数据库表之间的映射关系。通过指定列名和属性名之间的对应关系,可以实现字段名和属性名之间的映射。
- MyBatis的XML映射文件中,不同的XML映射文件id是否可以重复?
- 在MyBatis的XML映射文件中,如果配置了namespace,那么不同的XML映射文件中的id可以重复。因为namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,因为namespace不同,namespace+id自然也就不同。