1、引入DTD约束
DTD文件更够更好的约束 xml文档,并且还有智能提示,提高写代码的效率。在IDEA中引入比较方便,在文档开头写明即可,在Eclipse中还要指明 dtd 文件的路径,百度一下即可找到设置方法。
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
接下来的配置可以没有,但顺序必须严格按照如下的顺序
properties-->settings-->typeAliases-->typeHandlers-->objectFactory
--> objectWrapperFactory-->reflectorFactory-->plugins-->environments
-->databaseIdProvider-->mappers
2、properties引入外部配置文件
mybatis可以使用properties来引入外部properties配置文件的内容
- resource:引入内路径下的资源
- url:引入网络路径或者磁盘路径下的资源
<properties resource="config/dbconfig.properties"></properties>
dbconfig.properties的内容如下,对应的数据库名叫mybatisdemo
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisdemo
jdbc.username=root
jdbc.password=root
3、settings运行时行为设置
这个配置影响的时mybatis运行时底层,里面包含很多重要的设置项,一个setting就是一个设置项,不设置则取默认值。
格式:
- name:设置项名
- value:取值
下面是官方文档给出的一些设置项和它们的默认值
<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>
其中常用的有
- mapUnderscoreToCamelCase:驼峰命名自动映射
- multipleResultSetsEnabled:单statement返回多个结果集,需要数据库支持
- useGeneratedKeys:使用自增主键
- jdbcTypeForNull:当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型
- lazyLoadingEnabled:懒加载,需要时才去获取值,减轻数据库压力
- aggressiveLazyLoading:侵入式懒加载,默认true,懒加载的对象可能被任何懒属性全部加载,设为false,则每个属性都按需加载
4、别名处理器 typeAliases
typeAlias:为某个Java类型起别名
- type: 指定要起别名的类型全类名;默认就是类型小写
- alias:指定新的别名
为单个JavaBean起别名:
<typeAlias type="bean.Employee" alias="emp"/>
批量起别名:
- name:指定包名(为当前包以及下面的子包所有类都起一个别名(默认类名小写)
<typeAliases>
<package name="bean"/>
</typeAliases>
- 避免重复
在JavaBean上使用@Alias注解,手动起别名
<typeAliases>
<package name="bean"/>
</typeAliases>
@Alias("emp")
public class Employee {
}
5、类型处理器 typeHandler
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。当然也可以自己手写适合的typeHandler,继承BaseTypeHandler类或者实现TypeHandler接口,这里有一篇文章写的很不错MyBatis之TypeHandler
6、运行时环境 environments
mybatis可以配置多种环境,default指定某种环境,可以达到快速切换。
environment:配置一个具体的环境:必须有两个标签transactionManager和dataSource,还得有属性id,id代表当前环境的唯一标识。
transactionManager:事务管理器
- type:事务管理器的类,JDBC(JdbcTransactionFactory)||MANAGED(ManagedTransactionFactory)
datasource:数据源:
- UNPOOLED(UnpooledDataSourceFactory)
- POOLED(PooledDataSourceFactory)
- JNDI(JndiDataSourceFactory)
自定义事物管理器:实现TransactionFactory接口:type指定自定义类的全类名即可
自定义数据源:实现DataSourceFactory接口,type是全类名
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<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>
<!--下面的Oracle环境仅仅作为示例,不能使用,Oracle环境请参照官方文档-->
<environment id="oracle">
<transactionManager type="JDBC"/>
<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>
</environments>
7、databaseIdProvider:支持的数据库厂商
type=“DB_VENDOR”,VendorDatabaseIdProvider
有用到jdbc驱动getDatabaseProductName()方法,得到支持的数据库厂商,以供mybatis识别
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
8.mappers sql映射文件注册
注册配置文件:
- resource:引入内路径下的sql映射文件
- url:引入网络路径或者磁盘路径下的sql映射文件
注册接口:
- class:引用(注册)接口
- a.有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下
- b.没有sql映射文件,所有的sql都是利用注解写在接口上
<mappers>
<mapper resource="config/EmployeeMapper.xml"/> <!--1-->
<mapper class="dao/EmployeeMapper"/> <!--2.a-->
<mapper class="dao.EmployeeMapperAnnotation"/> <!--2.b-->
<!-- 批量注册: -->
<package name="dao"/>
<!-- 基于注解的mybatis能找到并识别
基于xml文件的就找不到了,除非将接口和xml文件放在一起
-->
</mappers>
基于注解,将sql语句写在接口中
public interface EmployeeMapperAnnotation {
@Select("select * from tbl_employee where id=#{id}")
public Employee getEmpById(Integer id);
}