Halo Tech

JDBC与MyBatis:数据库访问技术的对比与选择(一)

  在软件开发领域,数据库交互是不可或缺的一环。JDBC与MyBatis作为Java平台上两种常见的数据库访问技术,各自拥有独特的优势和适用场景。JDBC作为Java标准库的一部分,提供了基础的数据库访问接口,但开发者需要手动处理大量底层细节,增加了开发和维护的复杂度。相比之下,MyBatis则是一个高级的持久层框架,它通过XML配置或注解的方式简化了Java应用程序与数据库之间的交互,封装了JDBC的底层细节,提高了开发效率。接下来,我们将进一步探讨JDBC与MyBatis的详细对比及其在实际应用中的优缺点。

一、JDBC的如何返回结果,底层原理是什么?

之前的文章已经对JDBC做过详细的介绍(如果有需要可以查看之前JDBC相关文章),此处不再做过多说明,简单总结一下,JDBC通过加载驱动、建立连接、创建和执行SQL语句、处理结果集以及关闭资源等步骤来实现与数据库的交互。其底层原理涉及Java类加载、数据库连接管理、SQL语句执行和结果集处理等多个方面。

二、Mybatis的如何返回结果,底层原理是什么?

    MyBatis底层原理深度解析:从SqlSessionFactory到查询结果的完整旅程

在Java的持久层框架中,MyBatis以其高效、简洁的特点赢得了众多开发者的青睐。其底层原理主要围绕两大核心组件——SqlSessionFactory和SqlSession展开,它们共同协作,完成了从配置文件加载到查询结果返回的完整流程。

SqlSessionFactory的构建与配置文件加载

1、取与解析:MyBatis首先通过SqlSessionFactoryBuilder读取并解析配置文件(通常为XML格式的mybatis-config.xml)。这个配置文件包含了数据库连接信息、事务管理器配置、映射文件位置以及插件配置等关键信息。

2、映射文件的加载:在配置文件中,会引用一个或多个映射文件(通常为XML格式的mapper.xml)。这些映射文件定义了SQL语句的映射关系,包括查询语句、参数映射以及结果映射。MyBatis会解析这些映射文件,生成对应的映射配置。

3、SqlSessionFactory的创建:基于配置文件和映射文件的解析结果,MyBatis创建一个SqlSessionFactory对象。这个对象是一个重量级的工厂类,用于创建SqlSession实例。

SqlSession的创建与SQL语句的执行

4、SqlSession的实例化:通过SqlSessionFactory的openSession方法,可以创建一个SqlSession对象。SqlSession提供了执行SQL操作的方法,是MyBatis与数据库交互的入口。

5、SQL语句的执行:在SqlSession中,可以调用各种方法执行SQL语句,如查询(selectOne、selectList)、插入(insert)、更新(update)和删除(delete)等。这些方法背后实际上是通过Executor对象来执行的。

6、Executor的执行机制:SqlSession内部维护了一个Executor对象,它是MyBatis执行SQL语句的核心组件。Executor有两种常见的实现:SimpleExecutor和ReuseExecutor(还有其他如BatchExecutor等)。SimpleExecutor每次执行都会创建一个新的Statement对象,而ReuseExecutor则会重用已有的Statement对象,以提高性能。

7、处理参数、执行SQL与结果映射:在执行SQL语句时,SqlSession会利用ParameterHandler将Java对象中的参数传递给Statement。然后,StatementHandler负责处理SQL语句的创建和执行。当执行查询语句时,ResultSetHandler会负责将查询结果映射到Java对象。这三个处理器共同协作,完成了从参数传递到结果返回的整个过程。

映射文件(mapper.xml)的详细作用

8、SQL语句的定义:在映射文件中,开发者可以通过XML标签定义各种SQL语句,包括查询语句、插入语句、更新语句和删除语句等。这些SQL语句会与Java方法绑定,实现SQL与Java代码的解耦。

9、命名空间的引用:映射文件中通常包含一个命名空间(namespace),它用于区分不同的映射文件。命名空间的值通常与对应的Mapper接口的全限定名相同,以便MyBatis能够准确地找到并执行对应的SQL语句。

10、参数映射与结果映射:在映射文件中,开发者可以通过parameterType属性定义参数的类型,通过resultType或resultMap属性定义结果的映射关系。这些信息帮助MyBatis将Java对象与数据库表进行映射,实现了对象与数据库之间的无缝转换。

执行流程的详细概述

11、SqlSessionFactoryBuilder加载配置文件:首先,通过SqlSessionFactoryBuilder读取并解析配置文件,生成SqlSessionFactory对象。

12、SqlSessionFactory创建SqlSession:然后,通过SqlSessionFactory的openSession方法创建SqlSession对象。这个对象提供了执行SQL操作的方法。

13、SqlSession执行SQL语句:在SqlSession中,调用相应的方法执行SQL语句。这些方法背后实际上是通过Executor对象来执行的。在执行过程中,ParameterHandler负责传递参数,StatementHandler负责处理SQL语句的创建和执行,而ResultSetHandler则负责将查询结果映射到Java对象。

14、结果返回与SqlSession关闭:最后,MyBatis将查询结果映射到Java对象并返回给调用者。完成操作后,需要关闭SqlSession以释放资源。

示例代码与详细解释

// 加载配置文件并创建SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
// 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession();
try { // 执行查询操作 // "getUserById"是映射文件中定义的查询语句的ID // 1是传递给查询语句的参数值 User user = sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", 1);
// 对查询结果进行处理(例如,打印用户信息) System.out.println(user); } finally { // 关闭SqlSession以释放资源 sqlSession.close(); }

Image

这个流程图和描述提供了MyBatis底层原理和执行流程的清晰概述,有助于理解MyBatis是如何工作的。

本文对比了JDBC与MyBatis两种数据库访问技术,指出JDBC虽为基础但复杂,而MyBatis则封装了JDBC细节,提高了开发效率。文章深入解析了MyBatis的底层原理,包括SqlSessionFactory与SqlSession的构建、SQL语句的执行及结果映射等,展示了MyBatis从配置文件加载到查询结果返回的完整流程,强调了其高效简洁的特点。后面文章我会通过多属性特点详细对比两个数据库访问方式的区别。