Mybatisの基本的な文法

## 基本構文
### GET
 ```java:UserService.java
 public List<User> list() {
    // 一覧取得
    return userMapper.list()
}
 ```

 ```java:UserMapper.java
 @Mapper
public interface UserMapper {
    List<User> list();
}
 ```

 ```xml:UserMapper.xml
 <?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">
<mapper namespace="com.app.example.mapper.UserMapper">
  <select id="list" resultType="com.app.example.entity.User">
    SELECT
      id, name, age
    FROM
      user
    ORDER BY id ASC
  </select>
</mapper>
 ```


### UPDATE
```java:UserService.java
public void update(Integer id) {
    // 更新処理（戻り値は更新件数）
    Integer result = userMapper.update(id)
}
```

 ```java:UserMapper.java
 @Mapper
public interface UserMapper {
    Integer update(Integer id);
}
 ```
```xml:UserMapper.xml
<?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">
<mapper namespace="com.app.example.mapper.UserMapper">
  <update id="update">
    UPDATE
      USER
    SET
      name = #{name},
      age = #{age},
      updated_at = NOW()
    WHERE
      id = #{userId}
  </update>
</mapper>
 ```

### INSERT
```java:UserService.java
public void register(UserRequestDto dto) {
    // 登録処理（戻り値は登録件数）
    Integer result = userMapper.insert(dto)
}
```
 ```java:UserMapper.java
 @Mapper
public interface UserMapper {
    Integer insert(UserRequestDto dto);
}
 ```
```xml:UserMapper.xml
<?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">
<mapper namespace="com.app.example.mapper.UserMapper">
    <insert id="register" parameterType="jp.example.com.test.domain.entity.UserRequestDto">
        INSERT INTO user
            (id, name, nameReading, address)
        VALUES
            (#{id}, #{name}, #{nameReading}, #{address})
    </insert>
</mapper>

```

### BULK INSERT
```UserService.java
/**
 * ユーザーの一括登録
 *
 * @param entityList 登録リスト
 * @return 登録件数
 */
public Integer bulkInsert(List<User> entityList) {
  return userMapper.bulkInsert(entityList);
}
```

```UserMapper.xml
<insert id="bulkInsert">
  INSERT INTO user
    (id, name, age)
  VALUES
  <foreach collection="entityList" item="entity" separator=",">
    (
      #{entity.id}, #{entity.name}, #{entity.age}
    )
  </foreach>
</insert>
```

## 応用編
### ●insert後に、autoincrementで挿入されたカラムの値を受け取る

まず以下のようなテーブルがあるとする。

```xml:
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    name_reading VARCHAR(255),
    address VARCHAR(255)
);
```

カラム``ID``はAutoIncrement属性が付与されているため、INSERT時には自動で値が登録される。
insert後にこの自動採番されたカラムを取得するには
mapper.xmlのinsertタグに``useGeneratedKeys`` と ``keyProperty``、格納先となる``parameterType``を指定してあげる

```xml:UserMapper.xml
<?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">
<mapper namespace="com.app.example.mapper.CompanyMapper">
    <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.app.example.entity.Users">
        INSERT INTO
            company
            (id, name, nameReading, address)
            VALUES
            (#{id}, #{name}, #{nameReading}, #{address})
    </insert>
</mapper>
```

```java:UserService.java
public void register(String name, Integer age, String nameReading) {
  // 登録情報の設定
  Users entity = usersInjector(name, age, nameReading)

  // 登録処理
  userMapper.insert(entity);

  // insertされたAutoIncrement属性のカラム「ID」の値を取得する
  Integer userId = entity.getId();
}
```

### ●SQLの部品化
```sql:UserMap.xml
/** ユーザー情報取得 **/
<select id="getUserInfo">
  SELECT
    <include refId="selectClause" />
  FROM
    user
  WHERE
    id = #{userId}
</select>

/** ユーザー情報取得（SELECT句） **/
<sql id="slectClause">
  id,
  name,
  age
</sql>
```

### ●ResultMapの使い方
<a href="">こちらの記事</a>を参照



### ●SELECT時に、ORDER BYに変数を渡す際の注意
<a href="https://qiita.com/kaede25/items/c4e661aba81f9664ffa2">こちらの記事</a>を参照