全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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。

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


# kotlin  # spring  # boot  # restful  # 关于Spring Boot和Kotlin的联合开发  # spring boot + jpa + kotlin入门实例详解  # 使用Spring boot + jQuery上传文件(kotlin)功能实例详解  # Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法  # Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图的方法  # Kotlin + Spring Boot 请求参数验证的代码实例  # Spring Boot 与 Kotlin 使用Redis数据库的配置方法  # Spring Boot 与 Kotlin 上传文件的示例代码  # Spring Boot与Kotlin定时任务的示例(Scheduling Tasks)  # 利用Kotlin + Spring Boot实现后端开发  # 配置文件  # 是这样  # 实体类  # 建立一个  # 来实现  # 创建一个  # 自动生成  # 测试一下  # 都是  # 是一个  # 放在  # 你可以  # 多个  # 不可以  # 所需  # 没有什么  # 我们可以  # 人是  # 点击这里  # 自定义 


相关文章: 合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  C#如何在一个XML文件中查找并替换文本内容  建站之星展会模版如何一键下载生成?  如何高效配置IIS服务器搭建网站?  已有域名和空间如何快速搭建网站?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  宁波自助建站系统如何快速打造专业企业网站?  青岛网站建设如何选择本地服务器?  高端云建站费用究竟需要多少预算?  如何通过虚拟主机空间快速建站?  定制建站价位费用解析与套餐推荐全攻略  建站主机SSH密钥生成步骤及常见问题解答?  ,购物网站怎么盈利呢?  北京网站制作公司哪家好一点,北京租房网站有哪些?  ,网站推广常用方法?  建站主机选哪种环境更利于SEO优化?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何通过远程VPS快速搭建个人网站?  建站为何优先选择香港服务器?  如何快速配置高效服务器建站软件?  代购小票制作网站有哪些,购物小票的简要说明?  如何在阿里云完成域名注册与建站?  如何快速搭建响应式可视化网站?  如何基于PHP生成高效IDC网络公司建站源码?  如何通过宝塔面板实现本地网站访问?  如何在万网主机上快速搭建网站?  linux top下的 minerd 木马清除方法  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何通过虚拟主机快速完成网站搭建?  Android滚轮选择时间控件使用详解  贸易公司网站制作流程,出口贸易网站设计怎么做?  非常酷的网站设计制作软件,酷培ai教育官方网站?  微信小程序 input输入框控件详解及实例(多种示例)  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何快速搭建高效可靠的建站解决方案?  如何零基础开发自助建站系统?完整教程解析  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何用西部建站助手快速创建专业网站?  为什么Go需要go mod文件_Go go mod文件作用说明  建站之星如何优化SEO以实现高效排名?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  装修招标网站设计制作流程,装修招标流程?  如何在IIS管理器中快速创建并配置网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  深圳网站制作培训,深圳哪些招聘网站比较好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。