Mybatis-Executor执行器介绍

发布时间:2023年12月26日

🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客

🎉相关链接:MyBatis缓存机制(一级缓存,二级缓存)-CSDN博客

?每日一句:成为架构师路途遥远

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏??

目录

前言

CachingExecutor

主要功能

注意事项

案例讲解

BatchExecutor


?

前言

  • MyBatis-Executor是MyBatis框架中的一个模块,用于执行SQL语句并将结果映射到Java对象上。
  • 在MyBatis中,Executor负责处理SQL的执行过程,包括预处理SQL、参数绑定、SQL的执行和结果的映射等。通过Executor,可以实现对各种数据库的访问。

Executor的主要功能包括:

  1. SQL的预处理和参数绑定:Executor负责将XML配置文件中的SQL语句解析成可执行的PreparedStatement对象,并将参数绑定到SQL语句中。

  2. SQL的执行:Executor负责执行SQL语句,并将结果返回给调用者。在执行SQL语句之前,Executor还会进行一些额外的处理,例如,设置事务的隔离级别、设置参数等。

  3. 结果的映射:Executor负责将SQL查询的结果映射到Java对象上。在MyBatis中,可以通过XML配置文件或注解来定义结果的映射关系。

  4. 缓存的管理:在执行SQL语句时,Executor还会对查询结果进行缓存管理。当发现查询结果已经存在于缓存中时,Executor会直接从缓存中读取结果,而不再执行SQL语句。

总的来说,MyBatis-Executor是MyBatis框架中用于执行SQL语句的核心模块。它负责预处理SQL、执行SQL并将结果映射到Java对象上,同时还负责对查询结果进行缓存管理。通过Executor,可以实现简单、高效的数据库访问。Mybatis-CachingExecutor使用

CachingExecutor

  • MyBatis-CachingExecutor是MyBatis框架中的一个Executor的实现,它通过缓存机制来提高SQL查询的性能。
  • 在MyBatis中,CachingExecutor是Executor的一个装饰者(Decorator)模式。它包装了另一个Executor实现(例如SimpleExecutor),在执行SQL之前,先检查是否存在缓存的查询结果。如果存在,则直接从缓存中获取结果,而不再执行SQL语句。

主要功能

CachingExecutor的主要功能包括:

  1. 查询结果缓存:CachingExecutor会将查询结果缓存在内存中,以提高查询的性能。缓存的键(Key)由SQL语句、参数和映射结果的Java类型组成。当执行相同的SQL语句和参数时,CachingExecutor会先检查缓存中是否存在缓存结果,如果存在,则直接返回缓存结果。

  2. 缓存的策略:CachingExecutor支持多种缓存的策略,例如FIFO(先进先出)、LRU(最近最久未使用)和SOFT(软引用)。通过配置缓存的策略,可以根据应用的具体需求来调整缓存的大小和清理策略。

  3. 缓存的生命周期管理:CachingExecutor还负责管理缓存的生命周期。当执行更新操作(例如插入、更新或删除)时,CachingExecutor会清理相应的缓存。这样可以保证缓存的一致性。

注意事项

使用CachingExecutor可以有效地提高查询的性能,特别是在查询频繁、数据量较大的场景下。为了正确地使用CachingExecutor,需要注意以下几点:

  1. 配置缓存:在MyBatis的配置文件中,需要配置CachingExecutor以启用缓存。可以通过配置<cache>标签指定缓存的类型和策略。同时,还可以通过配置<cache-ref>标签将CachingExecutor应用到特定的Mapper接口或映射文件上。

  2. 查询结果的可缓存性:在使用CachingExecutor时,需要确保查询结果是可缓存的。例如,如果查询结果包含动态计算的字段或与数据库状态相关的字段,则不适合缓存。可以通过配置<resultMap>标签来控制查询结果的缓存性。

  3. 缓存的效果评估:在使用CachingExecutor之前,可以使用MyBatis提供的性能分析工具来评估缓存的效果。这样可以确定是否需要调整缓存的大小和清理策略,以达到最佳查询性能。

总的来说,通过使用MyBatis-CachingExecutor,可以在不改变业务逻辑的情况下,显著提高SQL查询的性能。但是需要根据具体的应用场景和需求来配置和管理缓存,以避免缓存引起的数据不一致性问题。

案例讲解

下面是一个使用MyBatis-CachingExecutor的代码实现示例:

// 创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

try {
    // 获取Mapper接口
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    // 第一次查询,会执行数据库查询
    userMapper.getUserById(1);

    // 第二次查询,会从缓存中获取结果,不再执行数据库查询
    userMapper.getUserById(1);

    // 更新用户信息,会清理缓存
    User user = new User();
    user.setId(1);
    user.setName("New Name");
    userMapper.updateUser(user);

    // 第三次查询,会再次执行数据库查询
    userMapper.getUserById(1);
} finally {
    sqlSession.close();
}
  • 在这个示例中,我们首先创建了一个SqlSessionFactory,并获取了一个SqlSession。然后,通过SqlSession的getMapper()方法获取了一个Mapper接口实例。我们使用getUserById()方法进行查询操作。
  • 第一次查询时,会执行数据库查询,并将结果缓存起来。第二次查询时,会直接从缓存中获取结果,而不再执行数据库查询。
  • 接下来,我们更新了用户信息,并调用updateUser()方法进行更新操作。更新操作会导致相应的缓存被清理。
  • 最后,我们再次执行查询操作,此时会再次执行数据库查询。
  • 通过使用MyBatis-CachingExecutor,我们可以看到在第二次查询时,不再执行数据库查询,而是直接从缓存中获取结果,从而提高了查询的性能。
  • 需要注意的是,在实际使用中,需要根据具体的需求和场景来配置和管理缓存,以避免数据不一致性和缓存过期的问题。

BatchExecutor

  • MyBatis-BatchExecutor是MyBatis框架中的一个执行器(Executor),用于支持批量操作数据库。它可以将多个SQL语句一起发送给数据库执行,从而提高数据库操作的效率。
  • 可以通过在配置文件(mybatis-config.xml)中配置使用BatchExecutor来启用批量操作。需要设置<setting name="executorType" value="BATCH" />来指定执行器类型为BATCH。

下面是一个使用MyBatis-BatchExecutor的代码实现示例:

// 创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);

try {
    // 获取Mapper接口
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    // 批量插入用户
    List<User> userList = new ArrayList<>();
    for (int i = 1; i <= 1000; i++) {
        User user = new User();
        user.setId(i);
        user.setName("User " + i);
        userList.add(user);
    }
    userMapper.insertUsers(userList);
    
    // 提交事务
    sqlSession.commit();
} finally {
    sqlSession.close();
}
  • 在这个示例中,我们首先创建了一个SqlSessionFactory,并通过openSession()方法获取了一个SqlSession,同时指定了执行器类型为BATCH。
  • 然后,我们使用getMapper()方法获取了一个Mapper接口实例,并创建了一个包含1000个用户的List。
  • 接下来,通过调用insertUsers()方法,将1000个用户一次性地插入到数据库中。这个操作会使用批量执行器进行批量插入,而不是每个用户都执行一次插入操作。
  • 最后,我们通过调用commit()方法提交事务,完成批量插入操作。
  • 通过使用MyBatis-BatchExecutor,我们可以将多个数据库操作批量执行,从而减少了数据库交互次数,提高了数据库操作的效率。这在需要批量插入、更新或删除大量数据时特别有用。需要注意的是,批量操作可能会对数据库资源产生较大的压力,需要根据具体的场景和需求来合理使用。

文章来源:https://blog.csdn.net/qq_31536117/article/details/135199757
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。