Bootstrap

Mybatis 面试题

1.介绍MyBatis的工作原理。
MyBatis是一个半ORM框架,通过XML或注解将SQL语句与Java对象映射。工作原理如下:
加载配置文件(mybatis-config.xml)和映射文件(Mapper.xml)。
解析配置文件和映射文件,生成SqlSessionFactory。
通过SqlSessionFactory创建SqlSession。
通过SqlSession执行SQL语句,返回结果。

2.MyBatis中的缓存机制是怎样的?
MyBatis支持一级缓存和二级缓存。
一级缓存:作用域为单个SqlSession,默认开启。
二级缓存:作用域为Mapper,需要手动配置。

3.如何实现MyBatis缓存的扩展?
通过实现Cache接口,自定义缓存逻辑。
public class MyCache implements Cache {
    private String id;
    private Map<Object, Object> cache = new HashMap<>();

    @Override
    public String getId() {
        return this.id;
    }

    @Override
    public void putObject(Object key, Object value) {
        cache.put(key, value);
    }

    @Override
    public Object getObject(Object key) {
        return cache.get(key);
    }

    @Override
    public Object removeObject(Object key) {
        return cache.remove(key);
    }

    @Override
    public void clear() {
        cache.clear();
    }

    @Override
    public int getSize() {
        return cache.size();
    }
}

4.MyBatis使用了多种设计模式:
工厂模式:SqlSessionFactory。
代理模式:Mapper接口的动态代理。
建造者模式:SqlSession的构建。
单例模式:SqlSessionFactory。

5.谈谈你对SqlSessionFactory的理解。
SqlSessionFactory是MyBatis的核心组件,用于创建SqlSession。它负责加载配置文件和映射文件,并生成SqlSession。

6.谈谈你对SqlSession的理解。
SqlSession是MyBatis的会话对象,用于执行SQL语句、管理事务和获取Mapper接口。

7.谈谈你对MyBatis的理解。
MyBatis是一个半ORM框架,通过XML或注解将SQL语句与Java对象映射。它提供了灵活的SQL执行和结果映射功能。

8.谈谈你对MyBatis中分页的理解。
MyBatis支持分页插件(如PageHelper),通过拦截SqlSession的执行方法,动态修改SQL语句实现分页。

9.在Spring中是如何解决DefaultSqlSession的数据安全问题的?
Spring通过SqlSessionTemplate或SqlSessionInterceptor,确保每个线程使用独立的SqlSession,避免数据安全问题。

10.谈谈你对MyBatis中延迟加载的理解。
延迟加载是指在需要时才加载关联对象。MyBatis通过lazyLoadingEnabled配置延迟加载。

11.谈谈你对MyBatis中拦截器的理解。
拦截器用于拦截SqlSession的执行方法,实现日志记录、分页等功能。

13.谈谈MyBatis中Mapper接口的使用规则。
Mapper接口的方法名必须与Mapper.xml中的SQL语句ID一致。

14.方法的参数和返回值类型必须与SQL语句一致。

15.谈谈你对MyBatis中获取自增主键的理解。
MyBatis通过useGeneratedKeys属性获取自增主键。
不同的Mapper映射文件中id是否可以相同?
不可以,id在同一个namespace下必须唯一。

16.谈谈你对MyBatis架构设计的理解。
MyBatis的架构分为核心层(SqlSessionFactory、SqlSession)和映射层(Mapper接口和Mapper.xml)。

17.谈谈你对传统JDBC开发和MyBatis编程的区别。
传统JDBC:需要手动编写SQL语句和结果集处理代码。
MyBatis:通过XML或注解映射SQL语句,简化了开发过程。
谈谈MyBatis的编程步骤。
加载配置文件。
创建SqlSessionFactory。
创建SqlSession。
执行SQL语句。
关闭SqlSession。

18.当属性名和字段名称不一致时怎么办?
使用resultMap或@Results注解映射属性名和字段名。

19.谈谈你对MyBatis中Executor的理解。
Executor是MyBatis的执行器,负责执行SQL语句。有SimpleExecutor、ReuseExecutor和BatchExecutor。

20.如何调整MyBatis中执行器的类型?
通过配置文件或注解设置executorType。

21.MyBatis中如何实现多个参数传递?
使用@Param注解标记参数。

22.谈谈你对MyBatis中日志模块的理解。
MyBatis支持多种日志框架(如Log4j、SLF4J),通过配置文件设置日志级别。

23.谈谈你对MyBatis中记录SQL日志的原理理解。
MyBatis通过日志框架记录SQL语句的执行信息,包括SQL语句和参数。

24.谈谈你对MyBatis中数据源模块的设计理解。
数据源模块负责管理数据库连接,支持多种数据源实现(如PooledDataSource)。

25.谈谈你对MyBatis中事务模块的设计理解。
事务模块负责管理事务的开始、提交和回滚,支持多种事务管理器(如JDBC、MANAGED)。

26.谈谈你对Mapper接口的设计理解。
Mapper接口定义了数据库操作方法,方法名与SQL语句ID一致。

27.谈谈你对MyBatis中反射模块的理解。
MyBatis通过反射机制动态调用Mapper接口方法。

28.谈谈你对MyBatis中类型转换模块的理解。
类型转换模块用于将数据库字段类型转换为Java类型,支持自定义类型转换器。

29.谈谈MyBatis和Spring整合的原理。
Spring通过SqlSessionFactoryBean加载MyBatis配置文件,创建SqlSessionFactory。
使用MapperScannerConfigurer扫描Mapper接口,并注册为Spring Bean。


30. MyBatis中的分页的理解
MyBatis本身不直接支持分页功能,但可以通过以下方式实现分页:
物理分页:通过SQL语句的LIMIT(MySQL)或ROWNUM(Oracle)等语法实现分页。这种方式效率高,但需要针对不同数据库编写不同的分页SQL。
逻辑分页:在内存中对查询结果进行分页处理。这种方式对数据库压力小,但可能会导致内存占用过高。
分页插件:如PageHelper,它通过拦截SQL执行,动态修改SQL语句实现分页,对开发者透明,且兼容性好。

31. 在Spring中是如何解决DefaultSqlSession的数据安全问题的
在Spring中,MyBatis的SqlSession是通过SqlSessionTemplate进行管理的。SqlSessionTemplate内部使用了ThreadLocal来存储SqlSession实例,确保每个线程都有独立的SqlSession,从而避免了多线程环境下的数据安全问题。此外,Spring还通过事务管理器(如DataSourceTransactionManager)来管理事务,确保事务的隔离性和一致性。

32. MyBatis中的延迟加载的理解
延迟加载(Lazy Loading)是指在需要时才加载关联对象。MyBatis支持延迟加载,可以在配置文件中设置lazyLoadingEnabled=true。延迟加载的优点是可以减少初始加载的性能开销,但可能会导致N+1查询问题。为了避免N+1查询,可以通过fetchType=EAGER强制加载关联对象。

33. MyBatis中的拦截器的理解
MyBatis的拦截器(Interceptor)是基于动态代理的AOP机制。拦截器可以拦截Invocation对象,从而对SQL执行过程进行扩展,例如日志记录、SQL性能监控、分页处理等。拦截器需要实现Interceptor接口,并在MyBatis配置文件中注册。

34. MyBatis中的Mapper接口的使用规则
接口方法与SQL语句一一对应:Mapper接口中的方法名需要与Mapper XML文件中的<select>、<insert>等标签的id属性一致。
参数类型匹配:方法的参数类型需要与SQL语句中的参数占位符匹配。
返回类型匹配:方法的返回类型需要与SQL查询结果的映射类型一致。
注解方式:可以通过注解(如@Select、@Insert)直接在接口方法上编写SQL语句,无需XML文件。

35. 谈谈MyBatis中如何获取自增的主键
在MyBatis中,可以通过以下方式获取自增主键:
使用useGeneratedKeys属性:在<insert>标签中设置useGeneratedKeys="true",并通过keyProperty指定主字段键。
使用selectKey标签:在<insert>标签中嵌套<selectKey>标签,通过执行查询语句获取主键值。

8. 不同的Mapper映射文件中id是否可以相同
在不同的Mapper XML文件中,<select>、<insert>等标签的id可以相同,因为MyBatis会根据Mapper接口的全限定名来区分不同的SQL语句。但如果在同一个Mapper XML文件中,id必须唯一。

9. MyBatis的架构设计的理解
MyBatis的架构设计可以分为以下几个层次:
数据源(DataSource):负责数据库连接的管理。
事务管理(Transaction):负责事务的提交、回滚等操作。
SQL会话(SqlSession):提供与数据库交互的接口。
执行器(Executor):负责执行SQL语句。
映射器(Mapper):定义了SQL语句和Java对象之间的映射关系。
配置文件(Configuration):存储了MyBatis的全局配置信息。

10. MyBatis的编程步骤是怎么样的
配置数据源:在配置文件中配置数据库连接信息。
编写Mapper接口和Mapper XML文件:定义SQL语句和Java对象的映射关系。
创建SqlSessionFactory:通过配置文件创建SqlSessionFactory。
获取SqlSession:通过SqlSessionFactory获取SqlSession。
执行SQL操作:通过SqlSession调用Mapper接口的方法执行SQL语句。
关闭资源:关闭SqlSession和SqlSessionFactory。

11. MyBatis中的Executor的理解
Executor是MyBatis的核心组件之一,负责执行SQL语句。MyBatis提供了三种类型的Executor:
SimpleExecutor:每次执行SQL语句都会开启一个新的数据库连接。
ReuseExecutor:复用数据库连接,但不复用PreparedStatement。
BatchExecutor:批量执行SQL语句,减少数据库交互次数。

12. 如何调整MyBatis中的执行器的类型
可以通过配置文件调整Executor的类型:
复制
<settings>
    <setting name="defaultExecutorType" value="REUSE"/>
</settings>
也可以在代码中动态设置:
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.REUSE);

13. MyBatis中的数据源模块的设计理解
MyBatis的数据源模块负责管理数据库连接。它支持多种数据源类型,如UNPOOLED(每次请求都创建新连接)、POOLED(使用连接池管理连接)和JNDI(通过JNDI获取数据源)。连接池可以提高数据库连接的复用率,减少连接创建和销毁的开销。

36. MyBatis中的事务模块的设计理解
MyBatis的事务模块负责管理事务的提交和回滚。它支持多种事务管理方式:
JDBC事务:直接使用JDBC的事务管理。
MANAGED事务:由容器(如Spring)管理事务。
事务模块通过Transaction接口和TransactionFactory进行事务的创建和管理。

37. Mapper接口的设计理解
Mapper接口是MyBatis的核心组件之一,它定义了数据库操作的抽象接口。Mapper接口的方法名与Mapper XML文件中的SQL语句id对应,方法的参数和返回值类型与SQL语句的参数和结果映射一致。Mapper接口的设计需要遵循单一职责原则,每个接口只负责一个模块的数据库操作。

38. MyBatis中的反射模块的理解
MyBatis的反射模块用于操作Java对象的属性和方法。它通过MetaObject和MetaClass类封装了反射操作,提供了对对象属性的读写、方法调用等功能。反射模块使得MyBatis能够动态地映射SQL结果到Java对象。

39. MyBatis中的类型转换模块的理解
MyBatis的类型转换模块负责将数据库中的数据类型转换为Java对象的类型。它通过TypeHandler接口实现类型转换。MyBatis内置了许多默认的TypeHandler,也可以通过自定义TypeHandler来处理特殊的类型转换需求。

;