mybatis八股文
时间: 2023-11-09 11:59:51 浏览: 100
MyBatis是一种开源的持久化框架,它简化了数据库访问层的开发。下面是一个简单的MyBatis八股文:
1. 引入依赖:在项目的配置文件中引入MyBatis的依赖,可以使用Maven或者Gradle进行管理。
2. 配置数据源:在配置文件中配置数据库的连接信息,包括数据库驱动、URL、用户名和密码等。
3. 编写实体类:创建与数据库表对应的实体类,并使用注解或XML配置字段到表列的映射关系。
4. 编写Mapper接口:创建与实体类对应的Mapper接口,定义需要执行的SQL语句。
5. 编写Mapper XML:在Mapper XML中编写SQL语句,包括增删改查等操作,并与Mapper接口进行映射。
6. 配置Mapper扫描:在配置文件中配置Mapper接口的扫描路径,告诉MyBatis去哪里找到Mapper接口。
7. 创建SqlSessionFactory:通过MyBatis的配置文件创建SqlSessionFactory,用于创建SqlSession对象。
8. 获取SqlSession:通过SqlSessionFactory获取SqlSession对象,用于执行SQL语句。
9. 执行SQL语句:通过SqlSession对象执行SQL语句,可以使用Mapper接口或者直接调用SqlSession的方法。
10. 关闭资源:在完成数据库操作后,关闭SqlSession对象和数据库连接。
相关问题
Mybatis八股文
### 关于 MyBatis 的常见面试题及答案
#### 什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。通过 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects)到数据库记录[^1]。
#### MyBatis 的工作原理是什么?
MyBatis 的核心组件包括 SqlSessionFactory 和 SqlSession。SqlSessionFactory 负责创建 SqlSession 实例;而 SqlSession 提供操作数据库的方法,如 insert、update、delete 和 select 等。当执行这些方法时,MyBatis 会根据传入的参数构建对应的 SQL 语句并发送给数据库引擎处理,最后将返回的结果封装成对象形式提供给应用程序使用。
#### 如何提高 MyBatis 查询性能?
为了提升查询效率,建议采用以下策略:
- 编写高效的 SQL 语句;
- 利用缓存机制减少不必要的数据读取次数;
- 合理设计表结构与索引来加速检索速度;
- 减少懒加载带来的额外开销;
- 使用批量操作代替多次单条记录的操作方式[^2]。
#### Mapper 中如何传递多个参数?
有几种不同的途径可以在 mapper 接口中定义多参方法:
- **利用 `@Param` 注解**:为每个参数指定名称,在 xml 映射文件里可以通过 `${paramName}` 访问相应值。
```java
public interface UserMapper {
@Select("SELECT * FROM users WHERE name=#{name} AND age=#{age}")
List<User> findUsersByNameAndAge(@Param("name") String name, @Param("age") int age);
}
```
- **借助 Map 类型作为输入参数**:把所有需要传输的数据放入 map 中一起传送过去即可。
```java
public interface OrderMapper {
@Insert("<script>" +
"INSERT INTO orders (customer_id, product_name)" +
"VALUES" +
"<foreach collection='list' item='order' separator=','>" +
"(#{order.customerId}, #{order.productName})" +
"</foreach>" +
"</script>")
void batchInsertOrders(Map<String, Object> params);
}
```
- **自定义实体类包裹所需字段**:这种方式更加面向对象一些,同时也便于后期扩展维护。
```java
public class SearchCriteria {
private Integer minPrice;
private Integer maxPrice;
// getters and setters...
}
public interface ProductMapper {
@SelectProvider(type = SqlBuilder.class, method = "buildSearchProductsByPriceRange")
List<Product> searchProducts(SearchCriteria criteria);
static class SqlBuilder {
public static String buildSearchProductsByPriceRange(MappedStatement ms, Object parameterObject) {
final StringBuilder sql = new StringBuilder();
sql.append("SELECT * FROM products p ");
if (((SearchCriteria)parameterObject).getMinPrice() != null && ((SearchCriteria)parameterObject).getMaxPrice() != null){
sql.append("WHERE p.price BETWEEN ").append(((SearchCriteria)parameterObject).getMinPrice()).append(" AND ").append(((SearchCriteria)parameterObject).getMaxPrice());
}else{
throw new RuntimeException("Both price range must be set.");
}
return sql.toString();
}
}
}
```
mybatis八股
<think>好的,用户想了解MyBatis的常见面试题和基础知识点。我需要根据提供的引用内容来整理答案。首先,查看用户给的引用,引用[1]提到了MyBatis的工作原理图,引用[2]和[3]提到了MyBatis-Plus的区别以及多表查询处理,引用[5]涉及动态SQL的执行原理。这些应该作为重点。
首先,我应该从MyBatis的工作原理开始,这是基础。然后需要对比MyBatis和MyBatis-Plus的区别,这是常见的面试题。接着,动态SQL的实现,比如OGNL表达式,这也是关键点。多表查询的处理方式,比如ResultMap和关联映射,用户引用[3]提到过,需要详细说明。此外,面试题还可能包括#{}和${}的区别、缓存机制等,虽然引用里没有直接提到,但结合常见知识点应该补充进去。
还要注意用户要求的结构,需要分点清晰,使用中文回答,正确使用LaTeX格式。比如动态SQL部分要提到<if>、<choose>等标签,用$$包裹代码示例。同时,每个引用要自然地标注在段落末尾,例如引用[1]在讲工作原理时添加,引用[5]在解释动态SQL时引用。
可能用户没有提到的但常见的面试题还包括一级和二级缓存的区别、延迟加载等,需要根据知识库补充。但根据现有引用,可能只能覆盖部分内容,需要确保引用标记正确。最后,生成的相关问题需要基于回答内容,比如工作原理、动态SQL、缓存机制等,确保问题与内容相关。</think>### MyBatis 常见面试题与基础知识点总结
---
#### 1. **MyBatis 工作原理**
MyBatis 的核心流程包括配置加载、SQL 解析、参数映射、SQL 执行和结果映射。
- **配置加载**:读取 `mybatis-config.xml` 和映射文件(如 `Mapper.xml`),构建 `SqlSessionFactory`[^1]。
- **SQL 解析**:将 XML 或注解中的 SQL 语句解析为 `MappedStatement` 对象。
- **参数映射**:通过 `#{}` 或 `${}` 将 Java 对象属性绑定到 SQL 参数。
- **SQL 执行**:通过 `SqlSession` 执行 SQL,并生成 `PreparedStatement`。
- **结果映射**:通过 `<resultMap>` 将查询结果转换为 Java 对象[^3]。
---
#### 2. **MyBatis 与 MyBatis-Plus 的区别**
- **MyBatis**:需手动编写 SQL 和结果映射,灵活性高但开发效率较低。
- **MyBatis-Plus**:
- 提供通用 Mapper(如 `BaseMapper`),支持单表 CRUD 无需手写 SQL[^2]。
- 内置分页插件、代码生成器等工具,简化开发流程。
- 完全兼容原生 MyBatis 功能[^2]。
---
#### 3. **动态 SQL 的实现原理**
MyBatis 使用 **OGNL 表达式** 解析动态标签(如 `<if>`、`<choose>`),根据参数值动态拼接 SQL。
例如:
```xml
<select id="findUser">
SELECT * FROM user
<where>
<if test="name != null"> AND name = #{name} </if>
<if test="age != null"> AND age = #{age} </if>
</where>
</select>
```
执行时,若 `name` 为 `null`,则自动剔除对应条件[^5]。
---
#### 4. **多表查询的解决方案**
- **ResultMap 嵌套**:通过 `<association>`(一对一)和 `<collection>`(一对多)映射关联对象。
- **SQL 别名**:为字段取别名,直接映射到 Java 对象属性(适用于简单场景)。
例如:
```sql
SELECT u.id, u.name, o.order_no AS "orderNo" FROM user u LEFT JOIN order o ON u.id = o.user_id
```
---
#### 5. **常见面试题**
1. **`#{}` 和 `${}` 的区别?**
- `#{}` 使用预编译,防止 SQL 注入;`${}` 直接拼接字符串,适用于动态表名或列名。
2. **一级缓存与二级缓存的区别?**
- 一级缓存:基于 `SqlSession` 级别,默认开启。
- 二级缓存:基于 `namespace` 级别,需手动配置,跨会话共享[^4]。
3. **如何实现延迟加载?**
在 `<association>` 或 `<collection>` 中设置 `fetchType="lazy"`,通过代理对象按需加载数据。
---
#### 6. **优化与实践**
- **批量操作**:使用 `<foreach>` 标签或 `ExecutorType.BATCH` 模式提升性能。
- **SQL 复用**:通过 `<sql>` 标签定义公共片段,减少重复代码。
---
阅读全文
相关推荐
















