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(类加载器,代理对象要实现的接口字节码数组,如何代理);

}

原文地址:https://www.cnblogs.com/sitr/p/12563292.html

时间: 2024-10-08 16:53:09

Mybatis的简单分析的相关文章

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

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis初始化的过程也就是创建Configura

MyBatis源码分析-SQL语句执行的完整流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

【MyBatis源码分析】select源码分析及小结

示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是select. 本文研究一下select的实现流程,示例代码为: 1 public void testSelectOne() { 2 System.out.println(mailDao.selectMailById(8)); 3 } selectMailById方法的实现为: 1 public M

MyBatis拦截器的执行顺序引发的MyBatis源码分析

你猜一下哪个先执行?反正不要按常规来. 1 <plugins> 2 <plugin interceptor="com.Interceptor1"></plugin> 3 <plugin interceptor="com.Interceptor2"></plugin> 4 </plugins> 之前看有的博客分析源码,都没提到这一点.之前我只是用一下而已,这个顺序测试一下其实结论也很容易获得,但是

SSM框架整合(Spring+SrpingMVC+Mybatis) 简单案例

简介: SSM框架是Spring,SpringMVC 和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,dao层四层. Spring实现对业务对象的管理,SpirngMVC负责请求的转发和视图管理,Mybatis作为数据对象的持久化引擎. 简单案例: 一,创建web项目,建好项目结构目录(controller,service,mapper等目录),引入所需的jar包并配置tomcat 这里放上最终的项目结构: pom.xml(继承于

MyBatis 源码分析 - 配置文件解析过程

* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上.下面,我们来一起看一下本篇文章的目录结构. 从目录上可以看出,2.3节.2.5节和2.8节的内容比较多.其中2.3节是关于settings配置解析过程的分析,除了对常规的 XML 解析过程分析,本节额外的分析了元

MyBatis 源码分析 - 插件机制

1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 MyBatis 为例,我们可基于 MyBatis 插件机制实现分页.分表,监控等功能.由于插件和业务无关,业务也无法感知插件的存在.因此可以无感植入插件,在无形中增强功能. 开发 MyBatis 插件需要对 MyBatis 比较深了解才行,一般来说最好能够掌握 MyBatis 的源码,门槛相对较高.本篇

Mybatis源码分析

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

FFmpeg源代码简单分析:avformat_alloc_output_context2()

本文简单分析FFmpeg中常用的一个函数:avformat_alloc_output_context2().在基于FFmpeg的视音频编码器程序中,该函数通常是第一个调用的函数(除了组件注册函数av_register_all()).avformat_alloc_output_context2()函数可以初始化一个用于输出的AVFormatContext结构体.它的声明位于libavformat\avformat.h,如下所示. /** * Allocate an AVFormatContext