用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.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的对象的时候直接可以使用name
、email
当然还有id
这样的属性直接访问。
无参数的构造函数是给JPA用的,所以访问级别设定为protected
。主构造函数是用来创建和数据库操作相关的对象的。
整个的整个类被@Entity
修饰,说明整个类是一个JPA的实体类。@Table
声明用来表明整个类对应的数据库表是哪一个。
@Id
修饰的User
的属性id
,会被JPA认为的对象的ID。同时@GeneratedValue(strategy = GenerationType.AUTO)
的修饰说明这个ID是自动生成的。
另外的两个属性name
和email
被@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的类型:User
, Long
。我们可以定义增删改查之外的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服务相关推荐
- 保姆级的一个基于spring boot开发的前后端分离商城教程
前言 推荐一个基于spring boot开发前后端分离商城,有完整的代码笔记和视频教程,希望对正在找项目练手的同学有所帮助 本文资料文档领取(在文末) 一.项目背景 5中常见的电商模式 B2B .B2 ...
- 自荐Mall4j项目一个基于spring boot的Java开源商城系统
前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样 ...
- 使用Spring Boot构建RESTFul服务
每个人都在谈论微服务,例如WSO2微服务框架 , Spring Boot等.由于我已经很长时间没有从事任何与Spring相关的项目了,所以我想到了使用Spring Boot实现一个简单的RESTFul ...
- 推荐一个基于 Spring Boot+MyBatis Plus+JWT 的问卷系统!
你好呀,我是 Guide!这里是 JavaGuide 的「优质开源项目推荐」第 8 期,每一期我都会精选 5 个高质量的 Java 开源项目. 时间过的真快,不知不觉「优质开源项目推荐」系列已经持续半 ...
- 一个基于 Spring Boot 的开源社区
一款基于 Spring Boot 的开源社区:forum-java,类似于微信开放社区.头条开发者社区等等.forum-java 是一个 100% 开源的面向内容的社区论坛. 开源社区有用户端和管理端 ...
- 一个基于 Spring Boot 的项目骨架
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 最近使用Spring Boot 配合 MyBatis .通用Map ...
- 一个基于Spring Boot的API、RESTful API项目骨架
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:简单的土豆 www.jianshu.com/p/99fcea ...
- 你值得拥有!一个基于 Spring Boot 的API、RESTful API 的项目
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 前言 最近使用Spring ...
- 一个基于 Spring Boot 的项目骨架,拿走即用
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去个人原创+1博客:点击前往,查看更多 作者:简单 ...
最新文章
- typora新增主题,typora将主题导入本地
- ios 如何在cell中去掉_IOS之表视图单元格删除、移动及插入
- mmse评估量表_简易精神状态评价量表(mmse量表) 打印版.doc
- Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)
- react 动态路 嵌套动子路由_2020年,我是如何从一名Vueer转岗到React阵营
- SQLServer删除登录帐户
- 方立勋_30天掌握JavaWeb_JSP
- k3 审核流程图_3-金蝶K3操作流程图详解
- Oh-My-Zsh 下远程ssh的乱码问题
- Java中如何判断两个对象是否相等(Java equals and ==)
- java如何让源码加密还能运行_如何有效防止Java程序源码被人偷窥?
- 银川JW万豪酒店与银川万怡酒店双品牌酒店启幕
- Expandable TabBar
- k8s1.23 Ingress-nginx实操
- Docer中使能GPU,GDB,perf
- MySQL自学笔记(二)
- 联想天逸 510S 2022怎么样
- C/C++基础 hypot函数
- 苏州蜗牛面试感想 ------- 知其然而不知其所以然
- 余弦定理对比文本相似度实现查重
热门文章
- JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
- Android--面试题整理(二)
- poj Buy Tickets
- 设备坐标与逻辑坐标关系
- VS.NET 2005 Beta2的稳定性太差了:(
- 多线程使用SO_REUSEPORT来实现多个socket监听同一个端口
- OpenGL 各类库的解析 gl/glu/glut/freeglut/glfw/glew
- Ubuntu 16.04下Caffe-SSD的应用(一)——编译Caffe-SSD的CPU版本与GPU版本
- 笔记1——C++多态与Java多态的异同
- 修改Ubuntu和XP双系统时的默认启动系统