手写实现Mybatis
手写实现Mybatis —>单表查询
1. Mybatis核心概念
名称 | 意义 |
---|---|
Configuration | 管理mysql-config.xml 全局配置关系类 |
SqlSessionFactorySession | 管理工厂接口SessionSqlSession |
Session | SqlSession 是一个面向用户(程序员)的接口。SqlSession 中提 |
Executor | 作用:SqlSession 内部通过执行器操作数据库 |
MappedStatement | 底层封装对象,作用:对操作数据库存储封装,包括 sql 语句、输入输出参数 |
StatementHandler | 具体操作数据库相关的 handler 接口 |
ResultSetHandler | 具体操作数据库返回结果的 handler 接口 |
2. Mybatis处理流程图
-
各层包搭建树状图
-
│ │ │ └─com │ │ │ └─mybatis │ │ │ ├─binding | | | └─ MapperMethod.class | | | ├─ MapperProxy.class | | | └─ MapperRegister.class │ │ │ ├─executor | | | └─ MapperMethod.class | | | ├─ MapperProxy.class | | | └─ MapperRegister.class │ │ │ ├─resultset | | | └─ DefaultResultHandler.class | | | └─ ResultSetHandler.class │ │ │ ├─session | | | └─ Configuration.class | | | ├─ DefaultSQLSession.class | | | ├─ SQLSession.class | | | ├─ SQLSessionFactory.class | | | └─ sqlSessionFactoryBuilder.class │ │ │ └─statement │ │ │ └─ StatementHandler.class | | | │ │ └─resources │ │ └─mybatis │ └─test │ └─java │ └─com │ └─qitian │ ├─mapper │ └─pojo
3. Mybatis 实现的主要类
-
Configuration
-
SqlSessionFactory
-
Executor
1. Configuration
configuration类的作用主要是读取mybatis-congig.xml的配置文件,以及mapper注册(将配置文件的XXXMapper.xml存储到一个Map集合中)。
Mappper注册
MapperRegister.class
@Data
public class MapperRegister {
private Map<String, MapperMethod> knownMappers = new HashMap<String, MapperMethod>();
}
Configuration.class
/**
* 读取xml文件
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Configuration {
/**
* 定义io 读取xml文件
*/
private InputStream inputStream;
private MapperRegister mapperRegister = new MapperRegister();
public void loadCOnfigurations() throws Exception {
try {
Document document = new SAXReader().read(inputStream);
Element root = document.getRootElement();
//读取mappers下配置的mapper
List<Element> mappers = root.element("mappers").elements("mapper");
for (Element mapper : mappers) {
//获取mapper里的属性resource
/**
<!--mapper映射-->
<mappers>
<mapper resource="XXXMapper.xml"/>
</mappers>
*/
if (mapper.attribute("resource") != null) {
mapperRegister.setKnownMappers((Map<String, MapperMethod>) loadXMLConfiguration(mapper.attributeValue("resource")));
}
if (mapper.attribute("class") != null) {
}
}
} catch (DocumentException e) {
System.out.println("读取配置文件出错");
e.printStackTrace();
} finally {
inputStream.close();
}
}
/**
* 读取XXXMapper.xml的信息
*
* @param reource
* @return
*/
private Object loadXMLConfiguration(String reource) throws Exception {
Map<String, MapperMethod> map = new HashMap<String, MapperMethod>();
InputStream is = null;
try {
//获取XXXMapper.xml文件
is = this.getClass().getClassLoader().getResourceAsStream(reource);
Document document = new SAXReader().read(is);
Element root = document.getRootElement();
if (root.getName().equalsIgnoreCase("mapper")) {
//读取mapper中的命名空间
String namespace = root.attribute("namespace").getText();
//读取查询方法的关键字select
for (Element select : (List<Element>) root.elements("select")) {
MapperMethod mapperMethod = new MapperMethod();
mapperMethod.setSql(select.getText().trim());
//获取返回值的类型
mapperMethod.setType(Class.forName(select.attribute("resultType").getText()));
map.put(namespace + "." + select.attribute("id").getText(), mapperMethod);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
is.close();
}
return map;
}
}
2. SqlSessionFactory
SqlSessionFactory利用SqlSessionFactoryBuilder.builer(configuration)方法创建对象,将configuration作为参数传入,以便获取mybatis-config.xml的信息,该类的主要作用是用于构建SqlSession对象,SqlSession对象可以通过方法openSession获得。(sqlSessionFactory.openSession(configuration)