## Mapper映射文件
MyBatis Mapper映射文件主要包含以下标签:
select、insert、updae、delete、resultMap、parameterMap、sql、include、selectKey。
### select
查询标签,对应一条查询语句。示例:
```xml
<select id="selectUserById" paramterType="Integer" resultType="User">
select * from user where id = #{id}
</select>
```
这条语句就叫做 selectUserById, 有一个 int(或是 Integer)参数, 并返回一个User类型(可以是完整类名或别名)结果集。 除了上述属性,select标签还有很多属性,具体如下:
| 属性 | 描述 |
| ------------- | ------------------------------------------------------------ |
| id | 语句唯一标识 |
| paramterType | 参数类型(完整类名或别名) |
| resultType | 结果集类型(完整类名或别名) |
| resultMap | 引用定义的 resultMap ,就是自定义映射关系。不能与resultType共用 |
| flushCache | 如果设为 true,则会在每次语句调用时都会清空缓存。 select 语句默认设为 false |
| useCache | 如果设为 true,则语句的结果集将被缓存, select 语句默认设为 false |
| timeout | 设置驱动器在抛出异常前等待回应的最长时间,默认不设置值,由驱动器自己决定 |
| fetchSize | 设置一个值后,驱动器会在结果集数目达到此数值后返回,默认不设置值,由驱动器自己决定 |
| statementType | STATEMENT、PREPARED 、CALLABLE 中的任意一个, 这就告诉 MyBatis 分别使用 Statement, PreparedStatement 或者 CallableStatement。默认: PREPARED |
| resultSetType | FORWARD_ONLY 、 SCROLL_SENSITIVE 、SCROLL_INSENSITIVE 中的任意一个。 默认是不设置 |
### insert、update、delete
insert、update、delete都是更新语句,拥有的属性差不多。除了上述属性外,还有以下属性:
| 属性 | 描述 |
| ---------------------------- | ------------------------------------------------------------ |
| useGeneratedKeys | (仅限insert)标识使用 JDBC 的 getGeneratedKeys 方法来获取数据库自动生成的主键 。默认: false |
| keyProperty | (仅限insert)标识自动生成主键的列 |
> 在insert语句里,还可以使用`<selectKey>`标签手动生成主键,可以用于数据库不支持自动生成主键的情况下。
>
> 如:
>
> ```xml
> <insert id="insertUser" paramterType="User" resultType="Integer">
> <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY
> </selectKey>
> insert into user(name, gender) values(#{name}, #{gender})
> </insert>
> ```
### sql
sql标签用于定义sql片段,使得这些片段可以复用。通过`<include>`标签引用
如:
```xml
<sql id="userColumns">u.name, u.gender</sql>
<select id="selectUserById" paramterType="Integer" resultType="User">
select <include refid="userColumns"></include>
from user as u where u.id = #{id}
</select>
```
### resultMap
结果集映射。用于将POJO对象的属性与数据库字段进行映射。它还支持对象间的关联关系。主要通过`<association>`和`<collection>`标签实现。
如:
```xml
<resultMap id="UserResultMap" type="User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="gender" jdbcType="DECIMAL" property="gender" />
<association property="deptId" javaType="Dept">
<id column="deptId" property="id"/>
<result column="dept_name" property="deptName"/>
</association>
</resultMap>
```

MyBatis映射文件