mybatis核心配置指mybatis的mybatis-config.xml文件
这篇文章主要讲mybatis-config文件的内容详解
1、properties
上篇mybatis初识中讲到使用<properties>标签,在标签中声明属性和值来编写
然而在实际开发中。对数据库的连接信息多存放在jdbc.properties文件中
直接编写jdbc.properties
username=root
password=root
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
在mybatis-config.xml中引入properties资源
<!-- properties 配置一些属性。使用的时候,用${name} 进行输出
resource指定属性的位置
-->
<properties resource="jdbc.properties">
<!-- 也可以在properties配置中定义一些属性。当然并不推荐 -->
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
需要注意的是,引入jdbc.properties属性文件中的信息会覆盖掉标签中的属性值
修改之前的数据库连接信息
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置数据库连接信息 -->
<property name="driver" value="${driverClass}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
使用${name}对数据信息进行引用
2、mybatis的核心配置之settings
这是mybatis中极为重要的调整设置,它们会改变mybatis的运行时行为。下表描述了设置中的各种意图、默认值等
设置参数 | 描述 | 有效值 | 默认值 |
cacheEnabled | 该配置影响的所有映射器中配置的缓存的全局开关。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true | false | false |
aggressiveLazyLoading | 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。 | true | false | true |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动)。 | true | false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | true | false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 | true | false | False |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target. · NONE: Do nothing · WARNING: Output warning log (The log level of'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'must be set to WARN) · FAILING: Fail mapping (Throw SqlSessionException) | NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。 | Any positive integer | Not Set (null) |
defaultFetchSize | Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. | true | false | False |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. | true | false | True |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | true | false | False |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言。 | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls | 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 | true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | Any String | Not set |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 or above) |
vfsImpl | Specifies VFS implementations | Fully qualified class names of custom VFS implementation separated by commas. | Not set |
useActualParamName | Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) | true | false | true |
3、mybatis的核心配置之typeAliases
该标签的主要作用是对java类型设置一个简单的名字,好比与重命名,用来减少mapper.xml 文件的冗余度
注意:typeAliases标签必须放在settings标签之后
首先先了解一下系统预定义别名
别名 | 映射的类型 |
_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 |
通常而言,我们会用该标签来对bean对象进行设置
这里就简单引用了本网站的一篇文章
4、mybatis的核心配置之typeHandlers
一般而言不会对typeHandlers进行修改或者配置
所以该内容只做了解
typeHandlers主要在预处理语句PreparedStatement中设置一个参数,或者在执行完sql语句后充结果集中取出数据进行正确的类型转换工作
官方的配置如下
类型处理器 | Java 类型 | JDBC 类型 |
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER |
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 |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 |
如果想要详细了解内容可以,查看下面文章
5、mybatis的核心配置之environments
1、environments标签的说明
一个environments示例标签
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置数据库连接信息 -->
<property name="driver" value="${driverClass}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<environment>标签可以用来包含多个环境
default 属性表示在默认情况下使用的环境
一般而言。在工作中。我们会定义多个环境信息
比方说, 我们会建立一个开放环境。用来自己写代码和测试的作用,然后再定义一个环境用来实际运行
当项目发布,只需要吧default的属性修改就完成部署工作了。
2、transactionManager标签
<transactionManager type="JDBC" />
这个就是配置了使用JDBC的提交和回滚操作,依赖数据源得到的连接来管理事务
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
这个MANAGED则几乎没做什么,从来不提交或者回滚连接,而是让容器自己来管理事务
默认情况下会关闭连接,所以需要设置closeConnection 为 false来阻止这种默认行为
需要注意的是,如果使用到了Spring框架的项目,我们通常会用spring来管理事务
3、dataSource标签说明
<dataSource type="POOLED">
这个标签是配置是否启动数据库连接池的配置
type的值有三种 UNPOOLED、POOLED、JNDI
UNPOOLED---数据源的实现只是在每次请求时打开和关闭连接,这种设置会通常用于一些对连接性能要求不是很高的小型引用
可能对某些对连接池不重要的数据库也很不错。
POOLED---这种数据源的实现就是JDBC连接池,是web引用的流行处理方式
JNDI---这种方式是为了能在EJB或者应用服务器这类容器中使用。
注意:同样在与spring框架整合时,多数情况下会用Spring来管理连接池
6、mybatis的核心配置之databaseIdProvider
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver" />
<property name="MySQL" value="mysql" />
<property name="DB2" value="db2" />
<property name="Oracle" value="oracle" />
</databaseIdProvider>
mybatis提供了一个类VendorDatabaseIdProvider,中的getDatabaseId() 方法用于获取数据库的标识。
property 标签name属性是获取数据库ID标识。
property 标签value属性是我们给mybatis定义的一个简短的标识。
这样我们在mapper的配置中就可以在定义sql语句中添加标识
<select id="selectUserById" parameterType="int"
resultType="User" databaseId="mysql">
select id , last_name from t_user where id = #{value}
</select>
当mybatis读取这个sql时,就会读取和数据库标识对应的sql语句
当然如果databaseId改成oracle的话,就会报错
7、mybatis的核心配置之Mapper
我们需要使用Mapper标签来讲mapper.xml文件注入到config文件中,这里通常会用三种方法
<!-- 从classpath路径下导入指定的配置文件 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml" />
<mapper resource="org/mybatis/builder/BlogMapper.xml" />
<mapper resource="org/mybatis/builder/PostMapper.xml" />
</mappers>
<!-- 使用mapper接口类导入配置文件 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper" />
<mapper class="org.mybatis.builder.BlogMapper" />
<mapper class="org.mybatis.builder.PostMapper" />
</mappers>
<!-- 扫描包下所有的配置文件
1、接口名和Mapper配置文件名必须相同
2、接口文件和Mapper配置文件必须在同一个包下
-->
<mappers>
<package name="org.mybatis.builder" />
</mappers>
最后一种是比较基础的方式
最后想说的是,mybatis其实还有许多标签但是以上的标签是比较常用的标签,如果想了解更多的资料或者进行深入的研究可以去百度 mybatis官方文档 进行参考