1. 程式人生 > >SpringBoot?Kotlin?Mybatis?Thymeleaf?簡單的瞭解一波!

SpringBoot?Kotlin?Mybatis?Thymeleaf?簡單的瞭解一波!

扯淡也需要積累點資料

這裡先備註下需要哪些準備。

  1. 開發工具:Intellij idea(用慣了AS用這個絕對順手)
  2. Java環境:JDK1.8(高了的沒用過,反正對於Android來說1.8夠用了)。
  3. 資料庫:Mysql(下個壓縮包的就行,感覺解壓版的很是好配,也很省時間)。
  4. Maven:自己部個本地的也行,用Intellij idea自帶的也行,反正別忘了配置下映象,要不下東西特別慢,要不就是下不下來。

一、建立專案

  建立專案看下面這張圖就行了,這裡把用到的模組截了出來。pom.xml就不用貼了,只要之前的準備都完事,那麼這麼建立絕對沒問題。
這裡寫圖片描述

二、新增Kotlin支援

  新增Kotlin支援,很是簡單啊。其實說簡單倒不如說是方便。

1.建立Kotlin檔案:

  這裡我建立了一個person類,效果如下:
這裡寫圖片描述
  要的的就是上面圖中提示的部分,接下來單擊Configure,然後在彈出的彈窗中,單擊Maven選項。
這裡寫圖片描述
  然後在彈窗中點選確定,新增Kotlin就完事了。如果沒有自動匯入,記得點開Event log,看著提示選一下匯入的方式。
這裡寫圖片描述
  這裡貼一下Kotlin檔案的啟動類寫法:

package com.lyan.study

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.
SpringBootApplication @SpringBootApplication open class StudyApplication fun main(args: Array<String>) { SpringApplication.run(StudyApplication::class.java, *args) }

2.新增NoArg外掛和AllOpen外掛:

  具體的作用我就不囉嗦了。配置示意圖如下:
這裡寫圖片描述
  配置內容如下,註解類,AllOpen和NoArg與pom.xml中的配置是對應的,pom.xml中設定的就是AllOpen和NoArg類的包名+類名:

package com.lyan.study.annotation

/**
 * 使 class 能被繼承
 */
annotation class AllOpen

/**
 * 使data class 有無參構造
 */
annotation class NoArg

  外掛的依賴:

<!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-allopen -->
<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-allopen</artifactId>
    <version>${kotlin.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-noarg -->
<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-noarg</artifactId>
    <version>${kotlin.version}</version>
</dependency>

  外掛的配置,這裡我對原有的配置改變了下位置,這裡注意一下就行。

<configuration>
    <jvmTarget>1.8</jvmTarget>
        <compilerPlugins>
            <plugin>all-open</plugin><!-- all-open 可使class被繼承 -->
            <plugin>no-arg</plugin><!-- no-arg 可使data class 有無參構造 -->
        </compilerPlugins>
    <pluginOptions>
        <option>all-open:annotation=com.lyan.study.annotation.AllOpen</option>
        <option>no-arg:annotation=com.lyan.study.annotation.NoArg</option>
    </pluginOptions>
</configuration>

使用示例

AllOpen
package com.lyan.study

import com.lyan.study.annotation.AllOpen
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication
@AllOpen
class StudyApplication

fun main(args: Array<String>) {
    SpringApplication.run(StudyApplication::class.java, *args)
}
NoArg
package com.lyan.study.bean

import com.lyan.study.annotation.NoArg

@NoArg
data class Person(var id: Int, var name: String)

三、配置Mybatis和連線資料庫

1.配置application配置檔案:

  直接配置application.yml。把原來的那個配置檔案刪了建立一個yml就行。配置如圖所示,配了個數據源,配了個mapper檔案的對映路徑,Mybatis配置這快,我拿到程式碼裡設定沒用xml(其實mapper對映路徑,我都想拿到程式碼裡設定,只是沒百度到):
這裡寫圖片描述

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456

server:
  port: 8080
mybatis:
  #配置檔案位置
  #config-location: classpath:mapper/config/mybatis-config.xml
  #對映檔案的位置
  mapper-locations: classpath:mapper/*.xml

2.配置Mybatis的先關設定:

  這樣設定完就不需要在程式的入口設定@MapperScan了。這裡我故意不用open class和open fun。就是為了驗證AllOpen的作用。

package com.lyan.study

import com.lyan.study.annotation.AllOpen
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
@AllOpen
class MyConfig {
    @Bean
    fun configurationCustomizer(): ConfigurationCustomizer {
        return ConfigurationCustomizer {
            it.isMapUnderscoreToCamelCase = true
            it.typeAliasRegistry.registerAliases("com.lyan.study.bean")
            it.addMappers("com.lyan.study.mapper")
        }
    }
}

3.連線資料庫測試

  建立對映檔案:

package com.lyan.study.mapper

import com.lyan.study.bean.Person

@Mapper
@Component
interface PersonMapper {
    //查詢人員列表
    fun getPersons():MutableList<Person>
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--suppress ALL -->
<mapper namespace="com.lyan.study.mapper.PersonMapper">
    <select id="getPersons" resultType="person">
        SELECT * FROM PERSON
    </select>
</mapper>

  這裡附上資料的圖片,一共五條:
這裡寫圖片描述
  查詢該表中所有的資料並打印出來,測試程式碼如下:

package com.lyan.study;

import com.lyan.study.mapper.PersonMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class StudyApplicationTests {

    @Resource
    private PersonMapper personMapper;

    @Test
    public void contextLoads()  {
        personMapper.getPersons().forEach(System.out::println);
    }

}

  接下來執行測試程式碼,如果報錯了那麼恭喜你中獎了,因為我之前都沒遇到過,就在寫這篇筆記的時候無意間踩到了這個地雷。部分錯誤日誌如下(如果沒報錯直接忽略這處就行):
這裡寫圖片描述
  這裡我參考了這個連結Spring Boot and Kotlin。我冒蒙的添加了kotlin-reflect這個依賴,沒想到還真好使了。將下面的依賴配置放到pom.xml中就行了。

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
    <version>${kotlin.version}</version>
</dependency>

  最後來看下測試程式碼執行的結果(效果還算是複合預期):
這裡寫圖片描述

四、Thymeleaf(來個頁面意思一下)

1、建立個Controller程式碼如下:

package com.lyan.study.controller

import com.lyan.study.mapper.PersonMapper
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.servlet.ModelAndView

@Controller
class TestController {

    @Autowired
    lateinit var personMapper: PersonMapper

    /**
     * 將陣列傳到頁面中
     */
    @GetMapping("/perList")
    fun perList() : ModelAndView = ModelAndView("test","pers",personMapper.getPersons())

}

2、Html中的功能還是遍歷陣列展示出來,內容如下:

<!DOCTYPE html>
<!--suppress ThymeleafVariablesResolveInspection -->
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>測試頁面</title>
</head>
<body>
    <th:block th:each="person : ${pers}">
        <p th:text="${person}"></p>
    </th:block>
</body>
</html>

  效果跟之前測試列印資料的效果差不多,只不過這次展示到了網頁中。效果如下:
這裡寫圖片描述
  最後再來張目錄結構,大功告成:
這裡寫圖片描述