MyBatis 面试题, # 和 $ 的区别是什么?
MyBatis 面试题, # 和 $ 的区别是什么?
QA
Step 1
Q:: MyBatis 中 #{} 和 ${}
的区别是什么?
A:: 在 MyBatis 中,#{} 和 ${}
都用于在 SQL 语句中插入参数,但它们的工作方式不同:
1. **#{}
**:使用预编译语句(PreparedStatement),在 SQL 语句执行时,将参数作为 SQL 语句中的占位符,在执行时再将实际的参数值绑定到这些占位符上。这样做的好处是可以防止 SQL 注入攻击,并且在一定程度上提高了性能,因为数据库可以对这些预编译的 SQL 语句进行缓存。
2. **${}
**:直接将参数值插入到 SQL 语句中,在 SQL 语句生成时,参数值会被直接替换为实际值。这个方法的缺点是容易引发 SQL 注入问题,因此在使用时需要非常小心。通常只在一些需要动态生成 SQL 片段的场景下使用。
Step 2
Q:: MyBatis 的优缺点有哪些?
A:: MyBatis 的优点包括:
1.
灵活性高:支持自定义 SQL、存储过程和高级映射。
2.
易于集成:与 Spring 等框架集成方便,使用简单。
3.
可控性强:开发人员可以直接控制 SQL 执行,避免了 ORM 造成的性能问题。
缺点包括:
1.
SQL 维护成本高:由于直接编写 SQL,SQL 的复杂性和维护成本较高。
2.
学习曲线陡峭:需要开发人员熟悉 SQL 和数据库,学习成本较高。
Step 3
Q:: MyBatis 如何处理一对多关系的映射?
A:: MyBatis 通过使用 resultMap
标签来处理一对多的关系映射。resultMap
标签允许你定义复杂的映射规则,将一个查询结果集映射为一个复杂的对象层次结构。
在一对多关系中,可以通过在 resultMap
中使用 collection
标签来映射集合属性,collection
标签中通常包含 resultMap
的引用,以指定集合中每个元素的映射规则。这样,MyBatis 能够正确地将一个数据库查询结果映射为包含一个集合的对象。
Step 4
Q:: MyBatis 中的动态 SQL 是如何实现的?
A:: MyBatis 的动态 SQL 是通过在 XML 配置文件中使用一系列标签(如 <if>``,
<choose>``,
<when>``,
<otherwise>``,
<foreach>
等)来实现的。动态 SQL 允许根据传入参数的不同构建不同的 SQL 语句,从而实现更加灵活和复杂的查询。
动态 SQL 的好处是可以避免硬编码 SQL 语句中的逻辑,并且可以根据不同的条件动态地生成 SQL,这在处理复杂查询时尤其有用。
Step 5
Q:: MyBatis 如何实现延迟加载?
A:: MyBatis 通过配置 lazyLoadingEnabled
来支持延迟加载。延迟加载指的是在实际需要数据的时候再去加载数据,而不是在查询时立即加载所有相关数据。
在 MyBatis 中,如果启用了延迟加载,当访问延迟加载的属性时,MyBatis 会自动发起一个 SQL 查询来获取所需的数据。这在处理大数据量或复杂对象图时,能够显著提升性能,因为它避免了不必要的数据加载。