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,此配置中还有封装的实体类全限定类名。

执行的SQL语句

以上为配置文件,读取配置文件所用到的技术就是所谓的解析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