FluentMybatis 详解

发布时间:2023-05-18

一、FluentMybatis 查询

FluentMybatis 是一个支持类型安全的 Mybatis 封装,使得代码更易读、易写、易维护。它提供了丰富的查询 API,支持动态条件、自定义返回类型、多表联合查询等功能。 以下代码展示了如何使用 FluentMybatis 查询一个用户对象:

<!-- 定义 XML 映射文件 -->
<mapper namespace="com.example.mapper.UserMapper">
  <resultMap id="userMap" type="com.example.entity.User">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="age" property="age" />
  </resultMap>
  <select id="getById" resultMap="userMap">
    SELECT * FROM user WHERE id = #{id}
  </select>
</mapper>
// 使用 FluentMybatis 查询
User user = new FluentMybatis()
    .select(User::getId, User::getName, User::getAge)  // 自定义返回类型
    .from(User.class)
    .where(User::getId).eq(1L)  // 动态条件
    .single();  // 返回单个对象

可以看到,FluentMybatis 的查询代码比 Mybatis 原生的 XML 配置 + Java 代码实现要简洁得多。

二、FluentMybatis 和 MybatisPlus 优劣

FluentMybatis 和 MybatisPlus 都是对 Mybatis 进行了封装,它们的目的都是为了让开发更快、更方便、更高效。那么它们之间有什么优劣呢?下面进行简单的对比:

2.1 MybatisPlus 的优势

MybatisPlus 是一个更加成熟的 ORM 框架,它拥有更完整的功能,如分页、逻辑删除、多租户等,并且它在国内的影响力较大,获得更多的社区支持。 以下代码展示了如何使用 MybatisPlus 查询一个用户对象:

// 使用 MybatisPlus 查询
User user = userRepository.selectOne(new QueryWrapper<User>()
    .eq("id", 1L));  // 动态条件

2.2 FluentMybatis 的优势

FluentMybatis 的 API 更具可读性和可维护性,代码更加优雅,并且支持一些高级功能,如复杂的多表联查、自定义返回类型等。 以下代码展示了如何使用 FluentMybatis 查询一个用户对象:

// 使用 FluentMybatis 查询
User user = new FluentMybatis()
    .select(User::getId, User::getName, User::getAge)  // 自定义返回类型
    .from(User.class)
    .where(User::getId).eq(1L)  // 动态条件
    .single();  // 返回单个对象

三、FluentMybatis 优缺点

FluentMybatis 的优点已经在前面提到了,比如 API 可读性高、代码优雅、支持多表联查等。不过它也存在一些缺点,比如:

3.1 学习成本稍高

虽然 FluentMybatis 的 API 更加易读易写,但是它的学习成本相对较高。如果团队中没有人使用过 FluentMybatis,那么需要花费一定的时间来学习和掌握。

3.2 功能相对较少

相对于 MybatisPlus 来说,FluentMybatis 的功能比较简单,不支持分页、逻辑删除等高级功能。如果项目需要使用这些功能,那么需要手动实现。

四、FluentMybatis 成熟吗

FluentMybatis 是一个比较新的项目,目前已经发布了数个版本。虽然它功能相对较少,但是它的代码质量较高,参与贡献的人员也比较活跃,因此它的稳定性和可靠性值得信赖。

五、FluentMybatis 动态数据库连接

FluentMybatis 支持根据请求动态切换数据库连接。下面是一个简单的例子:

// 定义数据源
HikariDataSource ds1 = new HikariDataSource();
ds1.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds1.setUsername("root");
ds1.setPassword("");
HikariDataSource ds2 = new HikariDataSource();
ds2.setJdbcUrl("jdbc:mysql://localhost:3306/test2");
ds2.setUsername("root");
ds2.setPassword("");
// 动态切换数据源
FluentMybatis fm = new FluentMybatis();
fm.use(ds1);  // 切换至 ds1
User user1 = fm.select(User::getId, User::getName, User::getAge)
    .from(User.class)
    .where(User::getId).eq(1L)
    .single();
fm.use(ds2);  // 切换至 ds2
User user2 = fm.select(User::getId, User::getName, User::getAge)
    .from(User.class)
    .where(User::getId).eq(1L)
    .single();

六、FluentMybatis 动态数据库连接

FluentMybatis 是一个开源的项目,不属于阿里的,但是它是基于阿里的开源项目开发的(比如:FastJSON、Druid 等),因此它具有阿里开源项目的思想和特点。

七、FluentMybatis 如何多表查询

FluentMybatis 支持多表联查,下面是一个简单的例子:

// 查询用户及其对应的订单列表
List<UserWithOrders> userList = new FluentMybatis()
    .select(User::getId, User::getName, User::getAge, Order::getId, Order::getPrice)
    .from(User.class)
    .leftJoin(Order.class).on(User::getId).eq(Order::getUserId)
    .where(User::getId).eq(1L)
    .toQuery()
    .list(UserWithOrders.class);

可以看到,使用 FluentMybatis 查询多表是非常简单的,只需要使用 join/leftJoin 等函数即可。同时,FluentMybatis 也支持自定义返回类型,可以方便地将结果映射为复杂的实体对象。