侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

Mybatis源码系列0-从JDBC到Mybatis

2022-06-21 星期二 / 0 评论 / 0 点赞 / 64 阅读 / 25329 字

Mybatis源码系列0-从JDBC到Mybatis缘起JDBC如何使用痛点分析轮子Mybatis(脱离Spring)使用初级阶段:DefaultSqlSession(脱离Spring)使用中级阶

Mybatis源码系列0-从JDBC到Mybatis

.

缘起JDBC如何使用痛点分析轮子Mybatis(脱离Spring)使用初级阶段:DefaultSqlSession(脱离Spring)使用中级阶段:Mapper(脱离Spring)使用高级阶段:SqlsessionManagerSpring-JDBC总结

缘起JDBC

如何使用

说Mybatis之前得先讲讲JDBC

痛点分析

如果我们在一个项目中所有与数据库打交道的地方都写一堆这样这个东西,肯定是不友好的。

.

我们分析存在的问题:

  1. 硬编码东西,最好统一管理。我们看到第一步,二步中的驱动,数据库url,用户名,密码都是在项目启动后不变的。所以,我们应该搞一个属性配置,专门存放这些不变的东西。
  2. 获取连接: 第二步存在问题就是,我们不能在每次获取数据链接的地方,都把DriverManager.getConnection(url, user, password);写一遍吧。好的写法是对其封装一个类工厂,只在工厂类中写一遍,直接从工厂类中获取Connection
  3. 第三步:其实有两个重点:(1)sql 的分散JAVA代码中(2)sql 的参数拼接问题
  4. 第四步:就是结果的映射问题,我们通常都会定义JAVABean映射数据库字段,这种结果的处理,其实就是体力活,我们应该做一个处理器专门处理这种映射问题
  5. 第五步:链接的关闭也是一个力气活,并且如果一不小心忘了,可就不好了。所以应该做一个保证能执行完关闭的,让程序不要总是想着我关闭连接了吗?

针对这5个步骤的问题,我们自己也可以写出几个工具类出来,其实就是在造轮子了。

Mybatis 就是这么一个框架,帮助我们解决JDBC在使用上的不方便。

.

轮子Mybatis

(脱离Spring)使用初级阶段:DefaultSqlSession

  1. 配置
    对于硬编码的信息,将其维护到XML中,进行集中配置管理,。

mybatis-config.xml: 数据库连接等全局配置信息的集中管理

UserMapper.xml: SQL也维护到XML中,使其从JAVA代码中脱离出来,进行集中管理。

  1. 编码

相对于JDBC:

  • 配置集中管理,配置在xml中
  • SQL集中管理,管理在Mapper.xml中,代码中通过namespace+id的形式进行SQL的定位
  • 把连接抽象成session会话。 session的获取,统一由工厂提供,session 也做到了统一管理。
  • 参数解析,不需要了,我们只管传递参数。
  • 结果映射不用管,只管接收就完了。

将大量的编码工作,改为了配置工作。

.

仍然存在的可优化的点:

  1. SQL的定位仍然需要字符串的形式进行定位,不够优雅。
  2. session 的关闭仍然要自己关闭。

(脱离Spring)使用中级阶段:Mapper

为了解决SQL定位的问题,Mybatis还提供了Mapper功能。
通常,我们习惯用一个Dao来表示对数据库的访问操作。

UserMapper.xml

编码使用

可以看出SQL的定位,通过方法调用的方式来解决了。 这样是比较符合开发人员的开发习惯的。

.

可优化点:

  1. session需要自己关闭。

(脱离Spring)使用高级阶段:SqlsessionManager

对于session的关闭,往往是开发人员经常遗忘的东西。有时候程序是比人靠谱的。在一些不要控制session.commit的场合,能自动关闭最好。

.

解决这个问题,Mybitis还提供了一个类SqlsessionManager

实现Sqlsesion

从上图我们可以看出,SqlsessionManager是Sqlsession的实现类,也就是SqlsessionManagerDefaultSqlSession 是平级的,两个都可以表示会话。

但是

我们看到SqlsessionManager 不需要我们手动关闭session了。是不是又轻松了许多?

其实,SqlsessionManager通过AOP技术,在执行逻辑后进行了增强,使用的开发人员不必关心connection/session的关闭问题。

当然SqlsessionManager 还解决了DefaultSqlSeesion线程不安全问题。具体SqlsessionManager 是如何实现的,在后续文章中再说。

.

Spring-JDBC

大框架spring,也我们准备了一个JDBC的轮子Spring-JDBC

Spring-JDBC其实就是我们常说的:JDBCTemplate

不同于mybatis的是

  • mybatis具有更加高级的操作。mybatis是一个单独的框架存在
  • JDBCTemplate 是spring的一个模块,相对功能上比较简单
  • JDBCTemplate 是可以被spring容器进行管理的。

总结

Mybatis 通过对JDBC的封装,使我们可以更加灵活的操作数据库。
接下来,我将通过源码去探索Mybatis内部一些优秀的设计,来解开Mybatis设计的秘密。

..
.

广告 广告

评论区