<?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.lc.mybatis.mapper.UserMapper">

    <!--
        useGeneratedKeys 获取自增主键
        keyProperty 接收自增主键的属性
     -->
    <insert id="addUser"
        useGeneratedKeys="true"
        keyProperty="id"
    >
        INSERT INTO`t_user` (  `username`, `password`, `gender`, `address` )
        VALUES
            (  #{username}, #{password}, #{gender}, #{address} );
    </insert>

    <!-- 查询
       - #{} 底层执行SQL语句的对象，使用**PreparedStatementd**，预编译SQL，防止SQL注入安全隐患，相对比较安全。
        - ${} 底层执行SQL语句的对象使用**Statement**对象，未解决SQL注入安全隐患，相对不安全。
       -->
    <select id="getUserList"  resultType="com.lc.mybatis.entity.User" >
        SELECT * FROM `t_user` order by ${filed} ${orderType};
    </select>

    <!-- resultMap
        autoMapping="true" 自动映射
     -->
    <resultMap id="userResultMap" type="com.lc.mybatis.entity.User" >
        <!--
            id 标签 表示主键
                column 属性 表示数据库中的字段名
                property 属性 表示实体类中的属性名
            result 非主键
        -->
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="gender" property="gender"/>

        <!-- 部门属性  级联映射
        <result column="dept_id" property="dept.id"/>
        <result column="dname" property="dept.dname"/>
        <result column="ddesc" property="dept.ddesc"/>
         -->

        <!-- 部门属性 关联方式 association 一对一的管理
            property 用户中的部门属性
            javaType 类型 全路经名称
        -->
        <association property="dept" javaType="com.lc.mybatis.entity.Dept">
            <result column="dept_id" property="id"/>
            <result column="dname" property="dname"/>
            <result column="ddesc" property="ddesc"/>
        </association>

    </resultMap>

    <select id="getUserById"  resultMap="userResultMap" >
        SELECT
            u.* ,
            d.id dept_id,
            d.dname dname,
            d.ddesc ddesc
        FROM
            `t_user` u
                LEFT JOIN t_dept d ON u.d_id = d.id
        WHERE
            u.id = #{id}
    </select>

    <!-- ################## 分步查询 ################################### -->
    
    <resultMap id="userResultMapStep" type="com.lc.mybatis.entity.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="gender" property="gender"/>
        <result column="gender" property="gender"/>

        <!--
            select 查询方法 接口 + 方法名称
            column 查询需要的条件 字段的值 传递到select的方法中
         -->
        <association
                property="dept"
                javaType="com.lc.mybatis.entity.Dept"
                select="com.lc.mybatis.mapper.DeptMapper.getDeptByIdStep"
                fetchType="lazy"
                column="d_id"
        ></association>

    </resultMap>

    <select id="getUserByIdStep"  resultMap="userResultMapStep" >
        SELECT
           *
        FROM
            `t_user`
        WHERE
            id = #{id}
    </select>





</mapper>