MyBatis配置文件主要分为两大类:MyBatis全局配置文件与MyBatis的mapper文件,下面详解MyBatis配置文件@mikechen
MyBatis全局配置文件
MyBatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。
MyBatis全局配置文件,格式如下:
<properties></properties><!-- 属性 --> <settings></settings> <!-- 设置--> <typeAliases></typeAliases><!-- 配置别名 --> <typeHandlers></typeHandlers><!-- 类型处理器 --> <objectFactory></objectFactory><!-- 对象工厂 --> <plugins></plugins><!-- 插件 --> <environments default=""><!-- 环境配置--> <environment id=""><!-- 环境变量 --> <transactionManager></transactionManager><!-- 事务管理器 --> <dataSource></dataSource><!-- 数据源 --> </environment> </environments> <databaseIdProvider></databaseIdProvider><!-- 数据库厂商标识 --> <mappers></mappers><!-- 映射器 -->
properties配置
将数据库连接参数单独配置在db.properties中,配置示例如下:
<!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource>
settings配置
mybatis全局配置参数,全局参数将会影响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>
typeAliases配置
typeAliases可以用来自定义别名,存在的意义仅在于用来减少类完全限定名的冗余。
配置示例如下:
<!-- 单个别名定义 --> <typeAlias alias="user" type="com.mikechen.pojo.User"/>
这样配置的话在MyBatis的xml文件中可以直接使用user代替其类的全限定名,用来减少类完全限定名的冗余。
typeHandlers配置
MyBatis中通过typeHandlers完成jdbc类型和java类型的转换。
比如:Mybatis可以将查询出的数据自动映射进配置文件中绑定的实体类对象,在映射的过程中就存在一个问题。
如何将数据库的数据类型和Java类型对应起来,并将数据库的数据类型转换成Java的数据类型,而typeHandlers的作用就是将从数据库取出的数据以合适的方式转换成Java类型。
Mybatis自带了一些默认的类型处理器,如下表所示:
类型处理器 |
Java 类型 |
JDBC 类型 |
BooleanTypeHandler |
java.lang.Boolean, boolean |
数据库兼容的 BOOLEAN |
ByteTypeHandler |
java.lang.Byte, byte |
数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler |
java.lang.Short, short |
数据库兼容的 NUMERIC 或 SMALLINT |
IntegerTypeHandler |
java.lang.Integer, int |
数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler |
java.lang.Long, long |
数据库兼容的 NUMERIC 或 BIGINT |
FloatTypeHandler |
java.lang.Float, float |
数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler |
java.lang.Double, double |
数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler |
java.math.BigDecimal |
数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler |
java.lang.String |
CHAR, VARCHAR |
ClobReaderTypeHandler |
java.io.Reader |
– |
ClobTypeHandler |
java.lang.String |
CLOB, LONGVARCHAR |
NStringTypeHandler |
java.lang.String |
NVARCHAR, NCHAR |
NClobTypeHandler |
java.lang.String |
NCLOB |
BlobInputStreamTypeHandler |
java.io.InputStream |
– |
ByteArrayTypeHandler |
byte[] |
数据库兼容的字节流类型 |
BlobTypeHandler |
byte[] |
BLOB, LONGVARBINARY |
DateTypeHandler |
java.util.Date |
TIMESTAMP |
DateOnlyTypeHandler |
java.util.Date |
DATE |
TimeOnlyTypeHandler |
java.util.Date |
TIME |
SqlTimestampTypeHandler |
java.sql.Timestamp |
TIMESTAMP |
SqlDateTypeHandler |
java.sql.Date |
DATE |
ObjectFactory配置
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂ObjectFactory实例来完成。
默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。
默认情况下,我们不需要配置,mybatis会调用默认实现的objectFactory, 除非我们要自定义ObjectFactory的实现, 那么我们才需要去手动配置。
配置示例如下:
<configuration> ...... <objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/> </objectFactory> ...... </configuration
plugins配置
mybatis的插件即是拦截器,通过定义拦截器可以增强mybatis功能,MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。
在mybatis配置文件中可配置一个或多个插件,示例如下:
<plugins> <!-- 可自定义一个或多个拦截器 --> <!-- MyPlugin是一个实现了Interceptor接口的类 --> <plugin interceptor="com.beck.mybatis.plugin.MyPlugin"> <!-- 拦截器可接收到这里配置的属性 --> <property name="limitNum" value="10"/> </plugin> </plugins>
environments配置
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。
transactionManager:事务管理器, type 表示事务管理器的类型,有两个属性值:
① JDBC:使用Connection对象,由Mybatis自己完成事务的处理。
② MANAGED:管理,表示把事务的处理交给容器实现(由其他软件完成失误的提交,回滚);
dataSource:表示数据数据源,创建的Connection对象连接数据库;其中的 type 数据源的类型, 属性值:
③ pooled。mybatis会在内存中创建pooledDataSource类,管理多个Connection连接对象,使用的连接池,mybatis默认是用XX数据库连接池;
④ UNpooled。不适用连接池,mybatis创建一个UnpooledDataSource这个类,每次执行sql语句先创建Connection对 象,再执行sql语句,最后关闭Connection;
⑤ JNDI。java的命名和目录服务。
配置示例如下:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!--配置数据源:创建Connection对象--> <dataSource type="pooled"> <!--driver:驱动的内容--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!--链接数据库的url--> <property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8"/> <!--用户名--> <property name="username" value="root"/> <!--密码--> <property name="password" value="root"/> </dataSource> </environment> <environment id="online"> <transactionManager type="JDBC"/> <!--配置数据源:创建Connection对象--> <dataSource type="pooled"> <!--driver:驱动的内容--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!--链接数据库的url--> <property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8"/> <!--用户名--> <property name="username" value="root"/> <!--密码--> <property name="password" value="root"/> </dataSource> </environment> </environments>
Mappers配置
这个就是用来配置sql映射语句的xml文件了,mappers文件共有4种配置方式。
1、直接配置xml映射文件全限定名
<mappers>
<mapper resource="com/mikechen/mybatis/mapping/UserMapper.xml"/>
</mappers>
2、通过url配置本地或者远程映射文件路径
<mappers>
<mapper url="file://xxx.xxx.UserMapper.xml"></mapper>
</mappers>
123
3、通过配置Mapper接口的方式来配置
<mappers>
<mapper class="com.mikechen.mybatis.mapper.UserMapper"></mapper>
</mappers>
4、通过配置Mapper接口包名的形式来配置
<mappers>
<package name="com.mikechen.mybatis.mapper"/>
</mappers>
注意:在使用第3和第4两种方式配置的时候,需要把xml映射文件和Mapper接口文件放在同一个目录,而且必须同名。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》