复习Mybatis框架,面试题:

复习Mybatis框架,面试题:
最新回答
时间曼妙

2021-12-14 13:42:11

Mybatis复习面试题及解析

  1. 什么是Mybatis?MyBatis是一个ORM类型的半自动持久层框架,对JDBC进行了封装,通过XML文件或注解配置原生SQL信息,避免了手动创建连接、加载驱动等重复操作。其核心特点包括:

    支持动态SQL,灵活控制查询逻辑。

    提供对象关系映射(ORM),简化数据库操作。

    与Spring等框架无缝集成。

  2. MyBatis的优缺点及适用场合

    优点

    灵活性高:基于SQL语句编译,可精细控制查询逻辑。

    代码简洁:相比JDBC减少约50%的代码量。

    兼容性强:适配多种数据库(如MySQL、Oracle)。

    集成方便:与Spring框架深度整合。

    缺点

    SQL编写量大:字段多或关联表复杂时,开发成本较高。

    数据库依赖性强:SQL语句与数据库耦合,移植性差。

    适用场合

    对性能要求高或需求频繁变更的项目(如互联网应用)。

    需要精细控制SQL的场景(如复杂查询优化)。

  3. #{}和${}的区别

    #{}:预编译处理,MyBatis将其替换为?,通过PreparedStatement赋值,防止SQL注入

    ${}:字符串替换,直接拼接变量值到SQL中,存在注入风险

    示例

    SELECT * FROM user WHERE name = #{name}; -- 安全SELECT * FROM user WHERE name = '${name}'; -- 危险
  4. 实体类属性与表字段名不一致的解决方案

    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>
  5. Mapper接口的工作原理及方法重载

    原理:Mapper接口的全限定名对应XML文件的namespace,方法名对应<statement>的id,参数通过PreparedStatement传递。

    方法重载不支持,因MyBatis通过“全限定名+方法名”定位SQL,重载会导致冲突。

  6. resultMap与resultType的区别

    resultType:自动映射查询结果到指定类型的对象属性,适用于简单查询。

    resultMap:手动定义字段与属性的映射关系,支持复杂查询(如嵌套对象、集合)。

    注意:两者不能同时使用,MyBatis内部最终均转换为ResultMap处理。

  7. 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);
  8. 动态SQL的作用、原理及标签

    作用:根据条件动态拼接SQL,避免手动拼接字符串的繁琐与错误。

    原理:通过OGNL表达式解析标签属性,生成最终SQL。

    常用标签

    <if>:条件判断。

    <foreach>:遍历集合(如IN查询)。

    <where>/<set>:自动处理AND/OR和逗号。

  9. XML映射文件的其他标签

    <sql>:定义可复用的SQL片段。

    <include>:引用<sql>片段。

    <selectKey>:获取自增主键值。

  10. 全局配置文件的主要标签

    <properties>:加载外部属性文件(如数据库配置)。

    <settings>:配置MyBatis行为(如缓存、日志)。

    <typeAliases>:定义类型别名,简化XML配置。

    <mappers>:注册Mapper映射文件或接口。

  11. 不同XML文件中ID重复问题

    有namespace:ID可重复,因通过“namespace+id”唯一标识。

    无namespace:ID必须唯一,否则冲突。

  12. 关联查询标签

    一对一:<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>
  13. 一级与二级缓存

    一级缓存

    作用域:SqlSession级别,默认开启。

    失效场景:执行增删改操作或调用clearCache()。

    二级缓存

    作用域:Mapper级别,需手动配置<cache/>。

    要求:实体类实现Serializable接口。

    适用数据不常变更的静态数据(如系统配置)。

  14. 接口绑定的实现方式

    注解绑定:在接口方法上直接写SQL(如@Select("SELECT * FROM user"))。

    XML绑定:XML的namespace需为接口全路径名,方法名与id一致。

  15. Mapper接口调用的要求

    传统方式

    接口继承SqlSessionDaoSupport。

    XML的namespace为接口全路径名。

    Spring集成

    使用@MapperScan自动扫描接口。

    通过依赖注入直接调用方法。

以上内容覆盖了MyBatis的核心知识点,适合面试前快速复习,重点理解动态SQL、缓存机制及接口绑定原理。