设计模式分析
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