面试速记之Mybatis

目录

  • JDBC
  • 优点
  • 缺点
  • 不是完整的ORM框架
    • 与hibernate对比
      • sql与orm之争
      • 学习成本
      • 选取
      • sql优化
      • 对象管理
      • 缓存机制
  • 一级缓存
  • 二级缓存
  • 执行过程
    • 拿数据源
    • 执行sql
    • 执行数据库
    • 总结
  • #{}和${}的区别
    • #{}
    • ${}
  • mybatis插件
    • 如何写一个插件?

JDBC

Java提供的操作数据库的API

mybatis封装了jdbc

优点

sql写在xml中,解耦

支持编写动态sql,解决了sql拼接带来的语法问题

便于重用

消除冗余代码,不必关心连接

集成spring方便

支持表与实体间的关系映射

缺点

对开发者的sql编写有一定要求,尤其是业务复杂场景下

sql依赖数据库,更改数据库不方便

不是完整的ORM框架

对象关系映射,Object Relational Mapping

把mysql类型转为Java类型存入对象

只能说它是半自动的orm

程序 - 持久层框架(桥梁) - 数据库

jpa和hibernate是orm框架,mybatis是sql mapping框架

过桥的时候,前者将sql封装成了方法,需要组装;后者需要手动编写

它们都是持久层框架

与hibernate对比

sql与orm之争

没有说哪个更好,mybatis是面向表设计,而hibernate是面向对象设计

国内外设计思路不同,导致热衷框架不同

国内拿到项目先设计数据库,然后专注于对表的crud,适合敏捷开发

而国外拿到项目先想需要哪些对象

学习成本

hibernate相对大

选取

简单crud的话mybatis效率高,mybatis相对轻量

业务复杂选mybatis更灵活,毕竟可以自定义sql

但是mybatis要写的东西比hibernate多些,如果新搞个查询需要改对应的mapper(包括interface和xml)

hibernate数据库无关性好,用户通过方法拼接,无需关心底层sql

sql优化

mybatis占优,可以动态调整sql

对象管理

orm框架核心

hibernate有,mybatis无

缓存机制

都有两级缓存,支持第三方缓存方案

一级缓存

默认开启

二级缓存

默认不开启

执行过程

sqlsessionfactory.build()加载全局配置,加载数据源啊,sql语句啊啥的

然后sqlsession再调执行器执行具体sql

拿数据源

xml标签要按规定的顺序写,必须与源码执行顺序一致,才能正确解析

<configuration><!-- properties属性引入外部配置文件 --><properties resource="config/db.properties"><!-- property里面的属性全局均可使用 --><property name="jdbc.username" value="root"/><property name="jdbc.password" value="123456"/><!-- 启用默认值特性,这样${}拼接符才可以设置默认值 --><property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/></properties><!-- 加载映射文件 --><mappers><mapper resource="com.pjb.mybatis.sqlmap.UserMapper.xml"/><mapper resource="com.pjb.mybatis.sqlmap.OtherMapper.xml"/></mappers>
</configuration>

搞成一个DataSource对象

执行sql

mappers加载方式:四种

xml两种,接口两种

优先级:
package > resource > url > class

执行数据库

执行器是枚举类

执行器:简单、复用、批处理,默认是simple

A系统给B系统一条sql,如何判断sql的正确性?

语法引擎,改写sql

总结

#{}和${}的区别

#{}

#{}是预编译,占位符

mybatis处理时,会变成 ?号

调PrepareStatement赋值

替换发生在DBMS中,变量替换自动加上引号

使用它可防止sql注入,提高系统安全性

${}

${}是字符串替换,拼接符

mybatis处理时,保持括号内容原封不动

调Statement赋值

替换发生在DBMS外,变量替换不会自动加引号

mybatis插件

本质是拦截器

没spring中的灵活,只能拦

ParameterHandler
作用:往sql传参时转数据类型

ResultSetHandler
作用:接收结果集

StatementHandler
作用:往sql语句中设参数和映射结果集

Executor
作用:生成sql语句和缓存维护

这四个接口

使用jdk动态代理

如何写一个插件?

实现Interceptor接口

重写intercept()方法

编写注解,指定要拦截四个接口中哪个接口的哪个方法