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.8dependencies {// 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.Entitiesimport 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.Entitiesimport 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测试一下

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

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

package hello.Controllersimport 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 {@Autowiredprivate var userDao: UserDao? = null@RequestMapping("/create")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic fun updateUser(id: Long, name: String, email: String): User? {try {var user: User? = userDao?.findOne(id) ?: return nulluser?.name = nameuser?.email = emailuserDao?.save(user)return user} catch(e: Exception) {return null}}
}

测试URL可以是这样的:

  • /create?name=Jack&email=hello@234.com,使用指定的用户名和邮箱在数据库里生成一个新的user,id是自动生成的。
  • /delete?id=3, 删除id值为3的user。
  • /get-by-email?email=hello@234.com,注意Controller用到的UserDao.findByEmail()只返回一个user,所以如果有多个
    返回值的话会报错。
  • /update?id=1&email=what@123.com&name=Bruce,更新id为1的user。

代码在这里

参考文章:
http://blog.netgloo.com/2014/10/27/using-mysql-in-spring-boot-via-spring-data-jpa-and-hibernate/
https://spring.io/guides/gs/accessing-data-jpa/

用Kotlin写一个基于Spring Boot的RESTful服务相关推荐

  1. 保姆级的一个基于spring boot开发的前后端分离商城教程

    前言 推荐一个基于spring boot开发前后端分离商城,有完整的代码笔记和视频教程,希望对正在找项目练手的同学有所帮助 本文资料文档领取(在文末) 一.项目背景 5中常见的电商模式 B2B .B2 ...

  2. 自荐Mall4j项目一个基于spring boot的Java开源商城系统

    前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样 ...

  3. 使用Spring Boot构建RESTFul服务

    每个人都在谈论微服务,例如WSO2微服务框架 , Spring Boot等.由于我已经很长时间没有从事任何与Spring相关的项目了,所以我想到了使用Spring Boot实现一个简单的RESTFul ...

  4. 推荐一个基于 Spring Boot+MyBatis Plus+JWT 的问卷系统!

    你好呀,我是 Guide!这里是 JavaGuide 的「优质开源项目推荐」第 8 期,每一期我都会精选 5 个高质量的 Java 开源项目. 时间过的真快,不知不觉「优质开源项目推荐」系列已经持续半 ...

  5. 一个基于 Spring Boot 的开源社区

    一款基于 Spring Boot 的开源社区:forum-java,类似于微信开放社区.头条开发者社区等等.forum-java 是一个 100% 开源的面向内容的社区论坛. 开源社区有用户端和管理端 ...

  6. 一个基于 Spring Boot 的项目骨架

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 最近使用Spring Boot 配合 MyBatis .通用Map ...

  7. 一个基于Spring Boot的API、RESTful API项目骨架

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:简单的土豆 www.jianshu.com/p/99fcea ...

  8. 你值得拥有!一个基于 Spring Boot 的API、RESTful API 的项目

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 前言 最近使用Spring ...

  9. 一个基于 Spring Boot 的项目骨架,拿走即用

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去个人原创+1博客:点击前往,查看更多 作者:简单 ...

最新文章

  1. typora新增主题,typora将主题导入本地
  2. ios 如何在cell中去掉_IOS之表视图单元格删除、移动及插入
  3. mmse评估量表_简易精神状态评价量表(mmse量表) 打印版.doc
  4. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)
  5. react 动态路 嵌套动子路由_2020年,我是如何从一名Vueer转岗到React阵营
  6. SQLServer删除登录帐户
  7. 方立勋_30天掌握JavaWeb_JSP
  8. k3 审核流程图_3-金蝶K3操作流程图详解
  9. Oh-My-Zsh 下远程ssh的乱码问题
  10. Java中如何判断两个对象是否相等(Java equals and ==)
  11. java如何让源码加密还能运行_如何有效防止Java程序源码被人偷窥?
  12. 银川JW万豪酒店与银川万怡酒店双品牌酒店启幕
  13. Expandable TabBar
  14. k8s1.23 Ingress-nginx实操
  15. Docer中使能GPU,GDB,perf
  16. MySQL自学笔记(二)
  17. 联想天逸 510S 2022怎么样
  18. C/C++基础 hypot函数
  19. 苏州蜗牛面试感想 ------- 知其然而不知其所以然
  20. 余弦定理对比文本相似度实现查重

热门文章

  1. JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
  2. Android--面试题整理(二)
  3. poj Buy Tickets
  4. 设备坐标与逻辑坐标关系
  5. VS.NET 2005 Beta2的稳定性太差了:(
  6. 多线程使用SO_REUSEPORT来实现多个socket监听同一个端口
  7. OpenGL 各类库的解析 gl/glu/glut/freeglut/glfw/glew
  8. Ubuntu 16.04下Caffe-SSD的应用(一)——编译Caffe-SSD的CPU版本与GPU版本
  9. 笔记1——C++多态与Java多态的异同
  10. 修改Ubuntu和XP双系统时的默认启动系统