MyBatis配置包含对MyBatis行为有显著影响的设置和属性。文件的高级结构如下:
1,properties
properties是可外部化的、可替换的属性,可以在典型的Java属性文件实例中配置,也可以通过properties元素的子元素传递。例如:
<!--
1、mybatis可以使用properties来引入外部properties配置文件的内容;
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
-->
<properties resource="dbconfig.properties"></properties>
如果一个属性存在于其中一个以上的地方,MyBatis会按如下顺序加载它们:
- 属性中指定的主体属性元素读取第一,
- 属性从类路径加载资源或url属性的属性元素读取第二,并覆盖任何重复的属性已经指定,
- 读取属性作为方法参数传递,并覆盖任何重复的属性可能被从身体和资源属性加载/ url属性。
因此,优先级最高的属性是那些作为方法参数传入的属性,然后是资源/ url属性,最后是properties元素主体中指定的属性。
2,settings
settings是非常重要的调整,它们修改了MyBatis在运行时的行为方式。
<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"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
3,typeAliases
- 类型别名是Java类型的短名称。它只与XML配置相关,它的存在只是为了减少完全限定类名的冗余类型化。
<typeAlias type="com.mybatis.bean.Employee" alias="emp"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
有了这个配置,别名(emp)现在可以在任何地方使用。代替了type(com.mybatis.bean.Employee)
- 我们还可以指定一个包,MyBatis将在其中搜索beans。
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
- 使用@Alias注解为某个类型指定新的别名
@Alias("emp")
public class Employee{ ... }
4,environments
MyBatis可以配置多个环境。这有助于我们出于各种原因将SQL映射应用到多个数据库。例如,我们的开发、测试和生产环境可能有不同的配置。或者,我们可能有多个共享相同模式的生产数据库,我们希望对这两个数据库使用相同的SQL映射。有许多用例。
虽然我们可以配置多个环境,但是您只能为每个SqlSessionFactory实例选择一个。
因此,如果希望连接两个数据库,需要创建SqlSessionFactory的两个实例,每个实例一个。对于三个数据库,您需要三个实例,等等。
- 每个数据库一个SqlSessionFactory实例
要指定要构建的环境,只需将其作为一个可选参数传递给SqlSessionFactoryBuilder
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties
如果省略环境,则加载默认环境,如下所示:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory =sqlSessionFactoryBuilder.build(reader,properties);
环境元素定义如何配置环境。
-
environments:环境,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
-
environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
-
transactionManager:事务管理器;type:事务管理器的类型;
JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名 -
dataSource:数据源; type:数据源类型;
UNPOOLED(UnpooledDataSourceFactory)
|POOLED(PooledDataSourceFactory)
|JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
<environments default="dev_mysql">
<environment id="dev_mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
<environment id="dev_oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}" />
<property name="url" value="${orcl.url}" />
<property name="username" value="${orcl.username}" />
<property name="password" value="${orcl.password}" />
</dataSource>
</environment>
</environments>
5,databaseIdProvider
MyBatis能够根据您的数据库供应商执行不同的语句。多数据库供应商的支持基于映射语句databaseId属性。MyBatis将加载所有没有databaseId属性或具有与当前属性匹配的databaseId的语句。如果发现有和没有databaseId时相同的语句,则将丢弃后者。
要启用多供应商支持,请按如下方式将databaseIdProvider添加到mybatis-config.xml文件中
<databaseIdProvider type="DB_VENDOR" />
DB_VENDOR实现databaseIdProvider将databaseId设置为databaseId,这是DatabaseMetaData#getDatabaseProductName()返回的字符串。考虑到该字符串通常太长,同一产品的不同版本可能会返回不同的值,
您可能希望通过添加如下属性将其转换为更短的字符串:
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
6, mappers
既然MyBatis的行为已经用上面的配置元素配置好了,我们就可以定义映射的SQL语句了。 但是首先,我们需要告诉MyBatis在哪里可以找到它们。在这方面,Java并没有提供任何好的自动发现方法,所以最好的方法就是告诉MyBatis在哪里可以找到映射文件。您可以使用
-
类路径相关的资源引用、
-
完全限定的url引用(包括文件:/// url)、
resource:引用类路径下的sql映射文件
mybatis/mapper/EmployeeMapper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml -
类名
注册接口
class:引用(注册)接口,
1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解; -
包名。(批量注册)
<!-- Using classpath relative resources -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- Using mapper interface classes -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
<mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/>
</mappers>
<package name="com.atstudying.mybatis.dao"/>
这些语句只是告诉MyBatis从这里到哪里。其余的细节都在每个SQL映射文件中,这正是下面将要讨论的内容。