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,释放资源。

相关推荐
许苑向上11 分钟前
最详细【Elasticsearch】Elasticsearch Java API + Spring Boot集成 实战入门(基础篇)
java·数据库·spring boot·elasticsearch
柳叶寒16 分钟前
医院信息化与智能化系统(17)
java·nacos·gateway·全栈·项目
首席架构师专栏17 分钟前
吊打面试官系列:final、finally、finalize 有什么区别?
java
hxj..27 分钟前
【算法】动态规划
java·算法·动态规划
哎呦没35 分钟前
Spring Boot技术实现的导师双选系统架构
spring boot
世间万物皆对象40 分钟前
Java 基础教学:高级特性与实战-集合框架
java·开发语言
不爱吃米饭_43 分钟前
如何优雅处理异常?处理异常的原则
java·开发语言·spring boot
李少兄1 小时前
IntelliJ IDEA 中创建目录时 `.` 和 `/` 的区别
java·ide·intellij-idea
V+zmm101341 小时前
社区养老服务小程序ssm+论文源码调试讲解
java·服务器·前端·javascript·小程序·毕业设计·1024程序员节
李少兄1 小时前
如何在 IntelliJ IDEA 中调整 `Ctrl+/` 快捷键生成注释的位置
java·ide·intellij-idea