手写实现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)

版权声明:本文为windyCoding原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/windyCoding/p/12811093.html