MyBatis 与 MyBatis-Plus

复制代码
        <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,释放资源。

相关推荐
华科云商xiao徐4 分钟前
Java HttpClient实现简单网络爬虫
java·爬虫
扎瓦17 分钟前
ThreadLocal 线程变量
java·后端
BillKu36 分钟前
Java后端检查空条件查询
java·开发语言
jackson凌40 分钟前
【Java学习笔记】String类(重点)
java·笔记·学习
一只爱撸猫的程序猿1 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc
刘白Live1 小时前
【Java】谈一谈浅克隆和深克隆
java
一线大码1 小时前
项目中怎么确定线程池的大小
java·后端
要加油哦~1 小时前
vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
java·前端·javascript
crud1 小时前
Spring Boot 3 整合 Swagger:打造现代化 API 文档系统(附完整代码 + 高级配置 + 最佳实践)
java·spring boot·swagger
天天摸鱼的java工程师1 小时前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql