2021-12-14 13:42:11
Mybatis复习面试题及解析:
什么是Mybatis?MyBatis是一个ORM类型的半自动持久层框架,对JDBC进行了封装,通过XML文件或注解配置原生SQL信息,避免了手动创建连接、加载驱动等重复操作。其核心特点包括:
支持动态SQL,灵活控制查询逻辑。
提供对象关系映射(ORM),简化数据库操作。
与Spring等框架无缝集成。
MyBatis的优缺点及适用场合
优点:
灵活性高:基于SQL语句编译,可精细控制查询逻辑。
代码简洁:相比JDBC减少约50%的代码量。
兼容性强:适配多种数据库(如MySQL、Oracle)。
集成方便:与Spring框架深度整合。
缺点:
SQL编写量大:字段多或关联表复杂时,开发成本较高。
数据库依赖性强:SQL语句与数据库耦合,移植性差。
适用场合:
对性能要求高或需求频繁变更的项目(如互联网应用)。
需要精细控制SQL的场景(如复杂查询优化)。
#{}和${}的区别
#{}:预编译处理,MyBatis将其替换为?,通过PreparedStatement赋值,防止SQL注入。
${}:字符串替换,直接拼接变量值到SQL中,存在注入风险。
示例:
SELECT * FROM user WHERE name = #{name}; -- 安全SELECT * FROM user WHERE name = '${name}'; -- 危险实体类属性与表字段名不一致的解决方案
SQL别名:在查询中定义字段别名,与实体类属性名匹配。
SELECT id AS user_id, name AS user_name FROM user;<resultMap>映射:通过<resultMap>显式定义字段与属性的对应关系。
<resultMap id="userMap" type="User"> <id property="userId" column="id"/> <result property="userName" column="name"/></resultMap>Mapper接口的工作原理及方法重载
原理:Mapper接口的全限定名对应XML文件的namespace,方法名对应<statement>的id,参数通过PreparedStatement传递。
方法重载:不支持,因MyBatis通过“全限定名+方法名”定位SQL,重载会导致冲突。
resultMap与resultType的区别
resultType:自动映射查询结果到指定类型的对象属性,适用于简单查询。
resultMap:手动定义字段与属性的映射关系,支持复杂查询(如嵌套对象、集合)。
注意:两者不能同时使用,MyBatis内部最终均转换为ResultMap处理。
Mapper中传递多个参数的方法
封装为Map:将参数存入Map,通过键名引用。
Map<String, Object> params = new HashMap<>();params.put("name", "Alice");params.put("age", 20);使用@Param注解(推荐):标注参数名,直接在XML中引用。
User getUserByNameAndAge(@Param("name") String name, @Param("age") int age);动态SQL的作用、原理及标签
作用:根据条件动态拼接SQL,避免手动拼接字符串的繁琐与错误。
原理:通过OGNL表达式解析标签属性,生成最终SQL。
常用标签:
<if>:条件判断。
<foreach>:遍历集合(如IN查询)。
<where>/<set>:自动处理AND/OR和逗号。
XML映射文件的其他标签
<sql>:定义可复用的SQL片段。
<include>:引用<sql>片段。
<selectKey>:获取自增主键值。
全局配置文件的主要标签
<properties>:加载外部属性文件(如数据库配置)。
<settings>:配置MyBatis行为(如缓存、日志)。
<typeAliases>:定义类型别名,简化XML配置。
<mappers>:注册Mapper映射文件或接口。
不同XML文件中ID重复问题
有namespace:ID可重复,因通过“namespace+id”唯一标识。
无namespace:ID必须唯一,否则冲突。
关联查询标签
一对一:<association>,映射到单个对象。
<association property="address" javaType="Address"> <id property="id" column="address_id"/></association>一对多:<collection>,映射到集合。
<collection property="orders" ofType="Order"> <id property="id" column="order_id"/></collection>一级与二级缓存
一级缓存:
作用域:SqlSession级别,默认开启。
失效场景:执行增删改操作或调用clearCache()。
二级缓存:
作用域:Mapper级别,需手动配置<cache/>。
要求:实体类实现Serializable接口。
适用数据:不常变更的静态数据(如系统配置)。
接口绑定的实现方式
注解绑定:在接口方法上直接写SQL(如@Select("SELECT * FROM user"))。
XML绑定:XML的namespace需为接口全路径名,方法名与id一致。
Mapper接口调用的要求
传统方式:
接口继承SqlSessionDaoSupport。
XML的namespace为接口全路径名。
Spring集成:
使用@MapperScan自动扫描接口。
通过依赖注入直接调用方法。
以上内容覆盖了MyBatis的核心知识点,适合面试前快速复习,重点理解动态SQL、缓存机制及接口绑定原理。