詳細はKotlinでSpring Bootに基づくRESTfulサービスを書いてください。


Springは複雑すぎて、これを配置するのは命の無駄です。特に、合併の圧力がないので、適当にRESTfulサービスをやって、業務全体を先に走り始めた場合、XMLの配置にこだわる必要がありますか?明らかにそう思っている人が多いので、Spring Bootがあります。また、Java 8は墨があまりにも多くてKotlinができました。
データソースはMySqlを使用します。Spring Bootという基本的にはあまり配置されていない、あまり小さくないマイクロフレームのSpring Data JPAとHibernateでデータにアクセスします。
処理の依存性
ここではGraadleを用いて依存性を処理した。
まずウェブサイトからの初期項目をダウンロードします。

git clone https://github.com/spring-guides/gs-accessing-data-jpa.git
その後、gs-accessing-data-jpa/initialディレクトリの下に移動します。
IntelliJ IDEAでこのプロジェクトを開けて、Graadleで管理依存を選択します。
その後、Graadleは依存項目を自動的にダウンロードします。これはちょっと時間がかかります。妹としばらく話しに行ってもいいです。
このように面倒くさいと思ったら、Graadleプロジェクトを作ることができます。上記の例に従ってディレクトリを作成します。

└── src
  └── main
    └── java
      └── hello
しかし、上記のいずれの方法でも、最後にはGraadleファイルに依存項目を追加する必要があります。このGraadleファイルはbuild.gradleです。依存項を追加しました
 次はこうです。

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
  }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
  baseName = 'gs-spring-boot'
  version = '0.1.0'
}

repositories {
  mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
  // tag::jetty[]
  compile("org.springframework.boot:spring-boot-starter-web") {
    exclude module: "spring-boot-starter-tomcat"
  }
  compile("org.springframework.boot:spring-boot-starter-jetty")
  // end::jetty[]
  // tag::actuator[]
  compile("org.springframework.boot:spring-boot-starter-actuator")
  // end::actuator[]
  compile('org.springframework.boot:spring-boot-starter-data-jpa:1.3.3.RELEASE')

  compile('mysql:mysql-connector-java:5.1.13')

  testCompile("junit:junit")
}

task wrapper(type: Wrapper) {
  gradleVersion = '2.3'
}

設定ファイル
ディレクトリsrc/main/resources/application.propertiesでプロファイルを編集します。デフォルトでは、このファイルと対応するディレクトリがないので、自分で作成します。

spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
#spring.datasource.driverClassName = com.mysql.jdbc.Driver

# Specify the DBMS
spring.jpa.database = MYSQL

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

Javaの設定クラス、またはXMLの設定ファイルは必要ありません。
構成項目hibernate.ddl-auto = true,を使用するために必要なデータベースと関連テーブル、列は、自動的に定義されたエンティティクラスに従って作成されます。ここをクリックします、より多くの構成の説明を見る。
簡単なエンティティクラスを作成します。
ここでは、簡単なエンティティクラスを定義し、JPAエンティティとして宣言します。この種類のファイルはディレクトリsrc\main\java\hello\Entities\に保存されます。

package hello.Entities

import javax.validation.constraints.NotNull
import java.io.Serializable;
import javax.persistence.*;

/**
 * Created by Bruce on 2016/3/9.
 */
@Entity
@Table(name = "user")
data class User(@Id @GeneratedValue(strategy = GenerationType.AUTO) var id: Long? = 0,
        @Column(nullable = false) var name: String? = null,
        @Column(nullable = false) var email: String? = null) : Serializable {

  protected constructor() : this(id = null, name = null, email = null) {
  }
}

ここではKotlinのdata classを使っています。data classの最大の利点は、getterとsetterを定義し、toString()の時間を省くことです。これらはすでにデフォルトで実現されました。したがって、data classのオブジェクトを使用する場合は、直接nameemailを使用することができます。もちろん、idという属性があります。
パラメータなしの構造関数はJPA用ですので、アクセスレベルはprotectedに設定されています。主コンストラクタは、データベース操作に関連するオブジェクトを作成するために使用されます。
全体のクラスは@Entityによって修飾され、全体のクラスはJPAのエンティティクラスであることを示している。@Table宣言は、クラス全体の対応を示すデータベーステーブルのどれですか?@Idで修飾されたUserの属性idは、JPAが対象とするIDである。同時に@GeneratedValue(strategy = GenerationType.AUTO)
の修飾は、このIDが自動的に生成されると説明している。
他の2つの属性nameemail@Column(nullable = false)によって修正される。二つの列は全部空ではいけないということを説明します。二つの列の名前と属性の名前は同じです。もし違ったらこのように@Column(nullable = false, name="XXXXXX")。です。
簡単なクエリーを作成するか、またはDaoクラスを作成します。
これはもっと簡単です。JPAは自動的に実行時にデータベースを作成するために必要な添削を行います。この実現は私たちが提供したRepositoryによるものとすることができます。
実現します。Userクラスによって、UserDao(Repository):を実現します。

package hello.Entities

import org.springframework.data.repository.CrudRepository
import org.springframework.transaction.annotation.Transactional

@Transactional
interface UserDao : CrudRepository<User, Long> {
  fun findByEmail(email: String): User?
}
汎型のタイプパラメータは、それぞれuserとuserのidのタイプです。UserLong。私たちは添削以外のQueryを定義できます。例えば上記のコードの中でfindByEmail()の方法を定義しました。具体的なカスタムクエリの名前のルールはここを見ることができます。
Controllerでテストしてみます。
データベース、Resetサービスと書庫の接続は全部終わりました。じゃ、テストしてみます。
私たちはsrc\main\java\hello\ControllersUserControllerクラスを作成して、データベースとのデータアクセスをテストします。

package hello.Controllers

import hello.Entities.User
import hello.Entities.UserDao
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseBody

/**
 * Created by Bruce on 2016/3/9.
 */

@RestController
class UserController {
  @Autowired
  private var userDao: UserDao? = null

  @RequestMapping("/create")
  @ResponseBody
  public fun create(name: String, email: String): User? {
    try {
      var newUser = User(name = name, email = email)
      userDao?.save(newUser)

      return newUser
    } catch(e: Exception) {
      return null
    }
  }

  @RequestMapping("/delete")
  @ResponseBody
  public fun delete(id: Long): String {
    try {
      var user = User(id)
      userDao?.delete(user)

      return id.toString() + "deleted"
    } catch(e: Exception) {
      return "delete error " + e.message.toString()
    }
  }

  @RequestMapping("/get-by-email")
  @ResponseBody
  public fun getByEmail(email: String): User? {
    try {
      var user = userDao?.findByEmail(email)
      if (user != null) {
        return user
      } else {
        return null
      }
    } catch(e: Exception) {
      return null
    }
  }

  @RequestMapping("/update")
  @ResponseBody
  public fun updateUser(id: Long, name: String, email: String): User? {
    try {
      var user: User? = userDao?.findOne(id) ?: return null

      user?.name = name
      user?.email = email
      userDao?.save(user)

      return user
    } catch(e: Exception) {
      return null
    }
  }
}

テストURLは、このようにすることができます。
  • //create?name=Jack&[email protected]で、指定されたユーザ名とメールボックスを使ってデータベース内で新しいユーザを生成します。idは自動的に生成されます。
  • /delete?id=3、ID値が3のuserを削除します。
  • //get-by-email?[email protected]、Controllerに使用されるUserDao.findByEmail()は一つのuserに戻りますので、複数があれば、注意してください。 値を返したらエラーが発生します。
  • //udate?id=1&[email protected]&name=Bruceで、idが1のuserに更新されます。
  • 以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。