Mybatis的简单分析

Posted Sitr-摸鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis的简单分析相关的知识,希望对你有一定的参考价值。

设计模式分析
1.读取配置文件

读取配置文件有两种方式:

使用类加载器,它只能读取类路径的配置文件

使用ServletContext对象的getRealPath()

2.创建SQLSessionFactory工厂

创建工厂使用的构建者模式。 SqlSessionFactory即为构建者,它会处理一切构建。把配置文件输入流放进去,即可创建对象。把对象的创建细节隐藏,使用者可直接拿到对象。

3.使用工厂生产SqlSession对象

生产SqlSession使用了生产模式,可以解耦,降低类之间的依赖关系。无须重新编码。

4.使用SqlSession创建Dao接口的代理对象

getMapper,创建Dao接口实现类使用了代理模式,可以在不修改源码的基础上对已有方法增强。

5.使用代理对象执行方法

6.释放资源

// 注意要把对象映射到实体类中

Mybatis注解开发
把IUserDao.xml移除,在dao接口的方法上使用@Select注解。

同时需要再SqlMapConfig.xml的mapper上使用class注解

编写Dao实现类的方式
仍然支持Dao实现类,但是太 tm 麻烦。这里就不展示了。

自定义Mybatis的分析
Mybatis在使用代理Dao的方式实现增删改查时在做什么事呢?

其实它只做了俩件事:

		1.创建代理对象

		2.执行selectList

dataSource用于配置数据库的基本信息
技术图片

映射配置信息

技术图片

用于执行的sql语句,可获取preparedStatement,此配置中还有封装的实体类全限定类名。

技术图片

以上为配置文件,读取配置文件所用到的技术就是所谓的解析XML技术,此处所用的为dom4j解析xml的技术。

简单解释:
SelectList方法:

根据配置文件的信息创建Connection对象。注册驱动,获取连接。

获取预处理对象PreparedStatement。此时需要SQL语句。

conn.prepareStatement(sql);

执行查询。

ResultSet resultSet = preparedStatement.executeQuery();其返回的对象是ResultSet类型

遍历结果集用于封装

首先 我们会需要有个List队列来便利。

List list = new ArrayList();

while(resultSet.next()){

? E element = (E)CLass.forName(配置的全限定类名).newInstance;//此处就可以放入用于接受的类

? //进行封装,把每个ResultSet的内容都添加到element中
//我们实体类的属性和表中的列名是一致的,因此我们可以把列名看成实体类的属性名称,通过反射的方式来根据名称获取每个属性,并把值附进去。

//把element加入到list中
list.add(element);

}

List list = new ArrayList();
?
while(resultSet.next()){
?
? E element = (E)CLass.forName(配置的全限定类名).newInstance;//此处就可以放入用于接受的类
?
? //进行封装,把每个ResultSet的内容都添加到element中
//我们实体类的属性和表中的列名是一致的,因此我们可以把列名看成实体类的属性名称,通过反射的方式来根据名称获取每个属性,并把值附进去。

//把element加入到list中
list.add(element);

?
}
?
返回list

return list;

要想让selectList方法执行,需给方法提供两个信息。

连接信息

映射信息

执行的SQL语句

封装结果的实体类全限定类名

可把映射信息的两部分定义成一个对象,从而重复使用。我们暂称之为,Mapper。

String Mapper
com.Sitr.dao.IUserDao Mapper对象
findAll String sql/String domainClassPath
以上 SelectList的部分则已经全部组装完成。

创建代理对象的分析
在前面,我们使用了如下语句来创建Dao接口的代理对象。

IUserDao userDao = session.getMapper(IUserDao.class);
在这里,我们使用了反射机制。

//根据dao接口的字节码创建Dao的代理对象
public T getMapper(Class daoInterfaceClass){
/**
类加载器:它使用的和被代理对象是相同的类加载器
代理对象要实现的接口:和被代理对象相同的接口
如何代理:增强的方法,需要自己提供。
此处是一个InvocationHandler的接口,在这里需要自己写一个该接口的实现类,在实现类中调用selectList方法。
*/

Proxy.newProxyInstance(类加载器,代理对象要实现的接口字节码数组,如何代理);

}

以上是关于Mybatis的简单分析的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis源码分析

Mybatis源码分析三-数据源模块分析,工厂模式的使用

MyBatis源码分析-MyBatis初始化流程

MyBatis源码分析-MyBatis初始化流程

markdown [mybatis参考]关于mybatis #mybatis的一些片段

Mybatis 系列2