Mybatis

作者:加菲猫 2018-06-19 225 0

#{ } 和 ${ } 的区别?

${ } 是变量占位符,#{ } 是参数占位符,Mybatis 会将其替换为 ?,并在参数值外加上引号,能防止 sql 注入。

xml 映射文件中有哪些标签?(select / insert / update / delete)

<resultMap> <parameterMap> <sql> <include> <selectKey>

<include> 用来引入 sql 片段

动态 sql:trim / where / set / foreach / if / choose / when / otherwise / bind

每个 xml 映射文件都有一个 Dao,工作原理是什么?Dao中的方法能 overload 吗?

Dao 就是 Mapper 接口,Mapper 接口没有实现类。

接口名,就是 xml 映射文件中 namespace 的值。

接口的方法名,就是 xml 映射文件中的 id 值。

接口方法的参数,就是传给 sql 的参数。

调用时,是用(接口名 + 方法名)作为唯一标记,所以方法不能重载。

Mybatis 如何将结果封装为对象返回?有哪些映射形式?

映射形式有两种,一是 <resultMap>,逐一定义列名和对象属性名间的映射关系。二是别名,t_name as name。

有了列名与属性名之间的映射关系后,Mybatis 通过反射创建对象,同时给对象赋值。

Mybatis 是否支持延迟加载?原理是什么?

仅支持 assocation(一对一)关联对象和collection(一对多)关联集合,在配置文件中,lazyLoadingEnable = true | false。

首先创建代理对象,调用方法时进入拦截器,比如调用 a.getB().getName();,拦截器 invoke() 方法发现 a.getB() 是 null,就会单独发送事先保存好的查询关联 B 对象的sql,把 B 查出来赋值给 A,再完成 a.getB().getName() 的调用。

Mybatis 不同的映射文件 id 是否可以重复?

如果有 namespace,可以重复。

Map<String,MappedStatement> 中的 key 是 namespace + id。

Mybatis 有哪些 Executor 执行器?

SimpleExecutor:每执行一次 update 或 select,就开启一个 statement 对象,用完关闭。

ReuseExecutor:执行 update 或 select 时,以 sql 作为 key 查找 statement 对象,不存在才创建,用完不关闭。

BatchExecutor:批处理(update),addBatch()方法将所有sql加入批处理中,executeBatch()方法统一执行,它缓存了多个 statement 对象。

如何指定 Executor?

在配置文件中指定,<settings> 中的 <setting name="defaultExecutorType" value="SIMPLE" /> 在给 DefaultSqlSessionFactory 创建 SqlSession 的方法传 ExecutorType 的类型。

xml 映射文件中,A 标签 include 引用了 B 标签,B 标签能定义在 A 后吗?

可以,Mybatis 解析到 A 标签时,发现引用了 B,而 B 标签还没有被解析,就会标记 A 为未解析,Mybatis 最后会重新解析所有未解析的标签。

Mybatis 和 Hibernate 的区别?

Hibernate 是全自动 ORM 映射工具,查询结果可以根据对象关系模型直接获取。

Mybatis 是半自动 ORM 映射工具,需要手动编写 sql。

xml 映射文件和 Mybatis 的内部数据结构间的关系?

xml 信息封装到 Configuration 对象中。

<parameterMap> 被解析为 ParameterMap 对象,子元素为 ParameterMapping 对象。

<resultMap> 被解析为 ResultMap 对象,子元素为 ResultMapping 对象。

<select> <insert> <update> <delete> 被解析为 MappedStatement 对象。 sql 被解析为 BoundSql 对象。

发表评论

下一篇: 上一篇: