Kotlin — относительно популярный в последнее время язык программирования со статической типизацией, принадлежащий к тому же семейству Java, что и Groovy и Scala. Kotlin имеет много статических языковых функций, таких как: оценка типов, мультипарадигма, функции расширения, сопоставление с образцом и т. д., поэтому я не могу быть просто едоком дыни, поэтому мне потребовалось немного времени, чтобы понять язык.
В этой статье в основном рассказывается, как использовать Kotlin в сочетании со SpringBt для разработки базовой программы в стиле REST с взаимодействием с базой данных.
Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,МожетНажмитеилисканированиеследующеебудь остороженЗаходи подписывайся ↓ ↓ ↓
лабораторная среда
- Излишне говорить, что JDK, в конце концов, Kotlin — это язык, работающий в среде JVM, поэтому JDK должен, здесь я использую JDK1.8.
- База данных: MySQL
- Компонент доступа к базе данных: Spring data jpa
- J2EE Framework: SpringBT 1.5.2.release
- Инструмент сборки: Gradle
Создание проекта
Нечего сказать, то, что я создал здесь, — это проект Kotlin, основанный на Gradle:
Основной стиль проекта после создания почти такой же, как у проекта SpringBt.Позвольте мне показать вам картинку:
Хорошо, давайте напишем код, чтобы улучшить этот проект.
Улучшить конфигурацию build.gradle
Нам нужно ввести зависимости SpringBt в build.gradle в дополнение к некоторым конкретным плагинам, чтобы мы могли писать программы Kotlin, такие как код Java!
Добавьте следующие зависимости в зависимости:
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 Minimalist Tutorial»):
-
org.jetbrains.kotlin:kotlin-noarg — это подключаемый модуль компилятора без аргументов (no-arg), который создает дополнительный конструктор без аргументов для классов с определенными аннотациями. Этот сгенерированный конструктор является синтетическим, поэтому его нельзя вызвать напрямую из Java или Kotlin, но можно вызвать с помощью отражения. Это позволяет нам создавать экземпляр класса данных с помощью Java Persistence API (JPA).
-
org.jetbrains.kotlin:kotlin-allopen — это полностью открытый подключаемый модуль компилятора. Мы используем Kotlin для вызова фреймворка и библиотек Java Spring AOP.Нам нужно, чтобы классы были открытыми (что может быть реализовано путем наследования), а классы и функции Kotlin по умолчанию являются окончательными, поэтому нам нужно добавить модификатор open к каждому классу и функции. . Такой код очень трудоемок в написании. К счастью, у нас есть полностью открытый подключаемый модуль компилятора. Он адаптирует Kotlin для удовлетворения потребностей этих фреймворков и аннотирует классы указанными аннотациями без явного открытия их членов с помощью ключевого слова open. Например, когда мы используем Spring, нам не нужно открывать все классы, как мы пишем код на Java, нам просто нужно аннотировать их соответствующими аннотациями, такими как @Configuration или @Service.
Проще говоря, цель введения этих двух конкретных плагинов — облегчить нам написание программ Kotlin, таких как код SpringBt!
Настроить 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<People, Long> {
fun findByLastName(lastName: String): List<People>?
}
- PeopleService.kt
@Service
class PeopleService : PeopleRepository {
@Autowired
val peopleRepository: PeopleRepository? = null
override fun findByLastName(lastName: String): List<People>? {
return peopleRepository?.findByLastName(lastName)
}
override fun <S : People?> save(entity: S): S? {
return peopleRepository?.save(entity)
}
override fun <S : People?> save(entities: MutableIterable<S>?): MutableIterable<S>? {
return peopleRepository?.save(entities)
}
override fun delete(entities: MutableIterable<People>?) {
}
override fun delete(entity: People?) {
}
override fun delete(id: Long?) {
}
override fun findAll(ids: MutableIterable<Long>?): MutableIterable<People>? {
return peopleRepository?.findAll(ids)
}
override fun findAll(): MutableIterable<People>? {
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<Any, Any>()
map.put("hello", peoples!!)
return map
}
}
Видно, что с благословением на отсутствие параметров и полностью открытые компоненты практически нет разницы между написанием кода и написанием кода на Java.
фактический эксперимент
Во-первых, вам нужно зайти в Mysql, чтобы создать базу данных и вставить некоторые данные:
Затем запустите проект, посетите: http://localhost:7000/Привет?Фамилия=Ванг
Вы можете видеть, что данные были успешно получены:
использованная литература
"Учебник минимализма Kotlin"
постскриптум
Дополнительные статьи автора о SpringBt находятся здесь:
- Мониторинг приложений Spring Boot на практике
- Приложения SpringBoot развертываются во внешнем контейнере Tomcat.
- Практика поисковой системы ElasticSearch в SpringBt
- Предварительное изучение совместного программирования Kotlin+SpringBoot
- Практика ведения журнала Spring Boot
- Элегантное кодирование SpringBoot: благословение Ломбока
Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:
- Используйте стек технологий K8S для создания личного частного облака Серийная статья
- Подробная конфигурация сервера Nginx из списка конфигураций
- Строительство центра мониторинга визуализации контейнеров Docker
- Использование ELK для создания контейнерного центра журналов приложений Docker
- Практика фреймворка RPC: Apache Thrift
- Практика фреймворка RPC: Google gRPC
- Построение микросервисного центра отслеживания цепочки вызовов
- Контейнеры Docker обмениваются данными между хостами
- Предварительное исследование кластера Docker Swarm
- Несколько рекомендаций по эффективному написанию Dockerfile