LightAdmin Spring BootベースのCRUD Webサービス

## LightAdminについて

Spring BootでRailsのScaffoldのように、CRUD Webサービスが立ち上がるライブラリを探していたのですが、LightAdminというライブラリがありました。

公式サイトによるとLightAdminは、luggable CRUD UI library for Java web applications です。
Bootを使わない単独起動もあるようです。

公式サイト http://lightadmin.org/
Github https://github.com/la-team/light-admin
Github https://github.com/la-team/lightadmin-springboot


## クイックスタート
[lightadmin-springboot](https://github.com/la-team/lightadmin-springboot) プロジェクトからgit cloneして、起動するだけです。

```
git clone https://github.com/la-team/lightadmin-springboot.git
cd lightadmin-springboot/
mvn spring-boot:run
```

http://localhost:8080/admin/login

### ログイン画面
![スクリーンショット 2017-04-11 18.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/88743/8bf6dea2-eb82-9c62-3df3-80eecec29622.png)
UsernameとPasswordはどちらもadmin

### メインメニュー
![スクリーンショット 2017-04-11 18.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/88743/d8527892-3237-292a-6508-1776888e9b7b.png)

### 一覧画面
![スクリーンショット 2017-04-11 18.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/88743/9b2c8b1f-d1dc-433a-2145-865a5392d90a.png)


## MySQLにつないでみる

### MySQL環境を用意

手元のMySQL環境に検証用のdbとtableを作成します。

```bash
#dockerで立ち上げる例
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

```mysql
create database testdb;
use testdb;
create table Item(id int,name varchar(10), primary key(id));
```

### JavaCode

#### 元のサンプルモデルを削除

このクラスを全部削除してください。
- src/main/java/org/lightadmin/boot/administration/CityAdministration.java
- src/main/java/org/lightadmin/boot/administration/HotelAdministration.java
- src/main/java/org/lightadmin/boot/domain/City.java
- src/main/java/org/lightadmin/boot/domain/Hotel.java
- src/main/java/org/lightadmin/boot/repository/HotelRepository.java
- src/main/java/org/lightadmin/boot/web/ApplicationController.java

#### 新たなモデルを作成

```java:src/org/lightadmin/boot/domain/Item.java
package org.lightadmin.boot.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Item")
public class Item implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id private Long id;
    @Column private String name;

    public Item() {}
    public Item(Long id, String name, String country) {
        super();
        this.id = id;
        this.name = name;
    }

    public Long getId() {return id;}
    public void setId(Long id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
}
```

```java:src/main/java/org/lightadmin/boot/administration/ItemAdministration.java
package org.lightadmin.boot.administration;

import org.lightadmin.api.config.AdministrationConfiguration;
import org.lightadmin.api.config.builder.EntityMetadataConfigurationUnitBuilder;
import org.lightadmin.api.config.unit.EntityMetadataConfigurationUnit;
import org.lightadmin.boot.domain.Item;

public class ItemAdministration extends AdministrationConfiguration<Item> {

    @Override
    public EntityMetadataConfigurationUnit configuration(EntityMetadataConfigurationUnitBuilder configurationBuilder) {
        return configurationBuilder.nameField("name").singularName("Item").pluralName("Items").build();
    }
}
```

#### DB接続

```java:src/main/java/org/lightadmin/boot/ApplicationConfiguration.java
package org.lightadmin.boot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

import static org.springframework.orm.jpa.vendor.Database.MYSQL;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"org.lightadmin.boot.persistence"})
public class ApplicationConfiguration {

    @Bean
    @Autowired
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
        vendorAdapter.setDatabase(MYSQL);
        vendorAdapter.setShowSql(false);

        final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("org.lightadmin.boot.domain");
        factory.setDataSource(dataSource);

        return factory;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/testdb?useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8&characterEncoding=utf8");
        dataSource.setUsername("root");
        dataSource.setPassword("mysql");
        return dataSource;
    }

}
```



```xml:pom.xml
HSQLDBを削除
         <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
         </dependency>

MySQLを追加
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>
```

#### 結果

![スクリーンショット 2017-04-12 11.05.00.png](https://qiita-image-store.s3.amazonaws.com/0/88743/13c47397-f877-4b5a-6651-878ce6c1ac37.png)

![スクリーンショット 2017-04-12 11.06.16.png](https://qiita-image-store.s3.amazonaws.com/0/88743/f2659cfd-cdf1-b553-e530-b04e0c5ff5f0.png)

![スクリーンショット 2017-04-12 11.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/88743/ac53382d-6bdf-a13c-243a-6fef1355e764.png)