Java 面试机经(初级篇-17期)
作者:互联网
四、MyBatis 框架
-
Mybaits 有哪些优点?
答案:
(1) MyBatis 使用简单、数据可靠性、完整。
(2)SQL 写在 XML 里,解除 SQL 与程序代码的耦合,便于统一管理
(3)兼容各种数据库,JDBC 支持的数据库 MyBatis 也都支持
(4)能够与 Spring 很好的集成,本身很小且简单也没有任何第三方依赖 -
MyBatis 框架有哪些缺点?
答案:
当字段多、关联表多时,反而增加了复杂性。
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。 -
#{}和${}的区别是什么?
答案:
#{}是预编译处理,${}是字符串替换。
1)Mybatis 在处理#{}时,会将 SQL 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值,最后注入进去的是带引号的,使用#{}可以有效的防止 SQL 注入,提高系统安全性。
2)Mybatis 在处理${}时,就是把${}替换成变量的值。最后注入进去的是不带引号的,所以${} 是无法防止 sql 的注入。能尽量使用#{}就不要使用${}。
-
resultMap 和 resultType
答案:
两者都是表示查询结果集与 java 对象之间的一种关系映射resultMap:表示将查询结果返回的所有字段集中映射到 Java 对象的各个属性,且一一对应resultType:表示直接返回的字段类型 -
讲下 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 读取数据的先后顺序是,先查二级缓存,再查一级缓存,再查数据库
-
Mybatis 是如何进行分页的?分页插件的原理是什么?
答案:
1)Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,也可以直接编写 sql 实现分页,也可以使用 Mybatis 的分页插件 PageHelper。
2)分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,添加对应的物理分页语句和物理分页参数。 -
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 的功能。
-
如何获取自动生成的(主)键值?
答案:
设置 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>
-
在 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); -
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