4、配置解析
4.1、核心配置文件
mybatis-config.xml
最外面是configuration标签,里面的标签的顺序必须是
- properties
- ettings
- typeAliases
- typeHandlers
- objectFactory
- objectWrapperFactory
- reflectorFactory
- plugins
- environments
- databaseIdProvider
- mappers
4.2、环境配置environments
mybatis 可以适应多种环境,environments 标签下可以有多个 environment 标签,但是每个 sqlSessionFactory 只能选择一种环境。
使用 environments 的 default 属性确定选择哪一套环境(environment 标签的 id)。
mybatis 默认的事务管理器是 JDBC,连接池是 POOLED
4.2.1、事务管理器transactionManager
在 environment 标签下可以有 transactionManager 标签,表示选择事务管理类型,可以选择JDBC或MANAGED
JDBC 直接使用了 JDBC 的提交和回滚设置,使用从数据源得到的连接管理事务作用域。
MANAGED几乎没做什么,从不提交和回滚,而是让容器管理事务的整个生命周期。
如果使用 spring + mybatis 则没有必要配置事务管理器,spring 模块会使用自带的管理器覆盖前面的配置。
4.2.2、数据源dataSource
在 environment 标签下有 dataSource标签,表示连接数据库。
有三种连接类型:
- UNPOOLED 没有连接池,每次都打开关闭
- POOLED 有连接池,一种使并发web应用快速响应请求的流行处理方式
- JNDI 正常连接
4.3、属性properties
我们可以通过 properties 来实现引用配置文件。
这些属性都是可以外部配置且可动态替换的,既可以在典型的 java 属性文件中配置,也可以通过 properties 元素的子元素来传递。【db.properties】
在 src/main/resource 下新建 db.properties 内容如下
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username = root
password = root
然后在核心配置文件正确的位置中引入这个配置:
<!-- 引入外部配置文件 -->
<properties resource="db.properties"/>
然后dataSource中的部分就可以引用这个配置:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
以上是一种方法,另一种是在 properties 中标签中添加 若干个 property 标签,如:
<properties resource="db.properties">
<property name="username" value="root" />
</properties>
也可以正常引用,两者结合也可以。两者都有同一个字段的话以外部配置文件的为准。
4.4、类型别名typeAliases
类型别名是为java类型设置一个短的名字,它只和 xml 配置有关。
存在的意义仅在于用来减少类完全限定名的冗余。
例如:
<!-- 给实体类起别名 -->
<typeAliases>
<typeAlias type="com.dzy.pojo.User" alias="User" />
</typeAliases>
起过别名之后,就可以在 mapper.xml 中使用别名,如:
<!-- resultType不需要写全名了-->
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
以上是一种方法,另一种是指定一个包名,mybatis会自动扫描这个包下的类,别名就是小写的类名,如:
<!-- 给实体类起别名 -->
<typeAliases>
<package name="com.dzy.pojo" />
</typeAliases>
使用别名(其实大写也可以,但是推荐小写)
<!-- resultType不需要写全名了-->
<select id="getUserList" resultType="user">
select * from mybatis.user
</select>
也可以用注解取别名,比如:
@Alias("user")
public class User{...}
注解和指定包名混用,注解优先。
mybatis 内置别名:
- 基本类型封装类的别名是基本类型,如 Integer 的别名是 int
- 基本类型的别名是前面加_,如 int 的别名是 _int
- 类类型的别名首字母小写,如 String 的别名是 string,Map 的别名是 map
4.5、设置setting
写法形如:
<settings>
<setting name="cacheEnabled" value="true"/><!-- 启用缓存 -->
<setting name="lazyLoadingEnabled" value="true"/><!-- 懒加载 -->
<!-- 允许单个语句返回多结果集 -->
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/><!-- 列标签代替列名 -->
<setting name="useGeneratedKeys" value="false"/><!-- 自动生成主键 -->
<!-- 指定 MyBatis 应如何自动映射列到字段或属性 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 指定发现自动映射目标未知列(或未知属性类型)的行为 -->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 配置默认的执行器 -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/><!-- 超时时间 -->
<!-- 为驱动的结果集获取数量(fetchSize)设置一个建议值 -->
<setting name="defaultFetchSize" value="100"/>
<!-- 是否允许在嵌套语句中使用分页 -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否开启驼峰命名自动映射 -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis 利用本地缓存机制防止循环引用和加速重复的嵌套查询 -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 空值的默认 JDBC 类型 -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定对象的哪些方法触发一次延迟加载 -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
4.6、映射器Mapper
四种映射方法:
使用相对于类路径的资源引用(推荐使用,错误少)
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
完全限定资源定位符(别用)
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
映射器接口类的全路径(接口和mapper.xml必须同名同包)
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
将包内的映射器接口全部注册为 Mapper(接口和mapper.xml必须同名同包)
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>