The SQL-Centric Database Access Library for Scala.
Mirage-SQL Scala is wrapper written in Scala for the Mirage SQL framework.
Among other features, it provides a dynamic SQL-Template language called: 2WaySQL.
Template directives are embedded as SQL comments, so that the 2WaySQL template is also executable as raw a SQL at the same time. This makes SQL files both dynamic and simply testable at the same time.
To use Mirage-SQL Scala with an SBT based project, just add following dependency to your build.sbt.
libraryDependencies += "com.miragesql" %% "miragesql-scala" % "2.0.0"- A more detailed documentation will provided in the central Wiki.
- User Support in English is provided in the Gitter Chatroom.
- If you find any bugs or issues, please report them in the GitHub Issue Tracker.
This is a simple example to query using Mirage-SQL Scala:
First, define the DTO which is mapped to ResultList as case class. It's possible to specify Option[T] as property type for nullable properties.
// A class which mapped to ResultList
case class Book(
bookId: IdentityPk[Int],
bookName: String,
author: String,
price: Option[Int]
)Execute the SQL using SqlManager. mirage-scala provides dynamic SQL template called 2waySQL in Sql().
import com.miragesql.miragesql.scala._
Session.withTransaction { session =>
val sqlManager: SqlManager = session.sqlManager
val books: List[Book] = sqlManager.getResultList[Book](
Sql("""
SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE
FROM BOOK
/*IF author!=null*/
WHERE AUTHOR = /*author*/
/*END*/
"""), Map("author"->"Naoki Takezoe"))
books.foreach { book =>
println("bookId: " + book.bookId)
println("bookName: " + book.bookName)
println("author: " + book.author)
println("price: " + book.price)
println("--")
}
}You can also use an external SQL file using SqlFile():
val result: List[Book] = sqlManager.getResultList[Book](
SqlFile("META-INF/selectBooks.sql"),
Map("author"->"Naoki Takezoe"))With Mirage-SQL Scala, it's also possible to use Map[String, _] as result class / parameter class instead of the case class.
See also the Mirage SQL Documentation to learn more about it's usage.
Mirage-SQL Scala also supports SQL-less select / update using an entity class.
If the primary key is set at the server-side, for example, it's auto incremented, You have to specify Auto for the primary key property.
val book: Book = Book(
Auto,
"Mirage in Action",
"Naoki Takezoe",
Some(20)
)
sqlManager.insertEntity(book);If the primary key must be set by the application, you can use Id(value) to set the value to the primary key property.
val book: Book = Book(
Id(1),
"Mirage in Action",
"Naoki Takezoe",
Some(20)
)
sqlManager.insertEntity(book);Batch updating is also available.
// batch inserting
sqlManager.insertBatch(book1, book2, book3)
sqlManager.insertBatch(books: _*)
// batch updating
sqlManager.updateBatch(book1, book2, book3)
sqlManager.updateBatch(books: _*)
// batch deleting
sqlManager.deleteBatch(book1, book2, book3)
sqlManager.deleteBatch(books: _*)To handle large data, create streams by stream() method and process each records by foreach() method.
sqlManager
.stream(Sql("SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK"))
.foreach[Book] { book =>
println(book)
}If you would like to aggregate streaming values, you can use foldLeft method instead:
val sum = sqlManager
.stream(Sql("SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK"))
.foldLeft[Book, Int](0){ case (book, i) =>
i + book.price
}