• Mybatis


    Mybatis

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    核心概念

    1. 映射文件

    MyBatis的核心是映射文件(Mapper XML),它定义了SQL语句和Java方法之间的映射关系。

    
    
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2. SqlSessionFactory

    SqlSessionFactory是MyBatis的入口点,负责创建SqlSession实例。通常情况下,SqlSessionFactory会从配置文件中读取数据库连接信息和映射文件,并在应用程序启动时初始化。

    3. SqlSession

    SqlSession代表了一次数据库会话,它用于执行SQL操作和管理事务。

    4. Mapper接口

    Mapper接口定义了Java方法和映射文件中SQL语句的关系。它允许开发者使用Java方法来执行SQL查询,而不需要编写原始的SQL语句。

    public interface UserMapper {
        User getUserById(int id);
    }
    
    • 1
    • 2
    • 3

    工作原理

    1. 应用程序通过SqlSessionFactory获取SqlSession实例。
    2. SqlSession接受应用程序传递的Mapper接口调用,并根据Mapper接口的定义从映射文件中找到对应的SQL语句。
    3. SqlSession执行SQL语句,将结果映射为Java对象,并返回给应用程序。

    $和#有区别

    1、#{}是预编译处理,${}是字符串替换。

    2、Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

    3、Mybatis在处理${}时,就是把${}替换成变量的值。

    4、使用#{}可以有效的防止SQL注入,提高系统安全性。

    一级缓存和二级缓存

    Mybatis一级缓存的作用域是同一个 SqlSession,在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取,从而提高查询效率。当一个 sqlSession 结束后该 sqlSession 中的 一级缓存也就不存在了。Mybatis 默认开启一级缓存。
       Mybatis 二级缓存是多个 SqlSession 共享的,其作用域是 mapper 的同一个 namespace,不同 的 sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同即最终执行 相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis 默认没有开启二级缓存 需要在 setting 全局参数中配置开启二级缓存。

    简单记忆,一级缓存(Local Cache)是基于会话SqlSession的。二级缓存(Global Cache)是基于namespace 的,是共享的。

    分页

    MyBatis中可以通过两种方式来实现分页:基于物理分页和基于逻辑分页。

    物理分页

    物理分页是在数据库中进行分页,即直接在SQL语句中加入LIMIT语句,只查询所需的部分数据。

    
    <select id="getUsersByPage" resultType="com.junfeng.User">
       SELECT * FROM users LIMIT #{pageSize} OFFSET #{offset}
    select>
    
    • 1
    • 2
    • 3
    • 4

    逻辑分页

    逻辑分页是在查询结果集中进行分页,即先查询出全部结果,然后在内存中对结果进行分页。

    
    <select id="getAllUsers" resultType="com.junfeng.User">
       SELECT * FROM users
    select>
    
    • 1
    • 2
    • 3
    • 4
    int page = 1; // 页码
    int pageSize = 10; // 每页记录数
    int startIndex = (page - 1) * pageSize; // 计算起始索引
    
    List<User> allUsers = sqlSession.selectList("getAllUsers");
    List<User> usersOnPage = allUsers.subList(startIndex, Math.min(startIndex + pageSize, allUsers.size()));
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    mybatis中实现分页

    在mybatis中,实现分页的方式:

    1.在Mapper XML中配置分页查询

    在MyBatis的Mapper XML文件中,定义分页查询的映射。

    <select id="getUsersByPage" resultType="com.junfeng.User">
      SELECT * FROM your_table LIMIT #{offset}, #{pageSize}
    select>
    
    • 1
    • 2
    • 3

    其中,#{offset}表示起始行的偏移量,#{pageSize}表示每页的记录数。

    2.基于RowBounds

    int page = 1; // 页码
    int pageSize = 10; // 每页记录数
    int offset = (page - 1) * pageSize; // 计算偏移量
    
    RowBounds rowBounds = new RowBounds(offset, pageSize);
    List<User> users = sqlSession.selectList("getUsersByPage", null, rowBounds);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.基于PageHelper

    PageHelper会在查询前自动创建合适的分页SQL,并在查询后填充分页信息,如总记录数、总页数等。你可以通过PageInfo对象来访问这些分页信息。

    PageHelper.startPage(1, 10); // 查询第一页,每页10条记录
    List<User> users = userMapper.getUsersByPage();
    PageInfo<User> pageInfo = new PageInfo<>(users);
    
    • 1
    • 2
    • 3

    以上RowBounds为逻辑分页,PageHelper为物理分页。

  • 相关阅读:
    vue3.x中父组件添加自定义参数后,如何获取子组件$emit传递过来的参数
    USRP 简介,对于NI软件无线电你所需要了解的一切
    tuend\stratis\vdo总结和课堂案例
    奥巴马胜选演讲
    学习笔记 | 模型鲁棒性的因果框架
    Appium自动化测试基础 — ADB常用命令(一)
    Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)
    docker登录不上
    EE5811-Computer vision-Filter and resample
    LeetCode-组合总和 II
  • 原文地址:https://blog.csdn.net/qq_26347283/article/details/134266784