springKotlinCRUD

#spring boot Kotlin CRUD サンプル

testController
```
@Controller
@RequestMapping("/sample")
class testController {

    @Autowired
    private lateinit var repository: testRepository

    @GetMapping("/form")
    fun form(model: Model, @ModelAttribute("insertCompleteMessage") message: String?): String {
        model.addAttribute("title", "artist name")
        return "form.html"
    }

    @GetMapping("/select")
//    fun select(@Validated searchForm: SearchForm, result: BindingResult, model: Model): String {
    fun select(model: Model): String {
        val list = repository.getPosts("")
        if (list.size != 0) {
            model.addAttribute("postList", list)
        } else {
            model.addAttribute("noResultMessage", "登録はありません。")
        }
        return "list.html"
    }

    /**
     * 新規登録
     */
    @PostMapping("/insert")
    fun insert(
        @Validated insertForm: InsertForm,
        result: BindingResult,
        model: Model,
        redirectAttributes: RedirectAttributes
    ): String {
        if (result.hasErrors()) {
            model.addAttribute("title", "Error Page")
            return "form.html"
        } else if (insertForm.title.isNullOrEmpty()){
            model.addAttribute("message", "※入力必須項目")
            return "form.html"
        }

        val post = convertInsertForm(insertForm)
        repository.insertPost(post)

        return "redirect:select"
    }

    @ModelAttribute
    fun setSearchForm(): SearchForm {
        return SearchForm()
    }

    @ModelAttribute
    fun setInsertForm(): InsertForm {
        return InsertForm()
    }

    /**
     * インサートFormをPostに詰める
     * @param InsertForm
     * @return Post
     */
    companion object {
        fun convertInsertForm(insertForm: InsertForm): Post {
            val post = Post()
            post.title = insertForm.title
            post.textArea = insertForm.textArea
            post.mail = insertForm.mail
            return post
        }
    }
}
```
testRepository
```
@Repository
class testRepository {

    @Autowired
    private lateinit var jdbcTemplate: JdbcTemplate

    /**
     * 一覧表示（検索）
     * @param serchStr: String?
     * @return list<Post>
     */
    fun getPosts(serchStr: String?): List<Post> {
        var resultList:List<Map<String,Any?>> = mutableListOf()
        var sql = StringBuilder()
        sql.append("SELECT * FROM post WHERE 1=1 ")
        try {
            if (serchStr.isNullOrEmpty()) {
                resultList = jdbcTemplate.queryForList(sql.toString())
            } else {
                sql.append(" and ( title LIKE '%'||?||'%' or text_area LIKE '%'||?||'%') ")

                resultList = jdbcTemplate.queryForList(sql.toString(), serchStr, serchStr)
            }
        } catch (e:Exception){
            e.printStackTrace()
        }

        val list: MutableList<Post> = ArrayList()
        for (result in resultList) {
            val post = Post()
            post.title = result["title"] as String?
            post.textArea = result["text_area"] as String?
            post.mail = result["mail"] as String?
            list.add(post)
        }
        return list
    }

    /**
     * 新規登録
     */
    fun insertPost(post:Post) {
        val sql = "INSERT INTO post (title,text_area,mail) VALUES (?,?,?)"
        try {
            jdbcTemplate.update(sql, post.title, post.textArea, post.mail)
        } catch (e:Exception) {
            e.printStackTrace()
        }
    }
}
```
litt.html
```
<!DOCTYPE html>
<html xmlns:th="http://www.thymeLeaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">Insert</title>
</head>
<body>
<h1 th:text="${title}">title</h1>
<h1 th:text="${redirectTitle}">title</h1>
<form method="GET" action="#" th:action="@{/sample/select}" th:object="${searchForm}">
    <label for="artistName">検索</label>
    <input id="artistName" name="artistName" type="text" th:value="*{artistName}">
    <div th:if="${#fields.hasErrors('artistName')}" th:errors="*{artistName}"></div>
    <input type="submit" value="search">
</form>

<!--<h1 th:text="${title}">title</h1>-->
<p th:text="${noResultMessage}"></p>
<table th:if="${postList}">
    <tr>
        <th>タイトル</th><th>内容</th><th>mail</th>
    </tr>
    <tr th:each="post:${postList}">
        <td th:text="${post.title}"></td>
        <td th:text="${post.textArea}"></td>
        <td th:text="${post.mail}"></td>
    </tr>
</table>
<a th:href="@{'/sample/form'}">新規登録</a>
</body>
```

form.html
```
<!DOCTYPE html>
<html xmlns:th="http://www.thymeLeaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}"></title>
</head>
<body>
<h1>新規登録</h1>
<form method="POST" action="#" th:action="@{/sample/insert}" th:object="${insertForm}">
    <div>
    <label for="title">タイトル</label>
    <input id="title" name="title" type="text" th:value="*{title}"><span th:text="${message}"></span>
    <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}"></div>
    </div>
    <div>
    <input id="textArea" name="textArea" type="textarea" th:value="*{textArea}">
    </div>
    <div>
    <label for="mail">mail:</label>
    <input id="mail" name="mail" type="text" th:value="*{mail}">
    </div>
    <input type="submit" value="insert">
</form>
<p th:text="${insertCompleteMessage}"></p>
<p th:if="${errorMessage}" th:text="'エラーメッセージ：'+${errorMessage}"></p>
</body>
</html>
```
***