<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Account">

    <!-- Result maps describe the mapping between the columns returned
   from a query, and the class properties.  A result map isn't
   necessary if the columns (or aliases) match to the properties
   exactly. -->
    <resultMap id="AccountResult" type="Account">
        <result property="id" column="ACC_ID"/>
        <result property="firstName" column="ACC_FIRST_NAME"/>
        <result property="lastName" column="ACC_LAST_NAME"/>
        <result property="emailAddress" column="ACC_EMAIL"/>
    </resultMap>

    <!-- Select with no parameters using the result map for Account class. -->
    <select id="selectAllAccounts" resultMap="AccountResult">
        select * from ACCOUNT order by ACC_ID
    </select>

    <!-- A simpler select example without the result map.  Note the
aliases to match the properties of the target result class. -->
    <select id="selectAccountById" parameterType="int" resultType="Account">
        select
        ACC_ID as id,
        ACC_FIRST_NAME as firstName,
        ACC_LAST_NAME as lastName,
        ACC_EMAIL as emailAddress
        from ACCOUNT
        where ACC_ID = #{id}
    </select>

    <!-- Insert example, using the Account parameter class -->
    <insert id="insertAccount" parameterType="Account">
        insert into ACCOUNT (
        ACC_ID,
        ACC_FIRST_NAME,
        ACC_LAST_NAME,
        ACC_EMAIL
        )
        values (
        #{id}, #{firstName}, #{lastName}, #{emailAddress}
        )
    </insert>

    <!-- START SNIPPET: insertList -->
    <!-- Batch Insert example, using the Account parameter class -->
    <insert id="batchInsertAccount" parameterType="java.util.List">
        insert into ACCOUNT (
        ACC_ID,
        ACC_FIRST_NAME,
        ACC_LAST_NAME,
        ACC_EMAIL
        )
        values (
        <foreach item="Account" collection="list" open="" close="" separator="),(">
            #{Account.id}, #{Account.firstName}, #{Account.lastName}, #{Account.emailAddress}
        </foreach>
        )
    </insert>
    <!-- END SNIPPET: insertList -->

  <!-- Update example, using the Account parameter class -->
    <update id="updateAccount" parameterType="Account">
        update ACCOUNT set
        ACC_FIRST_NAME = #{firstName},
        ACC_LAST_NAME = #{lastName},
        ACC_EMAIL = #{emailAddress}
        where
        ACC_ID = #{id}
    </update>

    <update id="batchUpdateAccount" parameterType="java.util.Map">
        update ACCOUNT set
        ACC_EMAIL = #{emailAddress}
        where
        ACC_ID in
        <foreach item="Account" collection="list" open="(" close=")" separator=",">
            #{Account.id}
        </foreach>
    </update>

    <!-- Delete example, using an integer as the parameter class -->
    <delete id="deleteAccountById" parameterType="int">
        delete from ACCOUNT where ACC_ID = #{id}
    </delete>

    <delete id="batchDeleteAccountById" parameterType="java.util.List">
        delete from ACCOUNT
        where
        ACC_ID in
        <foreach item="AccountID" collection="list" open="(" close=")" separator=",">
            #{AccountID}
        </foreach>
    </delete>

    <!-- START SNIPPET: e1 -->
    <select id="selectUnprocessedAccounts" resultMap="AccountResult">
        select * from ACCOUNT where PROCESSED = false
    </select>
    <!-- END SNIPPET: e1 -->

    <select id="selectProcessedAccounts" resultMap="AccountResult">
        select * from ACCOUNT where PROCESSED = true
    </select>

    <!-- START SNIPPET: e2 -->
    <update id="consumeAccount" parameterType="Account">
        update ACCOUNT set PROCESSED = true where ACC_ID = #{id}
    </update>
    <!-- END SNIPPET: e2 -->

    <select id="count" resultType="int">
        select count(*) from ACCOUNT
    </select>

</mapper>
