MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis的核心是映射文件(Mapper XML),它定义了SQL语句和Java方法之间的映射关系。
SqlSessionFactory是MyBatis的入口点,负责创建SqlSession实例。通常情况下,SqlSessionFactory会从配置文件中读取数据库连接信息和映射文件,并在应用程序启动时初始化。
SqlSession代表了一次数据库会话,它用于执行SQL操作和管理事务。
Mapper接口定义了Java方法和映射文件中SQL语句的关系。它允许开发者使用Java方法来执行SQL查询,而不需要编写原始的SQL语句。
public interface UserMapper {
User getUserById(int id);
}
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>
逻辑分页是在查询结果集中进行分页,即先查询出全部结果,然后在内存中对结果进行分页。
<select id="getUsersByPage" resultType="com.junfeng.User">
SELECT * FROM users LIMIT #{offset}, #{pageSize}
select>
在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为物理分页。