Micronaut 是一种现代化基于 JVM 的全栈应用程序框架,用于构建轻量化、可扩展和高效的微服务和服务器端应用程序,并且是一种支持 GraalVM 特性的云原生框架。
在 Micronaut 框架中,数据库的访问支持三种最常用的数据库框架:R2DBC、Hibernate JPA 和 MyBatis。
R2DBC
这三种数据库框架中,R2DBC 为非阻塞式的数据库框架,可以与框架完美结合,实现整个框架的非阻塞式编码。R2DBC 支持通过接口名定义数据库访问操作以及固定的本地 SQL 执行。
在 Micronaut 中,如果要使用 R2DBC,需要引入以下依赖:
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-r2dbc</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<scope>runtime</scope>
</dependency>
DAO 层的声明如下:
@R2dbcRepository(dialect = Dialect.MYSQL)
public interface GenreRepository extends ReactorPageableRepository<Genre, Long> {
Mono<Genre> save(@NotBlank String name);
}
以上声明中可以看到,只需要声明接口继承,就可以使用基础接口中定义的 API,并能定义自己的 API,比如想自己定义一个 API 查询 deleted = 0 的所有数据,那么 API 声明如下:
Flux<Genre> findByDeletedEqualsFalse();
可以看到,这处通过 API 名字定义操作的方法非常易读和简洁。
JPA
Hibernate JPA 支持 JPA 的 API,但它是一种阻塞式的数据库框架,不能与框架一起实现完整的非阻塞式编码。JPA 支持通过接口名定义数据库访问操作,还支持动态本地 SQL 执行。
在 Micronaut 中,如果要使用 JPA,需要引入以下依赖:
<dependency>
<groupId>io.micronaut.data</groupId>
<artifactId>micronaut-data-hibernate-jpa</artifactId>
<scope>compile</scope>
</dependency>
DAO 层的声明如下:
@Repository
public interface RegisterRepository extends CrudRepository<RegisterData,String> {
List<RegisterData> findByServiceUuid(String serviceUuid);
}
与 R2DBC 相比,可以看到,除了 API 的返回是阻塞的数据外,整个 DAO API 的声明方式与 R2DBC 是完全一样的,非常方便。
进一步,如果要使用动态 SQL,我们可以声明一个抽象类,如下:
@Repository
public abstract TenancyRepository implements CrudRepository<Tenancy,String> {
private EntityManager em;
public TenancyRepository(EntityManager em) {
this.em = em;
}
@Transactional
public Tenancy query(String params){
String sql = "xxx";
Query query = em.createNativeQuery(sql);
//...
}
}
以上示例可以看到,在 JAP 框架中,只要注入了 EntityManger 就可以执行动态 SQL。需要注意的是,R2DBC 框架和 JPA 是不能同时使用的,原因是两种框架有不同的事务管理器实现,如果同时使用,EntityManager 的事务会不知道选择哪个事务管理器。
Mybatis
Mybatis 是我们在 Spring Boot 框架中用得比较多的一种数据库访问框架,主要用于自己通过 XML 文件定义 SQL 访问数据库。Mybatis 支持自定义 SQL 和固定的本地 SQL 执行。
依赖如下:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
<scope>compile</scope>
</dependency>
至于其他的 XML 配置,大家一定很熟悉了,就不再重复。
小结
Micronaut 作为云原生框架,支持 GraalVM 的 Native Image,通过 Native Image 将 Java 应用编译为机器本地应用,能大大减少资源占用。
Mybatis 还不能完美支持 Native Image,为了能完美编译为本地应用,推荐优先选用 R2DBC 框架和 JPA 框架。
如果不涉及到动态 SQL 的使用,则推荐先用 R2DBC 框架。