# mybatis配置文件深入


<!--more-->

# 配置文件深入
## 一、核心配置文件
### 1. 层级关系

- configuration
  - properties 属性
  - settings 设置
  - typeAliases 类型别名
  - typeHandlers 类型处理器
  - objectFactory 对象工厂
  - plugins 插件
  - environments 环境
    - environment 环境变量
      - transactionManager 事务管理器
      - dataSource 数据源
  - databaseIdProvider 数据库厂商标识
  - mappers 映射器
### 2. 常用配置

- environments
  ![environment.png](https://img.zhaojq.top/20260727184920795.png "environment.png")
  
  > transactionManager 有两种
  > - JDBC：这个配置就是直接使用了JDBC 的提交和回滚设置，它依赖于从数据源得到的连接来管理事务作用域
  > - MANAGED：这个配置几乎没做什么。它从来不提交或回滚一个连接，而是让容器来管理事务的整个生命周期（比如 JEE 应用服务器的上下文）。默认情况下它会关闭连接，然而一些容器并不希望这样，因
    此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为
  > 
  > dataSource 有三种
  > - UNPOOLED：这个数据源的实现只是每次被请求时打开和关闭连
  > - POOLED：这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来
  > - JNDI：这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用，容器可以集中或在外部配置数据源，然后放置一个 JNDI 上下文的引用
  
- mapper

  > 使用相对于类路径的资源引用，例如：
  >
  > `<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>`
  >
  > 使用完全限定资源定位符（URL），例如：
  >
  > `<mapper url="file:///var/mappers/AuthorMapper.xml"/>`
  >
  > 使用映射器接口实现类的完全限定类名，例如：
  >
  > `<mapper class="org.mybatis.builder.AuthorMapper"/>`
  >
  > 将包内的映射器接口实现全部注册为映射器，例如：
  >
  > `<package name="org.mybatis.builder"/>`
  
- Properties标签

  >实际开发中，习惯将数据源的配置信息单独抽取成一个properties文件，该标签可以加载额外配置的properties文件
  >
  >![properties](https://img.zhaojq.top/20260727184921007.png "properties")

- typeAliase标签

  > 类型别名是为Java 类型设置一个短的名字。原来的类型名称配置如下
  >
  > ```xml
  > <typeAliases>
  > 	<typeAliase type="com.*.User" alias="user"></typeAliase>
  > </typeAliases>
  > 
  > <select id="findAll" resultType="user">
  >   	select * from user
  > </select>
  > ```
  >
  > Mybatis已经设置好一些常用类型别名
  >
  > | 别名    | 类型    |
  > | ------- | ------- |
  > | string  | String  |
  > | long    | Long    |
  > | int     | Integer |
  > | double  | Double  |
  > | boolean | Boolean |
  > | ...     | ...     |



## 二、映射配置文件mapper.xml

### 1. 动态sql语句

Mybatis 的映射文件中，前面我们的 SQL 都是比较简单的，有些时候业务逻辑复杂时，我们的 SQL是动态变化的

- 条件判断

  ```xml
  <select id="findByCondition" parameterType="user" resultType="user">
    select * from User
    <where>
      <if test="id!=0">
      	and id=#{id}
      </if>
      <if test="username!=null">
      	and username=#{username}
      </if>
    </where>
  </select>
  ```

- for循环

  ```xml
  <select id="findByIds" parameterType="list" resultType="user">
    select * from User
    <where>
      <foreach collection="list" open="id in(" close=")" item="id" separator=",">
      	#{id}
      </foreach>
    </where>
  </select>
  
  其中:
  collection 代表要遍历的集合，不要写#{}
  open 代表语句的开始部分
  close 代表语句的结束部分
  item 代表遍历集合的每个元素，生成的变量名
  sperator 代表分隔符
  ```

- sql片断抽取

  ```xml
  <!--抽取sql片段简化编写-->
  <sql id="selectUser" select * from User</sql>
  
  <select id="findById" parameterType="int" resultType="user">
  	<include refid="selectUser"></include> where id=#{id}
  </select>
  
  <select id="findByIds" parameterType="list" resultType="user">
    <include refid="selectUser"></include>
    <where>
      <foreach collection="array" open="id in(" close=")" item="id" separator=",">
      	#{id}
    </foreach>
    </where>
  </select>
  ```

  


















