因为不想用 Play 官方支持的一些 ORM 框架,笔者开始在网上查询 Play 怎么整合 MyBatis ,但搜出来的结果往往都是 Play 1 相关的资料,或者使用了已经过时的 API 。
最后还是从 中得到启发,发现 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 Providerprovider = 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 中还看不出问题。
如果要使用多个数据源,可以参考下一篇博文