JdbcQuery.scala 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package hello.model
  2. import java.sql.{PreparedStatement, ResultSet, Connection}
  3. case class Param[T](idx: Int, value: T)
  4. abstract class JdbcQuery[T](mapper: (ResultSet) => T) {
  5. def statement: PreparedStatement
  6. def open(conn: Connection): JdbcQuery[T]
  7. def close(): JdbcQuery[T]
  8. def execute(param: Int) = {
  9. statement.setInt(1, param)
  10. val rs = statement.executeQuery()
  11. if (rs.next()) Some(mapper(rs)) else None
  12. }
  13. }
  14. sealed class ClosedQuery[T](query: String, m: (ResultSet) => T) extends JdbcQuery[T](m) {
  15. def statement = throw new RuntimeException("Cannot execute a closed query")
  16. def open(conn: Connection) = new OpenQuery[T](conn, query, m)
  17. def close() = this
  18. }
  19. sealed class OpenQuery[T](c: Connection, query: String, m: (ResultSet) => T) extends JdbcQuery[T](m) {
  20. val statement = c.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
  21. def open(conn: Connection) = this
  22. def close() = {
  23. c.close()
  24. new ClosedQuery[T](query, m)
  25. }
  26. }
  27. object SingleResultQuery {
  28. def byID[T](query: String)(mapper: (ResultSet) => T): JdbcQuery[T] = new ClosedQuery[T](query, mapper)
  29. }