编程语言
首页 > 编程语言> > Java 面试机经(初级篇-17期)

Java 面试机经(初级篇-17期)

作者:互联网

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

四、MyBatis 框架

  1. Mybaits 有哪些优点?
    答案:
    (1) MyBatis 使用简单、数据可靠性、完整。
    (2)SQL 写在 XML 里,解除 SQL 与程序代码的耦合,便于统一管理
    (3)兼容各种数据库,JDBC 支持的数据库 MyBatis 也都支持
    (4)能够与 Spring 很好的集成,本身很小且简单也没有任何第三方依赖

  2. MyBatis 框架有哪些缺点?
    答案:
    当字段多、关联表多时,反而增加了复杂性。
    SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

  3. #{}和${}的区别是什么? 

    答案: 

    #{}是预编译处理,${}是字符串替换。 

    1)Mybatis 在处理#{}时,会将 SQL 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值,最后注入进去的是带引号的,使用#{}可以有效的防止 SQL 注入,提高系统安全性。 

    2)Mybatis 在处理${}时,就是把${}替换成变量的值。最后注入进去的是不带引号的,所以${} 是无法防止 sql 的注入。能尽量使用#{}就不要使用${}。

  4. resultMap 和 resultType
    答案:
    两者都是表示查询结果集与 java 对象之间的一种关系映射resultMap:表示将查询结果返回的所有字段集中映射到 Java 对象的各个属性,且一一对应resultType:表示直接返回的字段类型

  5. 讲下 MyBatis 的缓存
    答案:
    Mybatis 的一级缓存是指 SqlSession。一级缓存的作用域是一个 SqlSession。Mybatis 默认开启一级缓存。
    在同一个 SqlSession 中,执行相同的查询 SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行 SQL 时两次查询中间发生了增删改操作,则 SqlSession 的缓存清空。
    Mybatis 的二级缓存是指 mapper 映射文件。二级缓存的作用域是同一个 namespace 下的mapper 映射文件内容,多个 SqlSession 共享。Mybatis 需要手动设置启动二级缓存。在 SQL 映射 xml 文件中添加 一行 <cache/>        另外 MyBatis 可以单独对单条语句配置关闭缓存,只需在单条 select 语句配置中增加flushCache="true",系统默认 false 开启缓存表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。而 useCache 默认为 true,表示会将本条语句的结果进行二级缓存。

<select id="getUserName" resultType="String" flushCache="true">
    SELECT name FROM user where id=#{id};
</select>

MyBatis 读取数据的先后顺序是,先查二级缓存,再查一级缓存,再查数据库

  1. Mybatis 是如何进行分页的?分页插件的原理是什么?
    答案:
    1)Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,也可以直接编写 sql 实现分页,也可以使用 Mybatis 的分页插件 PageHelper。
    2)分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,添加对应的物理分页语句和物理分页参数。

  2. Mybatis 动态 sql 是做什么的?都有哪些动态 sql?动态 sql 的执行原理又是什么?
    答案:
    1)Mybatis 动态 sql 可以让我们在 Mapper.Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。
    2)Mybatis 提供了 9 种动态 sql 标签

<trim/>、<if/>、<where/>、<set/>、<foreach/>、<choose/>、<when/>、<otherwise/>、<bind/>。

        3)动态 SQL 是基于 OGNL 表达式的原理实现的,使用 OGNL 从 sql 参数            对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql          的功能。

  1. 如何获取自动生成的(主)键值?
    答案:
    设置 usegeneratedkeys 为 true,示例如下

<insert>
    id="insertUsr"
    parameterType="com.demo.api.user.domain.User"
    useGeneratedKeys="true" keyproperty=”id”>
    INSERT INTO user(name,age) VALUES(#{name},#{age});
</insert>
  1. 在 mapper 中如何传递多个参数?
    答案:
    1)直接在 Dao 方法中传递参数,Sql 的 xml 文件中参数用#{0} #{1}#{2}来获取ListselectUserList(int type,int age,int sex);
    2)使用@param 注解,这样可以直接在 Sql 的 xml 文件中通过#{userid}来获取String selectUserlNameByUserId(@Param("userid")Long id);

  2. Mybatis 工作原理?
    答案:
    1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis的运行环境、全局配置等信息,例如数据库连接信息、驱动等待数据库时间、缓存的开启、JDBC 生成主键、默认执行器、以及全局的延迟加载等配置信息
    2)加载 Mapper 映射文件,即放置 sql 的 xml 映射文件
    3)创建会话工厂 SqlSessionFactory
    4)创建会话对象 SqlSession,该对象中包含了执行 SQL 语句的所有方法
    5)Executor 执行器:MyBatis 底层定义了的一个 Executor 接口来操作数据库,它将根据SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护
    6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,用来封装 sql 和返回的结果
    7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
    8)输出结果映射:输出结果类型可以是 Map、List 等集合类型,也可以是基本数据类型和POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

标签:缓存,Java,映射,17,SQL,MyBatis,机经,sql,Mybatis
来源: https://blog.51cto.com/u_14602625/2964296