摘要:是一門最近比較流行的靜態類型編程語言,而且和一樣同屬系。這個生成的構造函數是合成的,因此不能從或中直接調用,但可以使用反射調用。
Kotlin是一門最近比較流行的靜態類型編程語言,而且和Groovy、Scala一樣同屬Java系。Kotlin具有的很多靜態語言特性諸如:類型判斷、多范式、擴展函數、模式匹配等等讓我無法只作為一個吃瓜群眾了,所以稍微花了點時間了解了一下該語言。
本文主要介紹一下如何使用Kotlin結合SpringBt開發一個帶有數據庫交互的REST風格基本程序
注: 本文首發于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓實驗環境
JDK不用說了,Kotlin畢竟是運行在JVM環境下的語言,所以JDK必須,我這里用的JDK1.8
數據庫:MySQL
數據庫訪問組件:Spring data jpa
J2EE框架:SpringBt 1.5.2.RELEASE
構建工具:Gradle
工程創建沒啥好說的,我這里創建的是基于Gradle的Kotlin工程:
創建完成后的基本工程樣式和SpringBt的工程幾乎沒任何區別,給張圖示意一下好了:
好啦,接下來我們就來寫代碼完善這個工程即可
完善build.gradle配置我們需要在build.gradle中引入SpringBt依賴,除此之外還要引入一些特定的插件方便我們向寫Java代碼一樣來寫Kotlin程序!
在dependencies中加入如下依賴:
dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" testCompile group: "junit", name: "junit", version: "4.12" compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test") compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("mysql:mysql-connector-java:5.1.13") }
這樣SpringBt相關的依賴就配置上了!
接下來我們配置兩個非常關鍵的插件依賴:
無參(no-arg)插件
全開放(allopen)插件
我們先配上,等下解釋:
buildscript { ext.kotlin_version = "1.1.1" ext.springboot_version = "1.5.2.RELEASE" repositories { mavenCentral() } dependencies { // Kotlin Gradle插件 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // SpringBoot Gradle插件 classpath("org.springframework.boot:spring-boot-gradle-plugin:$springboot_version") // Kotlin整合SpringBoot的默認無參構造函數,默認把所有的類設置open類插件 classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version") // 無參插件 classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version") // 全開放插件 } }
其中(以下解釋源自《Kotlin極簡教程》):
org.jetbrains.kotlin:kotlin-noarg是無參(no-arg)編譯器插件,它為具有特定注解的類生成一個額外的零參數構造函數。 這個生成的構造函數是合成的,因此不能從 Java 或 Kotlin 中直接調用,但可以使用反射調用。 這樣我們就可以使用 Java Persistence API(JPA)實例化 data 類。
org.jetbrains.kotlin:kotlin-allopen 是全開放編譯器插件。我們使用Kotlin 調用Java的Spring AOP框架和庫,需要類為 open(可被繼承實現),而Kotlin 類和函數都是默認 final 的,這樣我們需要為每個類和函數前面加上open修飾符。這樣的代碼寫起來很費事。還好,我們有all-open 編譯器插件。它會適配 Kotlin 以滿足這些框架的需求,并使用指定的注解標注類而其成員無需顯式使用 open 關鍵字打開。 例如,當我們使用 Spring 時,就不需要打開所有的類,跟我們在Java中寫代碼一樣,只需要用相應的注解標注即可,如 @Configuration 或 @Service。
講白了,引入這兩個特定的插件的目的就是為了方便我們向寫SpringBt代碼一樣來寫Kotlin程序!
配置application.properties這里面主要是跟Mysql數據庫相關的一些配置:
spring.datasource.url = jdbc:mysql://localhost:3306/easykotlin spring.datasource.username = root spring.datasource.password = 你的Mysql密碼 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.database = MYSQL spring.datasource.testWhileIdle = true spring.datasource.validationQuery = SELECT 1 spring.jpa.show-sql = true spring.jpa.hibernate.ddl-auto = update spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect server.port=7000正式編寫工程
我們需要去數據庫中查詢東西,所以二話不說,寫個訪問數據庫的標準代碼層:
controller
entity
repository
service
各部分代碼如下:
People.kt
@Entity class People( @Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long?, val firstName: String?, val lastName: String?, val gender: String?, val age: Int?, val gmtCreated: Date, val gmtModified: Date ) { override fun toString(): String { return "People(id=$id, firstName="$firstName", lastName="$lastName", gender="$gender", age=$age, gmtCreated=$gmtCreated, gmtModified=$gmtModified)" } }
PeopleRepository.kt
interface PeopleRepository : CrudRepository{ fun findByLastName(lastName: String): List ? }
PeopleService.kt
@Service class PeopleService : PeopleRepository { @Autowired val peopleRepository: PeopleRepository? = null override fun findByLastName(lastName: String): List? { return peopleRepository?.findByLastName(lastName) } override fun save(entity: S): S? { return peopleRepository?.save(entity) } override funsave(entities: MutableIterable?): MutableIterable? { return peopleRepository?.save(entities) } override fun delete(entities: MutableIterable?) { } override fun delete(entity: People?) { } override fun delete(id: Long?) { } override fun findAll(ids: MutableIterable ?): MutableIterable ? { return peopleRepository?.findAll(ids) } override fun findAll(): MutableIterable ? { return peopleRepository?.findAll() } override fun exists(id: Long?): Boolean { return peopleRepository?.exists(id)!! } override fun count(): Long { return peopleRepository?.count()!! } override fun findOne(id: Long?): People? { return peopleRepository?.findOne(id) } override fun deleteAll() { } }
PeopleController.kt
@Controller class PeopleController { @Autowired val peopleService: PeopleService? = null @GetMapping(value = "/hello") @ResponseBody fun hello(@RequestParam(value = "lastName") lastName: String): Any { val peoples = peopleService?.findByLastName(lastName) val map = HashMap() map.put("hello", peoples!!) return map } }
可見有了無參、全開放組件加持后,寫代碼和寫Java的代碼基本沒區別了
實際實驗首先需要去Mysql中建好數據庫,并插入一些數據:
然后啟動工程,訪問:
http://localhost:7000/hello?lastName=wang
可以看到數據成功被取回:
參考文獻《Kotlin極簡教程》
后記作者更多的原創文章在此,歡迎觀賞
My Personal Blog
作者更多的SpringBt實踐文章在此:
Spring Boot應用監控實戰
SpringBoot應用部署于外置Tomcat容器
ElasticSearch搜索引擎在SpringBt中的實踐
初探Kotlin+SpringBoot聯合編程
Spring Boot日志框架實踐
SpringBoot優雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關于容器化、微服務化方面的文章:
利用K8S技術棧打造個人私有云 連載文章
從一份配置清單詳解Nginx服務器配置
Docker容器可視化監控中心搭建
利用ELK搭建Docker容器化應用日志中心
RPC框架實踐之:Apache Thrift
RPC框架實踐之:Google gRPC
微服務調用鏈追蹤中心搭建
Docker容器跨主機通信
Docker Swarm集群初探
高效編寫Dockerfile的幾條準則
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68333.html
摘要:概述進行的開發過程中,我們很多時候經常需要重啟服務器才能保證修改的源代碼文件或者一些諸如的配置文件以及一些靜態文件生效,這樣耗時又低效。 showImg(https://segmentfault.com/img/remote/1460000015363888); 概述 進行SpringBoot的Web開發過程中,我們很多時候經常需要重啟Web服務器才能保證修改的 源代碼文件、或者一些...
摘要:但考慮到實際的情形中,我們的服務器一般是另外部署好了的,有專門的維護方式。此時我們需要剝離掉應用內置的服務器,進而將應用發布并部署到外置的容器之中,本文就實踐一下這個。 showImg(https://segmentfault.com/img/remote/1460000015173574); 0x01. 概述 SpringBoot平時我們用的爽歪歪,爽到它自己連Tomcat都自集成...
摘要:微服務的基本思想在于考慮圍繞著業務領域組件來創建應用,這些應用可獨立地進行開發管理和加速。在分散的組件中使用微服務云架構和平臺,使部署管理和服務功能交付變得更加簡單。 showImg(https://segmentfault.com/img/remote/1460000014332184); 概述 當下web服務端開發中最火的名詞中絕對有微服務的一席之地,其也成為當下互聯網后端服務架...
摘要:概述應用一旦容器化以后,需要考慮的就是如何采集位于容器中的應用程序的打印日志供運維分析。 showImg(https://segmentfault.com/img/remote/1460000014146680); 概述 應用一旦容器化以后,需要考慮的就是如何采集位于Docker容器中的應用程序的打印日志供運維分析。典型的比如 SpringBoot應用的日志 收集。本文即將闡述如何利...
閱讀 2484·2023-04-25 19:24
閱讀 1700·2021-11-11 16:54
閱讀 2833·2021-11-08 13:19
閱讀 3547·2021-10-25 09:45
閱讀 2552·2021-09-13 10:24
閱讀 3276·2021-09-07 10:15
閱讀 4014·2021-09-07 10:14
閱讀 2950·2019-08-30 15:56