考研mybatis面试题
时间: 2023-05-27 13:07:36 浏览: 144
1. MyBatis是什么?有什么优点?
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis可以通过XML或注解方式进行配置。
MyBatis的优点包括:
- 简单易学:MyBatis的API非常简单,易于上手。
- 灵活性高:MyBatis可以灵活定制SQL,支持存储过程和高级映射。
- SQL和Java代码分离:MyBatis使用XML或注解方式进行SQL配置,使得Java代码和SQL代码分离,易于维护。
- 缓存机制:MyBatis支持一级缓存和二级缓存,提高了查询效率。
- 映射灵活:MyBatis支持多种映射方式,包括自动映射和手动映射。
2. MyBatis的工作流程是什么?
MyBatis的工作流程如下:
- 首先,应用程序通过MyBatis API请求Mapper接口中的方法。
- 然后,MyBatis根据Mapper接口中的方法名和参数信息生成对应的SQL语句。
- 接着,MyBatis通过JDBC执行SQL语句,并将结果集转换为Java对象。
- 最后,MyBatis返回查询结果给应用程序。
3. MyBatis的一级缓存和二级缓存是什么?
MyBatis的缓存机制分为一级缓存和二级缓存。
- 一级缓存:MyBatis的一级缓存是在SqlSession对象中的缓存。当SqlSession对象被关闭之前,所有查询的结果都会被存储在这个缓存中。一级缓存的作用域是SqlSession级别的,同一个SqlSession中相同的查询语句只会执行一次,并且将结果缓存到一级缓存中,下次执行相同的查询语句时就可以直接从缓存中获取结果。
- 二级缓存:MyBatis的二级缓存是在Mapper命名空间级别的缓存。当SqlSession关闭时,SqlSession中的缓存将被清空,但是Mapper命名空间级别的缓存会被存储在一个全局的缓存中,多个SqlSession可以共享这个缓存。如果开启了二级缓存,当查询同一条SQL语句时,MyBatis会先从二级缓存中查找,如果缓存中存在,则直接返回结果,否则才会去查询数据库。
4. MyBatis中的动态SQL是什么?有哪些动态SQL标签?
MyBatis中的动态SQL是指在SQL语句中根据不同的条件动态拼接SQL语句的技术。MyBatis中有以下几种动态SQL标签:
- if:判断条件为true时执行。
- choose:类似于Java中的switch语句,根据条件匹配执行。
- when:choose标签下的子标签,表示匹配的条件。
- otherwise:choose标签下的子标签,表示没有匹配的条件。
- trim:去掉SQL语句中的一部分。
- where:添加WHERE子句。
- set:添加SET子句。
- foreach:遍历集合并执行SQL语句。
5. MyBatis中的ResultMap是什么?
ResultMap是MyBatis中用来映射查询结果集的标签。ResultMap标签定义了如何将结果集映射到Java对象中。MyBatis中的ResultMap可以通过XML或注解方式进行配置。ResultMap标签包含以下元素:
- id:ResultMap的唯一标识。
- type:映射结果集的Java类型。
- result:定义Java对象的属性和查询结果集的列之间的映射关系。
- association:定义Java对象的属性和另一个Java对象之间的映射关系。
- collection:定义Java对象的属性和另一个Java对象集合之间的映射关系。
- discriminator:定义映射结果集的条件。
6. MyBatis中如何进行分页查询?
MyBatis中可以使用插件或者手动编写SQL语句来进行分页查询。
- 使用插件:MyBatis提供了一个分页插件PageHelper,可以非常方便地进行分页查询。在Mapper接口中定义方法时,只需传入页码和每页的记录数,PageHelper插件会自动进行分页。
- 手动编写SQL语句:手动编写SQL语句时,可以使用MySQL中的LIMIT关键字进行分页查询。例如:SELECT * FROM table LIMIT (page-1)*pageSize,pageSize。
7. MyBatis中如何实现多表关联查询?
MyBatis中实现多表关联查询的方式有以下几种:
- 嵌套查询:在SQL语句中使用嵌套查询,将查询结果作为子查询的条件进行查询。例如:SELECT * FROM table1 WHERE id IN (SELECT table1_id FROM table2 WHERE condition)。
- 连接查询:使用SQL语句中的JOIN关键字进行连接查询。例如:SELECT * FROM table1 JOIN table2 ON table1.id=table2.table1_id WHERE condition。
- 使用ResultMap:在ResultMap中使用association和collection标签进行多表关联映射。
8. MyBatis中有哪些执行器(Executor)?
MyBatis中有三种执行器:
- SimpleExecutor:每次执行SQL语句时,都会创建一个新的Statement对象。
- ReuseExecutor:在执行SQL语句之前会检查Statement是否已经存在,如果存在则复用Statement对象,否则创建新的Statement对象。
- BatchExecutor:在执行大量SQL语句时,使用批处理方式进行执行。
9. MyBatis中如何进行事务管理?
MyBatis中的事务管理使用JDBC的事务管理方式。在MyBatis中,可以使用SqlSession对象的commit()和rollback()方法来提交和回滚事务。同时,MyBatis也支持Spring框架的事务管理,可以通过配置Spring的事务管理器来实现事务管理。
10. MyBatis中如何进行多数据源配置?
MyBatis中实现多数据源配置的方式有以下几种:
- 使用多个SqlSessionFactory:每个SqlSessionFactory配置不同的数据源,通过SqlSessionFactory的openSession()方法获取SqlSession对象。
- 使用第三方数据源管理框架:例如Druid、C3P0等,可以通过这些框架来管理多个数据源。
- 自定义数据源:自定义数据源时,需要实现javax.sql.DataSource接口,并配置DataSourceTransactionManager来管理事务。MyBatis提供了一个AbstractRoutingDataSource抽象类,可以实现动态切换数据源。
阅读全文