配置解析及其优化
1、核心配置文件及其属性
- mybatis-config.xml
- MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
2、环境配置(environments)
MyBatis可以配置成适应多种环境,这种机制有助于将SQL映射应用于多种数据库之中,现实情况下有多种理由需要这么做。如:开发、测试、生产环境需要不同的配置
尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境
2.1事务管理器(transactionManager)
两种类型的事务管理器:JDBC和MANAGED
- JDBC:直接使用了JDBC的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域
- MANAGED:几乎无用。它从不提交或回滚一个链接,而是让容器来管理事务的整个生命周期
<!--transactionManager:事务管理-->
<transactionManager type="JDBC|MANAGED"/>
默认情况下MANAGED会关闭连接,需要设置closeConnection属性为false来阻止
若使用Spring+MyBatis,则可以不配置事务管理器,因为Spring模块会使用自带的管理器来覆盖前面的配置
2.2 数据源(dataSource)
- UNPOOLED:每次请求时打开和关闭连接;慢,但对那些数据库连接可用性要求不高的简单应用程序是好的选择
- POOLED:利用“池”的概念将JDBC连接对象组织起来,避免了创建新的连接实例时所需要的初始化和认证事件
- JNDI
- 常用属性:
<dataSource type="POOLED">
<property name="driver" value="${Driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
3、属性(properties)
这些属性可以在外部进行配置,并可以进行动态替换
properties标签位置只能放在configuration标签内的第一个位置
标签放置顺序:
在properties元素的子元素中设置
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
在典型的Java属性文件中配置,并在mybatis-config.xml文件中配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=1234
<properties resource="db.properties"/>
设置好的属性在整个配置文件中用来替换需要动态配置的属性值
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
如果一个属性在不止一个地方进行了配置,那么MyBatis按照下面的顺序来加载:
- 首先读取properties元素体内指定的属性
- 然后根据properties元素中的resource属性读取类路径下属性文件,或根据url属性指定的路径读取属性文件,并覆盖之前读取过的同名属性
- 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性
即默认优先使用外部文件中的属性
4、类型别名(typeAliases)
- 类型别名可为Java类型设置一个缩写名字。仅用于XML配置,意在降低冗余的全限定类名书写
设置方式一:
<typeAliases>
<typeAlias type="com.ly.pojo.User" alias="User"/>
</typeAliases>
- type:类的全限定名
- alias:别名
设置方式二:
<typeAliases>
<package name="com.ly.pojo"/>
</typeAliases>
默认别名为扫描到该包下的实体类的类名首字母小写
在实体类较少时,使用第一种,较多时使用第二种
第一种可以DIY别名,第二种不行;如果非要改别名,需要在实体类上增加注解@Alias(“别名”)
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
5、设置(settings)
极为重要的调整设置,会改变MyBatis的运行时行为
- cacheEnabled:全局性地开启或关闭所有映射配置文件中以配置的任何缓存
6、其他配置
6.1 类型处理器(typeHandlers)
- MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。
6.2 对象工厂(objectFactory)
- 每次MyBatis创建结果对象的新实例时,它都会使用一个对象工厂实例来完成实例化工作
- 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法
6.3 插件(plugins)
6.4 数据库厂商标识(databaseIdProvider)
-
MyBatis可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的databaseId属性。
-
MyBatis会加载带有匹配当前数据库databaseId属性和所有不带改属性的语句
-
若同时找到带有和不带有该属性的相同语句,则后者被舍弃
<databaseIdProvider type="DB_VENDOR" />
设置数据库短名:
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
7、映射器(mappers)
告诉MyBatis在哪里去找SQL语句。
-
使用相对于类路径的资源引用
-
使用完全限定资源定位符(包括file:\形式的URL)
-
使用类名或包名
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</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>