欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解用Kotlin写一个基于Spring Boot的RESTful服务

程序员文章站 2024-02-21 21:23:22
spring太复杂了,配置这个东西简直就是浪费生命。尤其在没有什么并发压力,随便搞一个restful服务,让整个业务跑起来先的情况下,更是么有必要纠结在一堆的xml配置上。...

spring太复杂了,配置这个东西简直就是浪费生命。尤其在没有什么并发压力,随便搞一个restful服务,让整个业务跑起来先的情况下,更是么有必要纠结在一堆的xml配置上。显然这么想的人是很多的,于是就有了spring boot。又由于java 8太墨迹于是有了kotlin。

数据源使用mysql。通过spring boot这个基本不怎么配置的,不怎么微的微框架的spring data jpa和hibernate来访问数据。

处理依赖

这里使用gradle来处理依赖。

首先下载官网给的初始项目:

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

然后跳转到gs-accessing-data-jpa/initial目录下。

用intellij idea打开这个项目,选择使用gradle管理依赖。

之后gradle会自动下载依赖项。这会花一点时间。你可以去和妹子聊一会儿了。。

如果你觉得这样很麻烦的话,可以建立一个gradle项目。之后根据上面的例子建立一个目录:

└── 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下编辑配置文件。默认是没有这个文件和相应的目录的,自行创建。

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是自动生成的。

另外的两个属性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的类型:user, long。我们可以定义增删改查之外的query。比如在上面的代码里我们定义了一个findbyemail()方法。具体的自定义查询时的命名规则可以查看这里。

用controller测试一下

数据库,rest服务和书库的连接都已经搞定。那么,我们就来测试一下。

我们在目录src\main\java\hello\controllers创建一个usercontroller类来测试和数据库的数据存取。

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,使用指定的用户名和邮箱在数据库里生成一个新的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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。