SpringBoot?Kotlin?Mybatis?Thymeleaf?簡單的瞭解一波!
扯淡也需要積累點資料
這裡先備註下需要哪些準備。
- 開發工具:Intellij idea(用慣了AS用這個絕對順手)
- Java環境:JDK1.8(高了的沒用過,反正對於Android來說1.8夠用了)。
- 資料庫:Mysql(下個壓縮包的就行,感覺解壓版的很是好配,也很省時間)。
- 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>
效果跟之前測試列印資料的效果差不多,只不過這次展示到了網頁中。效果如下:
最後再來張目錄結構,大功告成: