Mybatis源码分析(01)-JDBC操作回顾,Mybatis整体架构概览

一 JDBC的规范操作及问题回顾

假设数据库test中有一张表account

直接使用JDBC,dao层的实现类可能会是如下的写法:

public class AccountDaoImpl implements AccountDao {
    //问题1:数据库配置信息,存在硬编码问题,修改信息就要重新编译
    private String driver = "com.mysql.jdbc.driver";
    private String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
    private String username = "root";
    private String password = "root";


    public List<Account> findAll() throws Exception{
        //注册mysql驱动
        Class.forName(driver);

        //问题2:频繁获取/释放数据库连接
        Connection connection = DriverManager.getConnection(url, username, password);

        //问题3:sql语句存在硬编码,改动sql语句需要改动,另外拼接不同条件的sql语句,填充参数都比较繁琐。
        String sql = "select * from account";
        //String sql = "select * from account where cardNo=?"

        //获取操作数据库的预处理对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        //preparedStatement.setInt(1,2);
        
        List<Account> accountList = new ArrayList<Account>();

        //问题4:需要手动解析结果集,如果表中的列很多会很繁琐
        while (resultSet.next()) {
            Account account = new Account();
            account.setCardNo(resultSet.getString("cardNo"));
            account.setName(resultSet.getString("name"));
            account.setMoney(resultSet.getInt("money"));
            accountList.add(account);
        }
        resultSet.close();
        preparedStatement.close();
        connection.close();
        return accountList;

    }
}

从中可以分析出一些问题,并且我们也可以发现已有的对应解决方案:

  1. 数据库配置信息,存在硬编码问题。

    解决:将配置信息写入配置文件中,而Mybatis就有配置解析的功能,可以在运行时解析配置文件。

  2. 每次调用dao层方法都要建立和关闭数据库连接,影响数据库和应用的性能。

    解决:利用数据库连接池。

  3. 与sql语句有关的问题:

    (1) sql语句硬编码。

    解决:Mybatis提供了sql解析的功能,允许调用方使用映射配置文件或者注解来编写sql语句。

    (2) 使用?占位符进行参数的填充方式较为繁琐。

    解决:Mybatis提供了参数映射的功能,允许调用方使用#{}或${}占位符,直接在{}中写要传入的参数。

    (3) 在实际业务中,对同一数据集的查询条件可能是动态变化的,根据不同那个条件拼接SQL语句是一件非常麻烦的事情。

    解决:Mybatis提供了动态sql功能,使拼接sql变得更加轻松。

  4. 需要手动解析结果集,如果表中的列很多会很繁琐。

    解决:基于ORM,Mybatis提供了结果集映射的功能,调用方不需要手动解析结果集。

    ORM(Object Relational Mapping,对象-关系映射),包含对象->关系数据和关系数据->对象两方面映射。Mybatis实际上只完成了关系数据->对象,也就是结果集映射的功能,并没有完成对象->关系数据映射,不能像Hibernate一样通过操纵java对象实现操纵数据库表的目的,依然要编写sql语句,因此Mybatis也被认为是半自动的ORM框架。

Mybatis本质上也就是对jdbc进行了封装,但是它作为一个框架而非工具类,必定有它的强大之处。jdbc的这些解决方案中提到的Mybatis功能,会在之后章节的源码分析中分别提及,接下来先对Mybatis的整体架构做一个概览。

二 Mybatis整体架构概览

Mybatis的设计也遵循了模块化和分层的思想,整体架构分为三层,如下图所示:Mybatis源码分析(01)-JDBC操作回顾,Mybatis整体架构概览_第1张图片
接口层:核心是SqlSession接口,是上层应用和Mybatis交互的桥梁。SqlSession的创建过程还涉及SqlSessionFactoryBuilder和SqlSessionFactory,前者利用建造者模式创建后者,而后者是“单个数据库映射关系经过编译后的内存镜像”。SqlSession接收调用请求后,会调用核心处理层的相应模块进行具体的数据库操作。

核心处理层:这一层基本上包含了上一节中提到了mybatis的功能,体现了完成一次数据库操作所涉及的全部流程。

基础支持层:这一层包含了Mybatis的基础模块,为核心处理层的功能提供了良好的支持。

参考资料

徐郡明.mybatis技术内幕[m].北京:电子工业出版社,2017.

你可能感兴趣的:(#,java,Mybatis)