因为不想用 Play 官方支持的一些 ORM 框架,笔者开始在网上查询 Play 怎么整合 MyBatis ,但搜出来的结果往往都是 Play 1 相关的资料,或者使用了已经过时的 API 。
最后还是从 MyBatis 整合 Guice 的教程中得到启发,发现 Play 2.5 整合 MyBatis 还是很容易的。
Play 使用 Guice 做依赖注入,只需要添加一个 MyBatisModule 的子类,就能轻松的将 MyBatis 整合到 Play 框架中。
首先在 build.sbt 添加依赖的库:
libraryDependencies ++= Seq(
"org.mybatis" % "mybatis" % "3.4.4",
"org.mybatis" % "mybatis-guice" % "3.9",
"com.google.inject.extensions" % "guice-multibindings" % "4.0"
)
application.conf 数据源配置:
db.my-db {
driver = org.postgresql.Driver
url = "jdbc:postgresql://localhost:5432/postgres"
username = "postgres"
password = "postgres"
}
在 app 目录下创建 module 包 新建 PlayMyBatisModule 类:
package module;
import com.google.inject.Key;
import com.google.inject.Provider;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.mybatis.guice.MyBatisModule;
import play.db.Database;
import play.db.NamedDatabaseImpl;
public class PlayMyBatisModule extends MyBatisModule {
@Override
protected void initialize() {
environmentId("default");
// 获取命名为 my-db 的数据源 Provider
Provider<Database> provider = binder().getProvider(Key.get(Database.class, new NamedDatabaseImpl("my-db")));
bindDataSourceProvider(() -> provider.get().getDataSource());
bindTransactionFactoryType(JdbcTransactionFactory.class);
// 配置 Dao 类所在的包
addMapperClasses("com.morven.product.mapper");
}
}
在 application.conf 中添加模块:
play.modules.enabled+= "module.PlayMyBatisModule"
注意:
- 如果使用 XML 映射文件,要把 XML 文件放在 conf 目录下与 Dao 类所在包相同结构的路径。XML 放在 app 目录下不会编译到 classes 中,运行时会报找不到 Statement 错误。
- 如果使用 IDEA 开发,在 conf 新建目录的时候也要注意,不要把包路径建成目录的名字。我和同事都犯过把 com/morven/product/mapper 路径,建成了名字是 "com.morven.product.mapper" 的一个文件夹,在 IDEA 中还看不出问题。
如果要使用多个数据源,可以参考下一篇博文 Play Framework 2.5 整合 MyBatis —— 多数据源