Mybatis面试题(三)

文章目录

  • 前言
  • 一、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
  • 二、当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?
  • 三、模糊查询 like 语句该怎么写
  • 四、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重载?
  • 五、Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?
  • 六、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
  • 七、Mybatis 中如何执行批处理?
  • 八、Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?
  • 九、Mybatis 中如何指定使用哪一种 Executor 执行器?
  • 十、Mybatis 执行批量插入,能返回数据库主键列表吗?
  • 总结


前言

  1. Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
  2. 当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?
  3. 模糊查询 like 语句该怎么写
  4. 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重载?
  5. Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?
  6. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
  7. Mybatis 中如何执行批处理?
  8. Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?
  9. Mybatis 中如何指定使用哪一种 Executor 执行器?
  10. Mybatis 执行批量插入,能返回数据库主键列表吗?

一、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?

答:还有很多其他的标签,resultMap、parameterMap、sql、include、selectKey,加上动态 sql 的 9 个标签,
trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中sql为 sql 片段标签,通过include标签引入 sql 片段,selectKey为不支持自增的主键生成策略标签。


二、当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?

  1. 通过在查询的 sql 语句中定义字段名的别名。
  2. 通过resultMap来映射字段名和实体类属性名的一一对应的关系。

三、模糊查询 like 语句该怎么写

答:

  1. 在 java 中拼接通配符,通过#{}赋值
  2. 在 Sql 语句中拼接通配符 (不安全 会引起 Sql 注入)

四、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重载?

不能重载,因为通过 Dao 寻找 Xml 对应的 sql 的时候全限名+方法名的保存和寻找策略。接口工作原理为 jdk 动态代理原理,运行时会为 dao 生成 proxy,代理对象会拦截接口方法,去执行对应的 sql 返回数据。


五、Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?

答:虽然 Mybatis 解析 Xml 映射文件是按照顺序解析的,但是,被引用的 B 标签依然可以定义在任何地方,Mybatis 都可以正确识别。原理是,Mybatis 解析 A 标签,发现 A 标签引用了 B 标签,但是 B 标签尚未解析到,尚不存在,此时,Mybatis 会将 A 标签标记为未解析状态,然后继续解析余下的标签,包含 B 标签,待所有标签解析完毕,Mybatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签已经存在,A 标签也就可以正常解析完成了。


六、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

答:不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置namespace,那么 id 不能重复;毕竟 namespace 不是必须的,只是最佳实践而已。原因就是 namespace+id 是作为 Map的 key 使用的,如果没有namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然也就不同。


七、Mybatis 中如何执行批处理?

答:使用 BatchExecutor 完成批处理。


八、Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?

答:Mybatis 有三种基本的 Executor 执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

  1. SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。
  2. ReuseExecutor:执行 update 或 select,以 sql 作为key 查找 Statement 对象,存在就使用,不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map
  3. BatchExecutor:完成批处理。

九、Mybatis 中如何指定使用哪一种 Executor 执行器?

答:在 Mybatis 配置文件中,可以指定默认的 ExecutorType 执行器类型,也可以手动给DefaultSqlSessionFactory 的创建SqlSession 的方法传递 ExecutorType 类型参数。


十、Mybatis 执行批量插入,能返回数据库主键列表吗?

答:能,JDBC 都能,Mybatis 当然也能。


总结

  1. Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
  2. 当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?
  3. 模糊查询 like 语句该怎么写
  4. 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重载?
  5. Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?
  6. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
  7. Mybatis 中如何执行批处理?
  8. Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?
  9. Mybatis 中如何指定使用哪一种 Executor 执行器?
  10. Mybatis 执行批量插入,能返回数据库主键列表吗?

你可能感兴趣的:(面试,mybatis)