起步

依赖

sbt
libraryDependencies += "com.helloscala.fusion" %% "fusion-mybatis" % "2.0.6"
Maven
<dependency>
  <groupId>com.helloscala.fusion</groupId>
  <artifactId>fusion-mybatis_2.12</artifactId>
  <version>2.0.6</version>
</dependency>
Gradle
dependencies {
  compile group: 'com.helloscala.fusion', name: 'fusion-mybatis_2.12', version: '2.0.6'
}

示例

FusionMyBatisTest 演示了一个典型的 MyBatis 数据库操作。

class FusionMybatisTest extends ScalaTestWithActorTestKit with FusionFunSuiteLike {
  test("testSqlSession") {
    val sqlSessionFactory = FusionMybatis(system).component
    sqlSessionFactory should not be null

    // auto commit is false
    val session = sqlSessionFactory.openSession()
    try {
      session should not be null
    } finally {
      session.close()
    }
  }

  test("file insert") {
    val sqlSessionFactory = FusionMybatis(system).component

    // using函数将自动提交/回滚(异常抛出时)
    sqlSessionFactory.transactional { session =>
      val fileMapper = session.getMapper(classOf[FileMapper])
      val file = CFile("file_id", "文件", "/32/234242.jpg", 98234)
      fileMapper.insert(file)
//      session.commit()
//      throw new SQLException()
    }
  }

  test("file list") {
    val sqlSessionFactory = FusionMybatis(system).component
    sqlSessionFactory.transactional { session =>
      val fileMapper = session.getMapper(classOf[FileMapper])
      val list = fileMapper.list(10)
      list.forEach(new Consumer[CFile] {
        override def accept(t: CFile): Unit = println(t)
      })
      list should not be empty
    }
  }

  test("file page") {
    val sqlSessionFactory = FusionMybatis(system).component
//    val result = sqlSessionFactory.transactional { session =>
//      val fileMapper = session.getMapper(classOf[FileMapper])
//      val req        = new Page[CFile](0, 10)
//      fileMapper.selectPage(req, null)
//    }
    val result = sqlSessionFactory.mapperTransactional[FileMapper, IPage[CFile]] { fileMapper =>
      val req = new Page[CFile](0, 10)
      fileMapper.selectPage(req, null)
    }
    result.getRecords should not be empty
    result.getRecords.forEach(new Consumer[CFile] {
      override def accept(t: CFile): Unit = println(t)
    })
    println(result)
  }
}

FileMapper实现了 BaseMapper[T] 接口,它是MyBatis-plus对MyBatis提供的增强:

trait FileMapper extends BaseMapper[CFile] {
  def list(size: Int): java.util.List[CFile]
}

CFile

case class CFile(
    @BeanProperty var fileId: String = "",
    @BeanProperty var fileSubject: String = "",
    @BeanProperty var fileUrl: String = "",
    @BeanProperty var duration: Int = 0,
    @BeanProperty var tableAutoUptime: LocalDateTime = LocalDateTime.now())

配置与初始化

application.conf文件中

fusion.jdbc {
  default {
    poolName = "fusion"
    jdbcUrl = "jdbc:postgresql://localhost:55432/fusion_dev"
    username = "devuser"
    password = "devPass.2019"
    connectionTestQuery = "select 1;"
    maximumPoolSize = 2
    autoCommit = true
  }
}

fusion.mybatis {
  default = {
    fusion-jdbc-source = fusion.jdbc.default
    configuration {
      package-names = ["fusion.mybatis.mapper"]
    }
  }
}