face_mybatis

2020-03-26  本文已影响0人  北京黄小胖
  1. mybatis简介,(所有相关回答均可从此开始起手式)

MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架,

  • 高版本的JDBC已采用SPI加载驱动
  • Cache采用装饰器模式封装了如FIFO、LRU、Schedule等缓存器,利于针对cache扩展增强
  • 日志Logging采用适配器模式扩展
  • Excutor采用模版模式进行扩展不同的Excutor
  1. mybatis的缓存

MyBatis 的缓存分为一级缓存二级缓存,一级缓存放在session里面,在select上通过flushCache开启和关闭,默认为true,
二级缓存放在它的命名空间里,使用二级缓存属性类需要实现
序列化,可在它的映射文件中配置<cache/>
,当进行Insert、update、delete操作会清除对应缓存

  1. mybatis如何进行分页

mybatis使用RowBounds进行分页,也可以使用sql limit进行分页,或使用分页插件

  1. mybatis的插件运行原理
  • Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、 Executor 这 4 种接口的插件,Mybatis 通过动态代理,为需要拦截的接口生成代理对象
    以实 现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,
    具体就是 InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦
    截的方法
  • 实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后在给插件编写注解,
    指定 要拦截哪一个接口的哪些方法即可
  1. Mybatis 动态 sql 是做什么的?都有哪些动态 sql?

Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,
完成逻辑判断和动态拼接 sql 的功能,提供了9种动态sql标签

  • trim、where、set、foreach、if、choose、when、otherwise、bind
  1. {}和${}的区别是什么?

{}是预编译处理,可以防止sql注入,${}是字符串替换

  1. Mybatis 的延迟加载是什么

Mybatis 仅支持 association 一对一关联对象和 collection 一对多关联集合对象的延迟加载
。可以通过 lazyLoadingEnabled=true|false来配置是否启用延迟加载

它是使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,在单独发送
事先保存好的查询给对象赋值

  1. MyBatis 的好处是什么?
  • 独立出来的xml编写sql,更加的便利和灵活,
  • 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象,
    大大简化了 Java 数据库编程的重复工作
  1. MyBatis 实现一对一有几种方式?

联合查询嵌套查询

  • 联合查询是几个表联合查询,只查询一次,通过在 resultMap 里面 配置 association
    节点配置一对一的类就可以完成,关联查询适合数据少
  • 嵌套查询是先查一个表,根据这个表里面 的结果的外键 id,去再另外一个表里面查询数据,
    也是通过 association 配置,但另外一个表的 查询通过 select 属性配置。

嵌套查询又分为嵌套结果嵌套查询

  • 嵌套结果是使用嵌套结果映射(另一个resultMap)来处理重复的联合结果的子集
  • 嵌套查询是通过执行另外一个 SQL 映射语句来返回预期的复杂类型
  1. Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?

可以使用<resultMap>标签或者直接写查询字段

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

可以采用sql别名方式或者resultmap中进行映射

  1. Mybatis 都有哪些 Executor 执行器

Mybatis 有三种基本的 Executor 执行器,SimpleExecutorReuseExecutor
BatchExecutor,可在配置文件中指定Executor或创建session时指定ExecutorType.xxx

  • SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,
    用完立刻关闭 Statement 对象
  • ReuseExecutor:执行 update 或 select,以 sql 作为 key 查找 Statement 对象,
    存在就使用,不存在就创建,用完后,不关闭 Statement 对象, 而是放置于Map
  • BatchExecutor是完成批处理
  1. resultType resultMap 的区别?
  • 类的名字和数据库相同时,可以直接设置 resultType 参数为 Pojo 类
  • 若不同,需要设置 resultMap 将结果名字和 Pojo 名字进行转换
上一篇下一篇

猜你喜欢

热点阅读