Mybatis面试题

mybatis工作流程

1. 读取配置文件

MyBatis 需要加载 核心配置文件 mybatis-config.xml映射文件 XXXMapper.xml

  • mybatis-config.xml:配置数据库连接、环境信息、插件等。
  • XXXMapper.xml:定义 SQL 语句、参数映射和结果映射

示例:mybatis-config.xml

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

2. 创建 SqlSessionFactory

MyBatis 通过 SqlSessionFactoryBuilder 解析 mybatis-config.xml 并创建 SqlSessionFactory

示例代码:

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory作用:

  • 维护数据库连接池
  • 解析 Mapper 映射文件
  • 提供 SqlSession 进行数据库操作

3. 获取 SqlSession

SqlSession 是 MyBatis 操作数据库的核心对象,提供 SQL 执行方法,如:

  • selectOne():查询单个对象
  • selectList():查询列表
  • insert()update()delete()

示例代码:

SqlSession sqlSession = sqlSessionFactory.openSession();
  • openSession(true) 表示自动提交事务
  • openSession(false) 需要手动提交事务

4. 获取 Mapper

MyBatis 通过 动态代理 方式创建 Mapper 接口的实现类,并映射 SQL 语句。

示例代码:

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  • UserMapper接口
  • MyBatis 自动生成代理对象 负责执行 SQL

5. 执行 SQL 语句

调用 Mapper 接口的方法,MyBatis 会:

  1. 匹配 Mapper.xml 里的 SQL
  2. 填充参数
  3. 执行 SQL 并返回结果

示例:UserMapper.java

public interface UserMapper {
    User getUserById(int id);
}

示例:UserMapper.xml

<select id="getUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>

调用方法

User user = userMapper.getUserById(1);
System.out.println(user);

SqlSession

作用范围:

SqlSession 代表 一次数据库会话(Session),其作用范围通常是 方法级、请求级或事务级,具体取决于使用方式。一般来说,SqlSession 的作用范围不应该跨线程共享,通常应遵循 "用完即关闭" 的原则

Executor 与 SqlSession 的关系

SqlSession 是 MyBatis 中的一个会话对象,负责管理数据库操作的生命周期。

SqlSession 内部通过 Executor 执行实际的 SQL 语句。

MyBatis 缓存简介

一级缓存(Local Cache)

属于会话(Sqlsession)

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 第一次查询,查询数据库
User user1 = userMapper.getUserById(1);

// 第二次查询,直接从缓存中读取
User user2 = userMapper.getUserById(1); 

sqlSession.close();  // 一级缓存被清空

二级缓存(Second Level Cache)

(1) 二级缓存的作用范围

  • 二级缓存是 MyBatis 提供的全局缓存,作用范围是 SqlSessionFactory。即不同的 SqlSession 实例可以共享二级缓存。
  • 二级缓存可以跨 SqlSession 使用,它的设计是为了提高性能,减少数据库访问次数。

(2) 二级缓存的工作原理

  • 当查询某个数据时,MyBatis 会首先查看 一级缓存,如果没有命中,就会查 二级缓存
  • 如果二级缓存也没有,才会查询数据库。
  • 查询结果会被存入二级缓存,供其他 SqlSession 使用。

(3) 启用二级缓存

<configuration>
    <settings>
        <!-- 启用二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

(4) 缓存的清除策略

SqlSession关闭时:一级缓存会自动清除

qlSessionFactory 关闭时:所有缓存会被清除

物理分页和逻辑分页

逻辑分页:需要先获取所有数据,再根据请求的页数在应用层进行切割和展示

物理分页:使用limit进行分页

PageHelper分页的原理是什么

  1. 当我们在代码中使用PageHelper.startPage(int pageNum, int pageSize)设置分页参数之后,其实PageHelper会把他们存储到ThreadLocal中。

  2. PageHelper会在执行器的query方法执行之前,会从ThreadLocal中再获取分页参数信息,页码和页大小,然后执行分页算法,计算需要返回的数据块的起始位置和大小。最后,PageHelper会通过修改SQL语句的方式,在SQL后面动态拼接上limit语句

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇