面试速记之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()方法
编写注解,指定要拦截四个接口中哪个接口的哪个方法
发布评论