美文网首页
《Mybatis技术内幕》学习笔记 (1)

《Mybatis技术内幕》学习笔记 (1)

作者: 曾泽浩 | 来源:发表于2018-10-28 23:10 被阅读0次

    来源:徐郡明《Mybatis技术内幕》

    为什么需要ORM框架呢?

    首先看看传统的JDBC编程的操作步骤

    1. 注册数据库驱动,明确指定数据库URL地址、数据库用户名、密码等连接信息

    2. 通过DriverManager打开数据库连接

    3. 通过数据库连接创建Statement对象

    4. 通过Statement对象执行SQL语句,得到ResultSet对象

    5. 通过ResultSet读取数据,并将数据转换成JavaBean对象

    6. 关闭ResultSet、Statement对象以及数据库连接,释放相关资源

    上述步骤 l ~步骤 4 以及步骤 6 在每次查询操作中都会出现,在保存、更新、删除等其他数据库操作中也有类似的重复性代码。在实践中,为了提高代码的可维护性,可以将上述重复性代码封装到 一个类似 DBUtils 的工具类中 。 步骤 5 中完成了关系模型到对象模型的转换,要使用比较通用的方式封装这种复杂的转换是比较困难的 。

    什么是ORM

    ORM(Object Relational Mapping)对象关系映射,ORM框架的主要功能就是根据映射配置文件,完成数据模型与关系模型之间的映射。除此之外,ORM还提供数据库连接池、缓存等功能。

    简单例子

    mybatis配置文件 mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/test" />
                    <property name="username" value="root" />
                    <property name="password" value="123456" />
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="mapping/userMapper.xml"/>
        </mappers>
    </configuration>
    

    实体类User.java

    package com.zzh.mybatis.entity;
    
    public class User {
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
    

    映射文件 userMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.zzh.mybatis.mapping.userMapper">
    
        <select id="getUser" parameterType="int"
                resultType="com.zzh.mybatis.entity.User">
            select * from user where id=#{id}
        </select>
    </mapper>
    

    测试类 Main

    package com.zzh.mybatis;
    
    import com.zzh.mybatis.entity.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class Main {
        public static void main(String[] args) throws IOException{
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            User user = sqlSession.selectOne("com.zzh.mybatis.mapping.userMapper.getUser", 1);
            System.out.println(user);
    
        }
    }
    
    

    Mybatis整体架构

    Mybatis整体架构

    源码中对应的目录结构:

    目录结构

    基础支持层

    反射模块

    mybatis提供了反射模块,该模块对java原生反射进行了良好封装。

    类型转换模块

    mybatis为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。另一个功能是实现JDBC类型和Java类型之间的转换,该功能在为SQL语句绑定实参以及映射查询结果集时会涉及。在为sql语句绑定实参的时候,会将数据由java类型转换为JDBC类型,而在映射结果集的时候,会将数据由JDBC类型转化为Java类型。

    日志模块

    良好日志可以帮助开发测试人员迅速定位BUG代码,目前有很多优秀日志框架例如log4j、log4j2、slf4j等,可以集成第三方的日志框架。

    资源加载模块

    主要是对类加载器进行封装,确定类加载器的使用顺序,并提供加载类文件一起其他资源文件的功能

    解析器模块

    主要提供了两个功能:一是对XPath进行封装,为MyBatis初始化时解析mybatis-config.xml配置文件提供支持;再者就是为处理动态SQL的占位符提供支持。

    数据源模块

    Mybatis自身提供了相应的数据源实现,同时也提供了与第三方数据源集成的接口。

    事务管理

    Mybatis对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。

    缓存模块

    Mybatis中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓存实现的。Mybatis中自带的这两级缓存与Mybatis以及整个应用是运行在同一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以 当需要缓存大量数据时 ,优先考虑使用 Redis 、 Memcache 等缓存产品。

    Binding模块

    Binding模块将用户自定义的Mapper接口与映射配置文件关联起来,系统可以通过调用自定义Mapper接口中的方法执行相应的SQL语句。

    核心处理层

    在核心处理层中,实现了Mybatis的核心处理流程,其中包括Mybatis的初始化以及完成一次数据库操作的涉及的全部流程。

    配置解析

    在Mybatis初始化过程中,加载Mybatis-config.xml配置文件、映射配置文件、Mapper接口中的注解信息,解析后会形成相应的对象保存到Configuration对象中。

    SQL解析与scripting模块

    MyBatis 实现动态 SQL 语句的功能,提供 了多种动态 SQL 语句对应的节点。My Batis 中的 scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL节点,并形成数据库可执行的 SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。

    SQL执行

    SQL 语句的执行涉及多个组件 ,其中比 较重要的是 Executor 、 StatementHandler 、ParameterHandler 和 R巳sultSetHandler 。 Executor 主要负责维护 一 级缓存和 二 级缓存,并提供事务管理的相关操作 ,它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过java.sql.Statement 对 象执行 SQL 语句并得到 结果集,最后通过 ResultSetHandler 完成结果集的映射 ,得到结果对象并返回 。

    SQL执行
    插件

    Mybatis 自身的功能虽然强大,但是并不能完美切 合所有 的应用场景,因此 My Batis提供了插件接口,我们可以通过添加用户自定义插件的方式对 MyBati s 进行扩展。

    接口层

    接口层相对简单,其核 心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API ,也就是上层应用与 MyBatis 交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操 作 。

    相关文章

      网友评论

          本文标题:《Mybatis技术内幕》学习笔记 (1)

          本文链接:https://www.haomeiwen.com/subject/tucvtqtx.html