前言
开发过程中,鉴于直接用JDBC与数据库交互存在数据库连接频繁创建和释放、sql硬编码、维护不方便等原因,通常我们会使用持久层框架来完成应用层和数据库的交互。最熟悉的持久层框架莫过于ibatis、mybatis和hibernate框架。当然了这个文章不是教你如何使用某个框架,而是自定义持久层框架、带你理解数据库交互的一些细节。这个框架参考了mybatis的设计思路。
一、自定义持久化框架思路是什么?
1.框架定位
首先我们需要明确一点:自定义持久层框架不是直接和数据库交互,我们还是利用JDBC来实现数据交互。我们可以这么理解,我们只是在JDBC和应用层之间又加了一层,目的就是为了解决JDBC现存的硬编码、难以维护、连接频繁创建和销毁带来的资源浪费和性能缺陷。
2.JDBC存在问题及其解决
(1)使用数据库连接池初始化连接资源。
(2)将sql语句抽取到配置文件。
(3)使用反射和内省等技术,将实体属性和表字段进行映射。
3.框架设计思路
(1)使用端
提供核心配置文件:miracleFrameConfig.xml:存放数据源信息,引入mapper.xml(用来配置sql的一个xml文件)。
提供sql配置文件:配置一些sql信息
(2)框架端
a.读取配置文件
配置文件需要转化成java bean的形式,所以我们定义两个bean对应上面的两个配置文件。
Configuration:数据库的配置信息、还要定义一个map 来存放 mapper的解析出来sql. Map<唯一标识,Mapper>。那唯一标识如何选取呢?因为可能有多个mapper文件。并且一个mapper文件中可以有很多的 sql.所以唯一标识我们需要是文件的唯一标识加上该文件里的sql的唯一标识。我们看图应该能理解更透彻一点。
MappedStatement:sql语句、statement类型、输入参数java类型、输出参数java类型。
b.解析配置文件
创建sqlSessionFactoryBuider类 :
方法:sqlSessionFactory build(0方法:
第一:使用dom4j来解析配置文件。封装到configuration和mappedStatement中。
第二:创建sqlSessionFactory实现类DefaultSqlSession。
c.创建sqlSessionFactory:
创建SqlSessionFactory。sqlSessionFactory属于工厂类,用来生产sqlSession的工厂类。因为所有的交互都是sqlSession来完成。
方法:openSession():
d.创建sqlSession接口及其实现类,主要是实现crud方法。
二、实现步骤
1.自定义框架
目录结构:
然后我们一步步解读:
(1)我们需要读取配置xml文件为字节流。
2.解析字节流封装到配置文件对应的java配置bean中。也就是Configuration类和MapperAnalyze类。具体过程我已经在代码里面注释。
首先我们看一下我们使用框架时候配置文件应该长什么样子,我们就能够理解我们怎么配这个配置文件了。
解析xml配置文件代码:
构建sqlSessesion工厂:
构建sqlSession并实现crud接口
具体如何实现crud,可以到源码里面看一下。其实是用了执行器来实现。Excutor类来调用JDBC方法。
可以对照着实现思路一步一步看下去。
当然了。源码我放在了gitee上。https://gitee.com/bizq/lago-homework/tree/master/code/%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5/
可以参考。
总结
加油吧!