最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解用Kotlin寫一個基于Spring Boot的RESTful服務(wù)

 更新時間:2017年05月22日 15:01:17   作者:Mr 布魯斯  
這篇文章主要介紹了詳解用Kotlin寫一個基于Spring Boot的RESTful服務(wù) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Spring太復雜了,配置這個東西簡直就是浪費生命。尤其在沒有什么并發(fā)壓力,隨便搞一個RESTful服務(wù),讓整個業(yè)務(wù)跑起來先的情況下,更是么有必要糾結(jié)在一堆的XML配置上。顯然這么想的人是很多的,于是就有了Spring Boot。又由于Java 8太墨跡于是有了Kotlin。

數(shù)據(jù)源使用MySql。通過Spring Boot這個基本不怎么配置的,不怎么微的微框架的Spring Data JPA和Hibernate來訪問數(shù)據(jù)。

處理依賴

這里使用Gradle來處理依賴。

首先下載官網(wǎng)給的初始項目:

git clone https://github.com/spring-guides/gs-accessing-data-jpa.git

然后跳轉(zhuǎn)到gs-accessing-data-jpa/initial目錄下。

用IntelliJ IDEA打開這個項目,選擇使用Gradle管理依賴。

之后Gradle會自動下載依賴項。這會花一點時間。你可以去和妹子聊一會兒了。。

如果你覺得這樣很麻煩的話,可以建立一個Gradle項目。之后根據(jù)上面的例子建立一個目錄:

└── src
  └── main
    └── java
      └── hello

但是無論是用上面的哪種方式,最后都需要在Gradle文件中添加依賴項。這個Gradle文件是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下編輯配置文件。默認是沒有這個文件和相應(yīng)的目錄的,自行創(chuàng)建。

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,項目所需的數(shù)據(jù)庫和相關(guān)表、列會自動根據(jù)定義的實體類創(chuàng)建。點擊這里,查看更多配置的說明。

創(chuàng)建一個簡單地實體類

這里定義一個簡單地實體類,并聲明為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最大的優(yōu)點就是省去了定義getter和setter,以及toString()的時間。這些都已經(jīng)默認實現(xiàn)。所以,在使用data class的對象的時候直接可以使用name、email當然還有id這樣的屬性直接訪問。

無參數(shù)的構(gòu)造函數(shù)是給JPA用的,所以訪問級別設(shè)定為protected。主構(gòu)造函數(shù)是用來創(chuàng)建和數(shù)據(jù)庫操作相關(guān)的對象的。

整個的整個類被@Entity修飾,說明整個類是一個JPA的實體類。@Table聲明用來表明整個類對應(yīng)的數(shù)據(jù)庫表是哪一個。
@Id修飾的User的屬性id,會被JPA認為的對象的ID。同時@GeneratedValue(strategy = GenerationType.AUTO)
的修飾說明這個ID是自動生成的。

另外的兩個屬性nameemail@Column(nullable = false)修飾。說明兩個列都是不可以為空的,同時說明兩個列的名字和屬性的名字是相同的。如果不同可以這樣@Column(nullable = false, name="XXXXXX")。

創(chuàng)建簡單地查詢,或者說Dao類

這個就更加的簡單了。JPA會自動在運行時創(chuàng)建數(shù)據(jù)庫需要的增刪改查的實現(xiàn)。這個實現(xiàn)可以是根據(jù)我們給出的Repository
來實現(xiàn)的。

根據(jù)User類,我們來實現(xiàn)一個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?
}

泛型的類型參數(shù)分別是user和user的id的類型:User, Long。我們可以定義增刪改查之外的Query。比如在上面的代碼里我們定義了一個findByEmail()方法。具體的自定義查詢時的命名規(guī)則可以查看這里。

用Controller測試一下

數(shù)據(jù)庫,Rest服務(wù)和書庫的連接都已經(jīng)搞定。那么,我們就來測試一下。

我們在目錄src\main\java\hello\Controllers創(chuàng)建一個UserController類來測試和數(shù)據(jù)庫的數(shù)據(jù)存取。

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可以是這樣的:

  1. /create?name=Jack&email=hello@234.com,使用指定的用戶名和郵箱在數(shù)據(jù)庫里生成一個新的user,id是自動生成的。
  2. /delete?id=3, 刪除id值為3的user。
  3. /get-by-email?email=hello@234.com,注意Controller用到的UserDao.findByEmail()只返回一個user,所以如果有多個 返回值的話會報錯。
  4. /update?id=1&email=what@123.com&name=Bruce,更新id為1的user。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java高并發(fā)下鎖的優(yōu)化詳解

    Java高并發(fā)下鎖的優(yōu)化詳解

    這篇文章主要介紹了Java高并發(fā)下鎖的優(yōu)化詳解,鎖是最常用的同步方法之一,在高并發(fā)的環(huán)境下,激烈的鎖競爭會導致程序的性能下降,下面是一些關(guān)于鎖的使用建議,可以把這種副作用降到最低,需要的朋友可以參考下
    2024-01-01
  • java分布式流處理組件Producer入門詳解

    java分布式流處理組件Producer入門詳解

    這篇文章主要為大家介紹了java分布式流處理組件Producer入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Spring常見的事務(wù)失效場景及解決方案

    Spring常見的事務(wù)失效場景及解決方案

    Spring 事務(wù)管理是企業(yè)級應(yīng)用開發(fā)中不可或缺的一部分,它可以幫助我們確保數(shù)據(jù)的一致性和完整性,然而,在實際開發(fā)中,由于各種原因,事務(wù)可能會失效,本文將詳細介紹 Spring 事務(wù)失效的常見情況,并提供相應(yīng)的解決方案和示例代碼,需要的朋友可以參考下
    2024-11-11
  • JAVA簡單實現(xiàn)MD5注冊登錄加密實例代碼

    JAVA簡單實現(xiàn)MD5注冊登錄加密實例代碼

    本篇文章主要介紹了JAVA簡單實現(xiàn)MD5注冊登錄加密實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • idea項目打開后出現(xiàn)橙色的時鐘圖標的解決

    idea項目打開后出現(xiàn)橙色的時鐘圖標的解決

    本文主要介紹了idea項目打開后出現(xiàn)橙色的時鐘圖標的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java中常用的代碼匯總

    Java中常用的代碼匯總

    本文給大家分享了20個常用的java代碼,都是別人項目中使用過的代碼,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-05-05
  • 淺談Java的SPI技術(shù)

    淺談Java的SPI技術(shù)

    這篇文章主要介紹了Java的SPI技術(shù)的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • SpringBoot+MinIO實現(xiàn)文件切片極速詳解

    SpringBoot+MinIO實現(xiàn)文件切片極速詳解

    在現(xiàn)代Web應(yīng)用中,文件上傳是一個常見的需求,尤其是對于大文件的上傳,如視頻、音頻或大型文檔,所以本文就來為大家介紹一下如何使用Spring Boot和MinIO實現(xiàn)文件切片極速上傳技術(shù)吧
    2023-12-12
  • mybatis-plus返回查詢總記錄數(shù)方式

    mybatis-plus返回查詢總記錄數(shù)方式

    這篇文章主要介紹了mybatis-plus返回查詢總記錄數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot如何導出Jar包并測試(使用IDEA)

    SpringBoot如何導出Jar包并測試(使用IDEA)

    這篇文章主要介紹了SpringBoot如何導出Jar包并測試(使用IDEA),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

台安县| 阿瓦提县| 萝北县| 贡嘎县| 蒲城县| 故城县| 澜沧| 海伦市| 河津市| 竹山县| 临桂县| 乳源| 三原县| 湛江市| 尉氏县| 武隆县| 鹤庆县| 云浮市| 尚义县| 义乌市| 札达县| 通许县| 竹溪县| 江孜县| 上犹县| 舟山市| 沙坪坝区| 佛教| 中卫市| 安阳县| 兰坪| 久治县| 芷江| 安丘市| 兴国县| 渭南市| 宣汉县| 辛集市| 贡嘎县| 北流市| 十堰市|