<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
MyBatis: 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis-Plus: 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis: 适用于对 SQL 有较高要求的复杂项目,需要更多的自定义和灵活性。
MyBatis-Plus: 适用于快速开发中小型项目,特别是对开发效率有较高要求的场景
代码对比
mybatis : 需要xml实现类
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Integer id);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int insert(User user);
}
MyBatis-Plus: 不需要xml文件
public interface UserMapper extends BaseMapper<User> {
// 直接继承 BaseMapper 即可获得基本的 CRUD 方法
}
通过以上对比,可以看出 MyBatis-Plus 在 MyBatis 的基础上提供了更多的便捷性和扩展性,适合快速开发和提高效率。
MyBatis核心概念
SqlSessionFactory:
作用: 用于创建 SqlSession 对象,是 MyBatis 的核心对象之一。
创建方式: 通常通过 SqlSessionFactoryBuilder 来创建。
SqlSession:
作用: 用于执行 SQL 语句,管理事务,获取 Mapper 接口的代理对象。
使用方式: 通过 SqlSessionFactory.openSession() 方法获取。
Mapper:
作用: 定义了数据库操作的方法,通常是一个接口。
配置方式: 通过 XML 文件或注解来配置 SQL 语句。
SqlSessionFactoryBuilder:
作用: 用于构建 SqlSessionFactory 对象。
使用方式: 读取配置文件或配置类,构建 SqlSessionFactory。
Configuration:
作用: 包含了 MyBatis 的全局配置信息,如数据源、事务管理器、映射文件等。
配置方式: 通过 XML 文件或 Java 配置类进行配置。
TypeHandler:
作用: 用于处理 Java 类型和 JDBC 类型之间的转换。
配置方式: 可以在 XML 配置文件中或通过注解进行配置。
ResultMap:
作用: 用于定义结果集映射规则,将查询结果映射到 Java 对象。
配置方式: 通过 XML 文件中的 <resultMap> 标签进行配置。
Plugin:
作用: 用于拦截 MyBatis 的内部方法,实现自定义的功能,如分页、日志记录等。
配置方式: 通过 XML 文件中的 <plugins> 标签进行配置。
MyBatis底层逻辑使用的类
1.SqlSessionFactoryBuilder
作用: 用于构建 SqlSessionFactory 对象。
主要方法:
build(InputStream inputStream): 从输入流中读取配置文件并构建 SqlSessionFactory。
build(InputStream inputStream, String environment): 指定环境配置。
build(InputStream inputStream, Properties properties): 指定属性配置。
2. SqlSessionFactory
作用: 用于创建 SqlSession 对象。
主要方法:
openSession(): 打开一个新的 SqlSession。
openSession(boolean autoCommit): 打开一个新的 SqlSession 并指定是否自动提交事务。
openSession(Connection connection): 使用现有的连接打开一个新的 SqlSession。
3. SqlSession
作用: 用于执行 SQL 语句,管理事务,获取 Mapper 接口的代理对象。
主要方法:
selectList(String statement): 执行查询操作,返回结果列表。
selectOne(String statement): 执行查询操作,返回单个结果。
insert(String statement): 执行插入操作。
update(String statement): 执行更新操作。
delete(String statement): 执行删除操作。
getMapper(Class<T> type): 获取 Mapper 接口的代理对象。
4. Configuration
作用: 包含了 MyBatis 的全局配置信息,如数据源、事务管理器、映射文件等。
主要属性:
environments: 环境配置。
mappers: 映射器配置。
typeAliases: 类型别名配置。
typeHandlers: 类型处理器配置。
objectFactory: 对象工厂配置。
plugins: 插件配置。
5. Executor
作用: 执行 SQL 语句的执行器。
主要实现:
SimpleExecutor: 简单执行器,每次执行 SQL 都会创建新的 PreparedStatement。
ReuseExecutor: 重用执行器,会重用 PreparedStatement。
BatchExecutor: 批处理执行器,用于批量执行 SQL 语句。
6. MapperProxy
作用: 用于生成 Mapper 接口的动态代理对象。
主要方法:
invoke(Object proxy, Method method, Object[] args): 调用 Mapper 接口方法时的代理逻辑。
7. MapperRegistry
作用: 管理 Mapper 接口的注册和解析。
主要方法:
addMapper(Class<T> type): 注册 Mapper 接口。
getMapper(Class<T> type, SqlSession sqlSession): 获取 Mapper 接口的代理对象。
8. MappedStatement
作用: 表示一个映射的 SQL 语句,包含了 SQL 语句的信息和配置。
主要属性:
id: 映射的唯一标识。
sqlSource: SQL 源。
resultMaps: 结果映射。
parameterMap: 参数映射。
9. SqlSource
作用: 用于生成 SQL 语句。
主要实现:
RawSqlSource: 原始 SQL 源。
DynamicSqlSource: 动态 SQL 源。
10. ParameterHandler
作用: 处理 SQL 语句中的参数。
主要方法:
setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType): 设置参数值。
11. ResultSetHandler
作用: 处理查询结果集。
主要方法:
handleResultSets(Statement stmt): 处理结果集并返回结果。
12. TypeHandler
作用: 处理 Java 类型和 JDBC 类型之间的转换。
主要方法:
setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType): 设置参数值。
getResult(ResultSet rs, String columnName): 获取结果值。
MyBatis-Plus 扩展类
MyBatis-Plus 在 MyBatis 的基础上增加了一些扩展类和功能,以下是一些关键的扩展类:
1. BaseMapper
作用: 提供了基本的 CRUD 操作方法。
主要方法:
insert(T entity): 插入记录。
deleteById(Serializable id): 根据 ID 删除记录。
updateById(T entity): 根据 ID 更新记录。
selectById(Serializable id): 根据 ID 查询记录。
selectList(Wrappers<T> queryWrapper): 查询记录列表。
2. Conditions
作用: 提供了条件构造器,用于构建复杂的查询条件。
主要方法:
eq(String column, Object val): 等于。
ne(String column, Object val): 不等于。
gt(String column, Object val): 大于。
ge(String column, Object val): 大于等于。
lt(String column, Object val): 小于。
le(String column, Object val): 小于等于。
3. QueryWrapper
作用: 用于构建查询条件。
主要方法:
eq(String column, Object val): 等于。
ne(String column, Object val): 不等于。
gt(String column, Object val): 大于。
ge(String column, Object val): 大于等于。
lt(String column, Object val): 小于。
le(String column, Object val): 小于等于。
like(String column, Object val): 模糊查询。
in(String column, Collection<?> values): IN 查询。
4. UpdateWrapper
作用: 用于构建更新条件。
主要方法:
eq(String column, Object val): 等于。
ne(String column, Object val): 不等于。
gt(String column, Object val): 大于。
ge(String column, Object val): 大于等于。
lt(String column, Object val): 小于。
le(String column, Object val): 小于等于。
set(String column, Object val): 设置字段值。
底层逻辑流程
初始化:
通过 SqlSessionFactoryBuilder 读取配置文件,构建 SqlSessionFactory。
SqlSessionFactory 读取配置信息,初始化 Configuration 对象。
创建 SqlSession:
通过 SqlSessionFactory.openSession() 创建 SqlSession 对象。
获取 Mapper 接口的代理对象:
通过 SqlSession.getMapper(Class<T> type) 获取 Mapper 接口的代理对象。
MapperRegistry 会根据 Mapper 接口生成 MapperProxy 对象。
执行 SQL 语句:
调用 Mapper 接口的方法时,MapperProxy 会调用 SqlSession 的相应方法。
SqlSession 通过 Executor 执行 SQL 语句。
Executor 会使用 ParameterHandler 处理参数,使用 ResultSetHandler 处理结果集。
事务管理:
SqlSession 管理事务的开始、提交和回滚。
关闭资源:
通过 SqlSession.close() 关闭 SqlSession,释放资源。