Chain
基本概念
Chain 是 Mybatis-Plus 提供的一种链式编程风格,它允许开发者以更加简洁和直观的方式编写数据库操作代码。Chain 分为 query 和 update 两大类,分别用于查询和更新操作。每类又分为普通链式和 lambda 链式两种风格,其中 lambda 链式提供了类型安全的查询条件构造,但不支持 Kotlin。
使用步骤
query
提供链式查询操作,可以连续调用方法来构建查询条件。
示例
update
提供链式更新操作,可以连续调用方法来构建更新条件
示例
使用提示
1、链式操作通过返回 QueryChainWrapper 或 UpdateChainWrapper 的实例,允许开发者连续调用方法来构建查询或更新条件。
2、lambda 链式操作提供了类型安全的查询条件构造,通过方法引用 Entity::getId 等方式,避免了字符串硬编码,提高了代码的可读性和安全性。
3、在使用链式操作时,注意链式方法的调用顺序,通常是先设置条件,然后执行查询或更新操作。
4、链式操作支持多种条件构造方法,如 eq、ne、gt、lt、like 等,可以根据实际需求选择合适的方法。
5、链式操作返回的结果可以是单条记录、多条记录、总记录数等,具体取决于最后调用的方法。
6、通过使用 Chain,开发者可以更加高效地编写数据库操作代码,同时保持代码的清晰和可维护性。
ActiveRecord
基本概念
ActiveRecord 模式是一种设计模式,它允许实体类直接与数据库进行交互,实体类既是领域模型又是数据访问对象。在 Mybatis-Plus 中,实体类只需继承 Model 类即可获得强大的 CRUD 操作能力。
注意事项
使用 ActiveRecord 模式前,需要确保项目中已注入对应实体的 BaseMapper。
使用步骤
1、继承 Model 类
2、调用 CRUD 方法
使用提示
1、在 ActiveRecord 模式下,实体类可以直接调用 insert、selectAll、updateById、deleteById 等方法进行数据库操作。
2、实体类继承 Model 类后,会自动获得一系列数据库操作方法,无需手动编写 SQL 语句。
3、实体类中的字段需要与数据库表中的列对应,通常通过注解(如 @TableField、@TableId 等)来指定字段与列的映射关系。
4、在进行更新或删除操作时,通常需要先查询出实体对象,然后修改其属性,最后调用更新或删除方法。
5、插入和更新操作通常会返回一个布尔值,表示操作是否成功。
6、查询操作会返回相应的查询结果,如单个实体对象或实体对象列表。
7、通过使用 ActiveRecord 模式,开发者可以更加简洁地编写数据库操作代码,同时保持代码的清晰和可维护性。这种模式尤其适合于简单的 CRUD 操作,可以大大减少重复代码的编写。
SimpleQuery
基本概念
SimpleQuery 是 Mybatis-Plus 提供的一个工具类,它对 selectList 查询后的结果进行了封装,使其可以通过 Stream 流的方式进行处理,从而简化了 API 的调用。SimpleQuery 的一个特点是它的 peeks 参数,这是一个可变参数,类型为 Consumer...,意味着你可以连续添加多个操作,这些操作会在查询结果被处理时依次执行。
注意事项
使用 SimpleQuery 前,需要确保项目中已注入对应实体的 BaseMapper。
使用步骤
1、引入 SimpleQuery 工具类
2、使用 SimpleQuery 进行查询
使用提示
1、SimpleQuery 工具类提供了一种简洁的方式来处理查询结果,它允许你在查询结果上应用多个操作,这些操作会按照添加的顺序依次执行。
2、在使用 SimpleQuery 时,你需要提供一个查询构建器(如 Wrappers.lambdaQuery()),一个用于提取结果的字段(如 User::getId),以及一个或多个 Consumer 类型的 peek 操作
3、peek 操作可以用于执行任何副作用操作,如打印日志、更新缓存、发送通知等,而不会影响查询结果本身。
4、SimpleQuery 返回的结果是一个列表,包含了所有查询到的实体对象,这些对象已经应用了所有的 peek 操作。
5、通过使用 SimpleQuery,你可以将查询和结果处理逻辑分离,使代码更加清晰和易于维护。
6、通过使用 SimpleQuery 工具类,开发者可以更加高效地处理查询结果,同时保持代码的简洁性和可读性。这种工具类尤其适合于需要对查询结果进行复杂处理的场景。
方法
list
SimpleQuery 的 list 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 List,其中列表的元素是实体的某个属性。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。
参数说明
代码示例
使用提示
1、list 方法适用于需要根据实体的某个属性快速获取一个列表的场景。
2、通过 sFunction 参数,你可以指定任何实体属性作为 List 的元素,这使得查询结果的访问更加直观和高效。
3、peeks 参数允许你在处理查询结果时执行额外的副作用操作,这些操作不会影响最终的 List 结果。
4、当处理大量数据时,可以考虑将 isParallel 参数设置为 true 以启用并行流,从而提高查询效率。
条件构造器
基本概念
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。以下是主要的 Wrapper 类及其功能:
AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
QueryWrapper:专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and 和 or 逻辑。
UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。
功能详解
MyBatis-Plus 的 Wrapper 类是构建复杂查询和更新条件的关键工具。它允许开发者以链式调用的方式构造 SQL 的 WHERE 子句,提供了极大的灵活性和便利性。
条件判断:Wrapper 方法通常接受一个 boolean 类型的参数,用于决定是否将该条件加入到最终的 SQL 中。例如:
默认行为:如果某个方法没有显式提供 boolean 类型的参数,则默认为 true,即条件总是会被加入到 SQL 中。
泛型参数:Wrapper 类是泛型类,其中 Param 通常指的是 Wrapper 的子类实例,如 QueryWrapper、UpdateWrapper 等。
使用提示
1、在使用 Wrapper 时,尽量使用 Lambda 表达式来避免硬编码字段名,这样可以提高代码的可读性和可维护性。
2、Wrapper 支持链式调用,可以组合多个条件,如 and、or 等逻辑操作符。
3、在更新操作中使用 UpdateWrapper 或 LambdaUpdateWrapper 时,可以省略实体对象,直接在 Wrapper 中设置更新字段。
4、注意 Wrapper 的线程安全性,通常在每次使用时创建新的 Wrapper 实例。
5、在使用 MyBatis-Plus 的 Wrapper 时,应避免将前端动态参数直接拼接到 SQL 片段中,以防止 SQL 注入攻击。MyBatis-Plus 提供了安全的参数绑定方式,如使用 eq、apply 等方法,它们会自动处理参数绑定,避免 SQL 注入风险。
Wrappers
基本概念
MyBatis-Plus 提供了 Wrappers 类,它是一个静态工厂类,用于快速创建 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 的实例。使用 Wrappers 可以减少代码量,提高开发效率。
示例
注意事项
1、在使用 QueryWrapper UpdateWrapper 查询 设置 条件字段部分 一定要保证安全,避免 SQL 注入攻击。
2、任何前端传入的 SQL片段 都要严格过滤。
线程安全性
Wrapper 实例不是线程安全的,因此建议在每次使用时创建新的 Wrapper 实例。这样可以避免多线程环境下的数据竞争和潜在的错误。
示例
通过遵循这些最佳实践,开发者可以更加安全、高效地使用 MyBatis-Plus 的 Wrapper 条件构造器,构建出既安全又易于维护的数据库操作代码。
使用 Wrapper 自定义 SQL
基本说明
MyBatis-Plus 提供了强大的 Wrapper 条件构造器,允许开发者自定义 SQL 语句,以满足更复杂的数据库查询需求。为了使用这一功能,请确保你的 mybatis-plus 版本不低于 3.0.7。
注意事项
1、版本要求:确保你的项目中使用的 mybatis-plus 版本至少为 3.0.7,以支持自定义 SQL 功能。
2、参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。
3、使用 ${ew.customSqlSegment}:在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。
4、不支持基于 entity 的 where 语句:自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 where 子句,你需要手动编写完整的 SQL 语句。
示例代码
在上述示例中,我们定义了一个 selectByCustomSql 方法,它使用了一个自定义的 SQL 语句,并通过 ${ew.customSqlSegment} 引入了 Wrapper 对象生成的 SQL 片段。
使用方法
要使用自定义 SQL,只需调用上述方法并传入一个 Wrapper 对象:
在这个例子中,selectByCustomSql 方法将执行一个带有 where 条件的查询,该条件由传入的 queryWrapper 对象生成。通过这种方式,你可以灵活地结合 MyBatis-Plus 的 Wrapper 功能和自定义 SQL,以满足各种复杂的数据库操作需求。
自动映射枚举
基本概念
提供了更加灵活的枚举处理器 MybatisEnumTypeHandler(基于枚举常量属性),只需要对枚举进行声明,即可实现枚举的自动映射。未进行声明的枚举则根据 mybatis的defaultEnumTypeHandler 的默认值EnumTypeHandler 来进行映射。
枚举声明
方法一:注解标记
枚举属性使用 @EnumValue 注解,指定枚举值在数据库中存储的实际值。支持枚举类中的任意字段,如序号或编码。
方法二:实现接口
实现 IEnum 接口,实现 getValue 方法,指定枚举值在数据库中存储的实际值。支持枚举类中的任意字段,如序号或编码。
未声明枚举
未声明的枚举将使用 mybatis 的 defaultEnumTypeHandler 的默认值 EnumTypeHandler 进行映射可以通过修改全局配置来变更,不过这对上面步骤声明的枚举无效。
修改全局 defaultEnumTypeHandler
yml文件配置方式
通过自定义配置类
如何序列化枚举值为前端返回值
Jackson
方法一:重写 toString 方法
springboot方式:
Jackson 独立使用
在枚举中重写 toString 方法,以上两种方式任选其一。
方法二:注解处理
使用@JsonValue注解标记。
通过以上步骤,你可以优雅地在 MyBatis-Plus 中使用枚举属性,并且能够方便地将枚举值序列化为前端所需的格式。