Mybatis

Mybatis

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

核心概念

1. 映射文件

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

<!-- 示例映射文件 -->
<mapper namespace="com.junfeng.UserMapper">
  <select id="getUserById" resultType="com.junfeng.User">
    SELECT * FROM users WHERE id = #{id}
  </select>
</mapper>

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. 应用程序通过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语句,只查询所需的部分数据。

<!-- MyBatis的Mapper XML中 -->
<select id="getUsersByPage" resultType="com.junfeng.User">
   SELECT * FROM users LIMIT #{pageSize} OFFSET #{offset}
</select>

逻辑分页

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

<!-- MyBatis的Mapper XML中 -->
<select id="getAllUsers" resultType="com.junfeng.User">
   SELECT * FROM users
</select>
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()));

mybatis中实现分页

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

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

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

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

其中,#{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);

3.基于PageHelper

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值