2010-06-19 4 views
7

Я работаю над небольшим проектом, где я бы хотел разобрать некоторые данные, а затем поместить его в базу данных. Я не работаю с Лифт, и я не смог найти стандартный способ сделать это.Как подключиться к базе данных MySQL с помощью Scala?

Я хорошо пишу запросы самостоятельно, но я не уверен, что использовать для фактического подключения к БД.

+1

Этот вопрос имеет много хорошей информации: http://stackoverflow.com/question s/1362748/wanted-good-examples-of-scala-database-persistence –

ответ

11

Вы можете использовать JDBC - стандартное средство получения Java для работы с базами данных. Вам понадобится соответствующий драйвер MySQL JDBC. Apache DbUtils предоставляет некоторые классы полезности, окружающие JDBC, и будет полезен.

Если вам нужен API более высокого уровня, который вынимает часть шаблона, то выйдите Spring's JDBC integration.

Если вы хотите ORM (объектно-реляционное сопоставление), то Hibernate - хороший выбор.

Я успешно использовал все три в Скале.

5

Я на самом деле написал SQL command shell в Scala, который говорит о любой произвольной базе данных, для которой существует драйвер JDBC. Как отмечает Брайан Агнью, он отлично работает. Кроме того, существуют такие инструменты, как Querulous, SQueryL и OR/Broker, которые обеспечивают дружественные к Scala слои базы данных. Они сидят на вершине JDBC, но они предоставляют некоторую дополнительную семантику (через DSL, в некоторых случаях), чтобы облегчить вам работу.

2

Для полноты, также ознакомьтесь с RichSQL. Это демо-код, показывающий, как обернуть JDBC, чтобы сделать больше операций, подобных Scala, но на самом деле он вполне применим. Преимущество состоит в том, что он простой и малый, поэтому вы можете легко изучить источник, чтобы узнать, что происходит. Не забудьте закрыть() ваши PreparedStatements.

3

Попробуйте O/R Broker:

case class MyObj(name: String, year: Int) 

val ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource 
// set properties on ds 

import org.orbroker._ 
val builder = new BrokerBuilder(ds) 
val broker = builder.build 

val myObj: MyObj = // Parse stuff to create MyObj instance 
broker.transaction() { session => 
    session.execute("INSERT INTO MYTABLE VALUES(:obj.name, :obj.year)", "obj"->myObj)s 
} 

val myObjs: Seq[MyObj] = // Parse stuff to create sequence of MyObj instances 
broker.transaction() { session => 
    session.executeBatch("INSERT INTO MYTABLE VALUES(:obj.name, :obj.year)", "obj"->myObjs) 
} 
4

Off Конечно, вы можете использовать все Java-версию, совместимую с JDBC (Hibernate, Spring, и т.д.), но и для более эффективного использования Scala языка, я рекомендую использовать конкретные рамки Scala, который имеют лучшую DSL.

  • ScalaQuery - это API/DSL (язык, специфичный для конкретного домена), построенный на основе JDBC для доступа к реляционным базам данных в Scala. Он был разработан с учетом следующих целями:
  • Squeryl является Scala ОРМА и DSL для общения с базами данных с минимальным многословием и максимальной безопасностью
  • SORM типа является Scala ОРМ-рамки предназначена для устранения шаблонного кода и решать проблемы масштабируемости с абстракции высокого уровня и функционального программирования стиля
  • Slick - типизированного поддержал проект с функциональной Relational Mapping

Узнайте больше об этих рамках в https://stackoverflow.com/questions/1362748/looking-for-a-comparison-of-scala-persistence-frameworks

+0

Также рассмотрите [ScalikeJDBC] (http://scalikejdbc.org/), который очень похож на приведенный выше. Кроме того, аналогичная функция Play Framework [ScalaAnorm] (https://github.com/playframework/anorm/blob/master/docs/manual/working/scalaGuide/main/sql/ScalaAnorm.md) аналогична. Я создал полный ответ о ScalikeJDBC. –

1

Я только что обнаружил ScalikeJDBC which offers a Scala like API wrapper for JDBC.

(я нашел ScalikeJDBC при исследовании, как использовать ScalaAnormwithout Play Framework. Теперь похоже, что мне не понадобится Anorm для моего проекта.)

Вот простой пример, хотя он предлагает множество интересных возможностей, не показанные здесь:

import scalikejdbc._ 

Class.forName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource") 

ConnectionPool.singleton("jdbc:mysql://localhost:3306/myschema", "user", "password") 

DB.localTx { implicit conn => 

    val data = sql"select mystringcol, myintcolumn from mytable".map { 
    rs => (rs.string("mystringcol"), rs.int("myintcolumn")) 
    }.list().apply() 

    println(data) 

} 

Некоторые ссылки на документацию:

Смежные вопросы