01-Mybatis源码
2021-01-30 本文已影响0人
安然在路上
当我看到一线大厂的起薪是25k,而我这种5年开发经验的大龄菜鸟用什么去换那25K呢。巨大的焦虑袭来,所以抓住了拉钩教育的高薪训练营这根救命稻草,是的,我太需要帮助了。
2021年1月20号开的班,开此系列记录一下很懒又经常做很多无用功的我的成长之路~
写在前面的话
言归正传,mybatis和其他ORM框架一样,是对jdbc的封装,那么先回顾一下最最开始的jdbc:
1.加载JDBC驱动程序
DriverManager dm = Class.forName("com.mysql.jdbc.Driver") ;
- 创建数据库的连接
Connection con = DriverManager.getConnection(url , username , password ) ; - 创建一个preparedStatement 、设置参数
PreparedStatement pstmt = con.prepareStatement(sql) ; - 执行SQL语句
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ; - 遍历结果集
- 释放资源
问题:
- 频繁创建、释放连接浪费系统资源
- sql语句在代码中硬编码
- 解析结果集时有硬编码等
优化措施:
连接池、sql语句提取到xml中、使用反射和内省将实体和表进行属性与字段的自动映射。
自定义框架设计
使用端:
- 数据源配置信息
xml可以,properties文件也可以 - sql语句信息:Mapper.xml
框架端:
- 读取配置文件
- 解析配置文件
Configuration用组合的方式放到其他对象中一层层传递
MappedStatement :sql语句、入参出参 - 创建SqlSessionFactory
- 创建sqlSession接口和实现类:主要封装CRUD方法
具体实现:封装jdbc,完成对数据库表的查询操作
感觉创建sqlSession的那块代码逻辑有点复杂,插入一点mybatis里的东西:

涉及的设计模式:
build建造者模式、工厂模式、代理模式
Mybatis
1. Mapper接口开发:
- Mapper.xml文件中的namespace与mapper接口的全限定名相同
- Mapper接口方法名和Mapper。xml中定义的statement中的id相同
- Mapper.xml中的入参出参和类型相同
2. 动态sql
-
foreach
foreach
注意:collection可以写list、array等
- sql片段抽取
sql片段抽取
3.mybatis缓存
一级缓存也叫查询缓存,默认开启,基于sqlSession,一级缓存是缓存对象。
一级缓存
二级缓存需要手动开启,但在分布式环境下使用默认的二级缓存会产生脏读。二级缓存和sqlSession无关,在namespace级别配置,二级缓存是缓存数据,会重新生成一个对象,所以对象需要实现Serialable接口。二级缓存整合redis可以解决分布式环境下的脏读问题。
