
博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
本文介绍了 Mybatis-Flex,一个用于增强 MyBatis 的框架。相对于 MyBatis-Plus,Mybatis-Flex提供了一些显著的特点,如支持联表查询以及在Mybatis-Plus中收费的功能在Mybatis-Flex中是免费的。文章概述了 MyBatis-Flex 的功能特点,并深入介绍了联表查询的不同方案。
Mybatis增强版:Mybatis-Plus(使用的最多,老牌Mybatis增强框架,2016年开源)、Fluent-MyBatis(阿里云开发的Mybatis增强框架,来自阿里云.云效产品团队)、Mybatis-Flex。总的来说,Mybatis-Flex相对于Mybatis-Plus较为显著的特点是,多了联表查询和在Mybatis-plus中收费的Mybatis-Flex免费使用。
Mybatis-Flex 是一个用于增强 MyBatis 功能的框架,提供了一系列特性和功能,使得数据库操作更加灵活且性能更好。本文将介绍 Mybatis-Flex 的功能特点、配置方法、使用步骤以及一些注意事项。
| 功能或特点 | MyBatis-Flex | MyBatis-Plus | Fluent-MyBatis | 
|---|---|---|---|
| 对 entity 的基本增删改查 | ✅ | ✅ | ✅ | 
| 分页查询 | ✅ | ✅ | ✅ | 
| 分页查询之总量缓存 | ✅ | ✅ | ❌ | 
| 分页查询无 SQL 解析设计(更轻量,及更高性能) | ✅ | ❌ | ✅ | 
| 多表查询:from 多张表 | ✅ | ❌ | ❌ | 
| 多表查询: left join、inner join 等等 | ✅ | ❌ | ✅ | 
| 多表查询: union,union all | ✅ | ❌ | ✅ | 
| 单主键配置 | ✅ | ✅ | ✅ | 
| 多种 id 生成策略 | ✅ | ✅ | ✅ | 
| 支持多主键、复合主键 | ✅ | ❌ | ❌ | 
| 字段的 typeHandler 配置 | ✅ | ✅ | ✅ | 
| 除了 MyBatis,无其他第三方依赖(更轻量) | ✅ | ❌ | ❌ | 
| QueryWrapper 是否支持在微服务项目下进行 RPC 传输 | ✅ | ❌ | 未知 | 
| 逻辑删除 | ✅ | ✅ | ✅ | 
| 乐观锁 | ✅ | ✅ | ✅ | 
| SQL 审计 | ✅ | ❌ | ❌ | 
| 数据填充 | ✅ | ✔️ (收费) | ✅ | 
| 数据脱敏 | ✅ | ✔️ (收费) | ❌ | 
| 字段权限 | ✅ | ✔️ (收费) | ❌ | 
| 字段加密 | ✅ | ✔️ (收费) | ❌ | 
| 字典回写 | ✅ | ✔️ (收费) | ❌ | 
| Db + Row | ✅ | ❌ | ❌ | 
| Entity 监听 | ✅ | ❌ | ❌ | 
| 多数据源支持 | ✅ | 借助其他框架或收费 | ❌ | 
| 多数据源是否支持 Spring 的事务管理,比如 @Transactional 和 TransactionTemplate 等 | ✅ | ❌ | ❌ | 
| 多数据源是否支持 “非Spring” 项目 | ✅ | ❌ | ❌ | 
| 多租户 | ✅ | ✅ | ❌ | 
| 动态表名 | ✅ | ✅ | ❌ | 
| 动态 Schema | ✅ | ❌ | ❌ | 
总结:Mybatis-Flex 相对于 Mybatis-Plus 的显著特点在于其免费支持联表查询功能,而在 Mybatis-Plus 中需要支付费用。由于联表查询在日常开发中具有广泛应用,Mybatis-Flex 提供了这一功能,为开发者提供了便利,因此它在这一方面表现出色。
配置 Mybatis-Flex 并使用其功能需要遵循以下步骤:
以下是在项目中配置和使用 Mybatis-Flex 的一般步骤:
Mybatis-Flex 的依赖库到项目的构建文件中(例如 Maven 或 Gradle)。Mybatis 的基本配置,如连接数据库信息、数据源配置等。Mapper 接口,继承 BaseMapper 并添加自定义的查询方法。Mybatis-Flex,并配置实体类的包扫描路径。Mapper 接口的方法来完成数据库操作,包括增删改查等。1. 添加 Mybatis-Flex 的依赖库到项目的构建文件中(例如 Maven 或 Gradle): 在项目的构建文件中,添加 Mybatis-Flex 的依赖,以便能够在项目中使用其功能。
<!-- Maven 依赖示例 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-flex</artifactId>
    <version>1.0.0</version>
</dependency>2. 配置数据源和 Mybatis 的基本配置: 在项目的配置文件中,配置数据库连接信息和 Mybatis 的基本配置,以便 Mybatis-Flex 可以连接数据库并正常工作。
properties复制代码# 数据库连接配置示例
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=yourpassword
# Mybatis 配置示例
mybatis.config-location=classpath:mybatis-config.xml3. 定义实体类,使用注解来描述表名、字段关系等: 创建实体类来映射数据库中的表结构,使用 Mybatis-Flex 提供的注解来配置实体类与数据库表之间的映射关系。
java复制代码import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String username;
    
    // Getters and setters
}4. 编写 Mapper 接口,继承 BaseMapper 并添加自定义的查询方法: 创建 Mapper 接口,继承 Mybatis-Flex 提供的 BaseMapper 接口,然后添加自定义的查询方法。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
    // 添加自定义的查询方法,如根据用户名查询用户
    User findByUsername(String username);
}5. 在配置文件中启用 Mybatis-Flex,并配置实体类的包扫描路径: 在 Mybatis 配置文件(如 mybatis-config.xml)中启用 Mybatis-Flex,并配置实体类的包扫描路径。
<configuration>
    <!-- 配置 Mybatis-Flex 插件 -->
    <plugins>
        <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor">
            <!-- 可选的插件配置 -->
        </plugin>
    </plugins>
    
    <!-- 配置实体类的包扫描路径 -->
    <typeAliasesPackage>com.example.model</typeAliasesPackage>
    
    <!-- 其他 Mybatis 配置 -->
</configuration>6. 在代码中使用 Mapper 接口的方法来完成数据库操作,包括增删改查等: 在业务逻辑代码中,使用定义的 Mapper 接口的方法来完成数据库操作,包括增删改查等。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public User getUserByUsername(String username) {
        return userMapper.findByUsername(username);
    }
    
    // 其他业务逻辑方法
}通过按照上述详细的步骤和代码示例进行配置和使用 Mybatis-Flex,您将能够更好地理解如何集成该框架并在项目中进行数据库操作。这些示例将帮助您在实际开发中更轻松地使用 Mybatis-Flex 的功能。
在使用 Mybatis-Flex 进行开发时,需要注意以下几点:
当使用 Mybatis-Flex 进行开发时,以下几点需要特别注意,以确保您能够充分利用框架的优势并顺利进行数据库操作:
import com.baomidou.mybatisplus.annotation.TableName;
   
   @TableName("user")
   public class User {
       // 属性声明
   }select***WithRelations() 方法来触发关联查询,以便获取相关联的数据。
 <configuration>
       <!-- 配置 Mybatis-Flex 插件 -->
       <plugins>
           <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor">
               <!-- 可选的插件配置 -->
           </plugin>
       </plugins>
       
       <!-- 配置实体类的包扫描路径 -->
       <typeAliasesPackage>com.example.model</typeAliasesPackage>
       
       <!-- 其他 Mybatis 配置 -->
   </configuration>通过熟悉特性、正确配置实体类注解、注意关联查询、正确配置 Mybatis-Flex 和实体类扫描路径,以及深入理解复杂操作方案,您将能够更好地应用 Mybatis-Flex 框架,提高开发效率并顺利完成数据库操作。
在 MyBatis-Flex 框架中,为了处理不同的关联查询场景,提供了四个不同的 Relations 注解。这些注解可以用于配置实体类之间的关联关系,从而在进行数据库查询时能够获取到关联的数据。以下是对这些注解的详细解释以及如何在实际代码中使用它们的示例:
RelationOneToOne(一对一关系): 用于描述两个实体类之间的一对一关系。通常在两个实体类中,一个类引用另一个类的实例。这个注解用于配置关联的字段和关系类型。
@TableName("user")
public class User {
    // 属性声明
    
    @RelationOneToOne(selfField = "id", targetField = "userId")
    private UserProfile userProfile;
}RelationOneToMany(一对多关系): 用于描述一个实体类与多个其他实体类之间的一对多关系。在主实体类中,使用集合属性引用其他实体类的多个实例。
@TableName("user")
public class User {
    // 属性声明
    
    @RelationOneToMany(selfField = "id", targetField = "userId")
    private List<Order> orders;
}RelationManyToOne(多对一关系): 用于描述多个实体类引用同一个实体类的多对一关系。在多个实体类中,使用单个属性引用同一个实体类的实例。
@TableName("order")
   public class Order {
       // 属性声明
       
       @RelationManyToOne(selfField = "userId", targetField = "id")
       private User user;
   }RelationManyToMany(多对多关系): 用于描述多个实体类之间的多对多关系。通常需要通过中间表来实现这种关系。
@TableName("user")
public class User {
    // 属性声明
    
    @RelationManyToMany(joinTable = "user_role", joinSelfColumn = "user_id", joinTargetColumn = "role_id")
    private List<Role> roles;
}在使用这些 Relations 注解配置实体类关联关系后,需要在通过 BaseMapper 的方法查询数据时,调用相应的 select***WithRelations() 方法才能使 Relations 注解生效。否则,MyBatis-Flex 将自动忽略这些 Relations 注解。
例如,对于上述配置了关联关系的实体类,以下是如何在 Mapper 接口中使用 selectListWithRelations() 方法来查询数据的示例:
@Mapper
public interface UserMapper extends BaseMapper<User> {
    
    List<User> selectUsersWithRelations();
}通过这样的配置,您就能够更好地理解并应用 MyBatis-Flex 框架中提供的关联关系注解,并在数据库查询时获取到关联的数据。
Mybatis-Flex 是一个用于增强 MyBatis 的框架,提供了多种特性和功能来优化数据库操作。本文简要介绍了 Mybatis-Flex 的特点,并详细说明了如何配置和使用其功能。通过合理的配置和使用,开发者可以更加灵活地进行数据库操作,提高开发效率和代码质量。