一、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 也支持自定义返回类型,可以方便地将结果映射为复杂的实体对象。