1、SqlMapConfig.xml 配置文件的内容和配置顺序
① properties(读取配置文件):定义配置,配置的属性可以在整个配置文件中其他位置进行引用;
② settings(全局配置参数):用于指定MyBatis的一些全局配置属性,这些属性非常重要,它们会改变MyBatis的运行时行为;
③ typeAliases(类型别名):用于配置多个数据源,每个数据源分为数据库源和事务的配置;
④ typeHandlers(类型处理器):定义类型处理,也就是定义java类型与数据库中的数据类型之间的转换关系
⑤ objectFactory(对象工厂):
⑥ plugins(插件):Mybatis的插件,插件可以修改Mybatis内部的运行规则
⑦ environments(环境集合属性对象,与Spring框架整合后Say Good Bye):用于配置多个数据源,每个数据源分为数据库源和事务的配置;
1、environment(环境子属性对象)
2、transactionManager(事务管理)
3、dataSource(数据源)
⑧ mappers(配置映射器位置):配置引入映射器的方法。
2、properties属性
作用:将数据连接单独配置在 db.properties 中,只需要在 SqlMapConfig.xml 中加载 db.properties 的属性值,在SqlMapConfig.xml 中就不需要对数据库连接参数进行硬编码。
数据库连接参数只配置在 db.properties 中,方便对参数进行统一管理,其它 xml 可以引用该 db.properties。
1)db.properties 的内容
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/games_db?useUnicode=true&characterEncoding=UTF-8&useSSL=true jdbc.username=root jdbc.password=123456
2)在 SqlMapConfig.xml 中加载 db.properties
<!-- 引入外部配置文件 --> <properties resource="db.properties"></properties> <!-- 配置mybatis运行环境 ; 在集成Spring是不用 --> <environments default="development"> <environment id="development"> <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 --> <transactionManager type="JDBC" /> <!-- 使用连接池连接数据库 - mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI --> <!-- POOLED 表示支持JDBC数据源连接池 ; UNPOOLED 表示不支持数据源连接池 ; JNDI 表示支持外部数据源连接池 --> <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> <!--配置映射器的位置 --> <mappers> <!-- 单个配置 --> <!-- <mapper resource="com/sikiedu/mapper/UserMapper.xml" /> --> <!-- <mapper url="file:\D:JavaWorkSpaceJavaEE_SSM_Testssm_mybatissrccomsikiedumapperUserMapper.xml" /> --> <!-- <mapper class="com.sikiedu.mapper.UserMapper" /> --> <!-- 多配置-以包的形式;推荐使用 --> <package name="com.sikiedu.mapper" /> </mappers>
3)properties特性
- 注意:
在properties元素体内定义的属性优先读取。
然后读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性。
最后读取parameterType传递的属性,它会覆盖已读取的同名属性
- 建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如xxxx.xxxx(jdbc.driver)
3、settings - 全局参数配置
mybatis框架运行时可以调整一些运行参数。比如,开启二级缓存,开启延迟加载等等。全局参数会影响mybatis的运行行为。
1 <!-- 参数设置 --> 2 <settings> 3 4 <!-- 这个配置使全局的映射器启用或禁用缓存 --> 5 <setting name="cacheEnabled" value="true" /> 6 7 <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 --> 8 <setting name="lazyLoadingEnabled" value="true" /> 9 10 <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 --> 11 <setting name="aggressiveLazyLoading" value="true" /> 12 13 <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) --> 14 <setting name="multipleResultSetsEnabled" value="true" /> 15 16 <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 --> 17 <setting name="useColumnLabel" value="true" /> 18 19 <!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) --> 20 <setting name="useGeneratedKeys" value="true" /> 21 22 <!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) --> 23 <setting name="autoMappingBehavior" value="PARTIAL" /> 24 25 <!--当检测出未知列(或未知属性)时,如何处理,默认情况下没有任何提示,这在测试的时候很不方便,不容易找到错误。 NONE : 不做任何处理 (默认值) WARNING : 警告日志形式的详细信息 FAILING : 映射失败,抛出异常和详细信息 --> 26 <setting name="autoMappingUnknownColumnBehavior" value="WARNING" /> 27 28 <!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 --> 29 <setting name="defaultExecutorType" value="SIMPLE" /> 30 31 <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 --> 32 <setting name="defaultStatementTimeout" value="25000" /> 33 34 <!--设置查询返回值数量,可以被查询数值覆盖 --> 35 <setting name="defaultFetchSize" value="100" /> 36 37 <!-- 允许在嵌套语句中使用分页 --> 38 <setting name="safeRowBoundsEnabled" value="false" /> 39 40 <!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 --> 41 <setting name="mapUnderscoreToCamelCase" value="false" /> 42 43 <!--MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 --> 44 <setting name="localCacheScope" value="SESSION" /> 45 46 <!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR OTHER。 --> 47 <setting name="jdbcTypeForNull" value="OTHER" /> 48 49 <!-- 指定哪个对象的方法触发一次延迟加载。 --> 50 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" /> 51 52 </settings>
4、typeAiases - 别名
在 mapper.xml 中,定义很多的 statement,statement 需要 parameterType 指定输入参数的类型、需要 resultType 指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针对 parameterType 或 resultType 指定的类型定义一些别名,在 mapper.xml 中通过别名定义,方便开发。
1)mybatis默认支持的别名
别名 | 映射的类型 | 别名 | 映射的类型 | 别名 | 映射的类型 | ||
_byte | byte | _boolean | boolean | double | Double | ||
_long | long | string | String | float | Float | ||
_short | short | byte | Byte | boolean | Boolean | ||
_int | int | long | Long | date | Date | ||
_integer | int | short | Short | decimal | BigDecimal | ||
_double | double | int | Integer | bigdecimal | Bigdecimal | ||
_float | float | integer | Integer |
2)自定义别名
- 单个别名定义
<typeAliases> <typeAlias type="com.sikiedu.beans.User" alias="user" /> </typeAliases>
- 批量定义别名:推荐
使用package包形式来配置别名,包的形式会扫描主包及子包中所有文件;
以对象类名为别名,大小写不限,推荐使用小写。
<typeAliases> <package name="com.sikiedu.beans" /> </typeAliases>
- UserMapper.xml引用别名
<select id="findUserById" parameterType="int" resultType="user" > select * from t_user where id=#{id} </select>
5、typeHandlers - 类型处理器
mybatis 中通过 typeHandlers 完成 jdbc 类型和 java 类型的转换。
通常情况下,mybatis 提供的类型处理器满足日常需要,不需要自定义。
1)mybatis 支持类型处理器
类型处理器 |
Java类型 |
JDBC类型 |
BooleanTypeHandler |
Boolean,boolean |
任何兼容的布尔值 |
ByteTypeHandler |
Byte,byte |
任何兼容的数字或字节类型 |
ShortTypeHandler |
Short,short |
任何兼容的数字或短整型 |
IntegerTypeHandler |
Integer,int |
任何兼容的数字和整型 |
LongTypeHandler |
Long,long |
任何兼容的数字或长整型 |
FloatTypeHandler |
Float,float |
任何兼容的数字或单精度浮点型 |
DoubleTypeHandler |
Double,double |
任何兼容的数字或双精度浮点型 |
BigDecimalTypeHandler |
BigDecimal |
任何兼容的数字或十进制小数类型 |
StringTypeHandler |
String |
CHAR和VARCHAR类型 |
ClobTypeHandler |
String |
CLOB和LONGVARCHAR类型 |
NStringTypeHandler |
String |
NVARCHAR和NCHAR类型 |
NClobTypeHandler |
String |
NCLOB类型 |
ByteArrayTypeHandler |
byte[] |
任何兼容的字节流类型 |
BlobTypeHandler |
byte[] |
BLOB和LONGVARBINARY类型 |
DateTypeHandler |
Date(java.util) |
TIMESTAMP类型 |
DateOnlyTypeHandler |
Date(java.util) |
DATE类型 |
TimeOnlyTypeHandler |
Date(java.util) |
TIME类型 |
SqlTimestampTypeHandler |
Timestamp(java.sql) |
TIMESTAMP类型 |
SqlDateTypeHandler |
Date(java.sql) |
DATE类型 |
SqlTimeTypeHandler |
Time(java.sql) |
TIME类型 |
ObjectTypeHandler |
任意 |
其他或未指定类型 |
EnumTypeHandler |
Enumeration类型 |
VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
6、environments - 环境集合属性对象
① environment 元素是配置一个数据源的开始,属性id是它的唯一标识
② transactionManager 元素配置数据库事务,其中type属性有三种配置方式
- jdbc,采用jdbc的方式管理事务;
- managed,采用容器的方式管理事务,在JNDI数据源中使用;
- 自定义,自定义数据库事务管理办法;
③ dataSource 元素配置数据源连接信息,type属性是连接数据库的方式配置,有四种配置方式
- UNPOOLED 非连接池方式连接
- POOLED 使用连接池连接
- JNDI 使用JNDI数据源
7、mappers - 映射配置
1)加载单个映射文件
- resource、url方法一次加载一个映射文件
- class属性:mapper接口加载单个映射配置文件;遵循一定的规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中;
上边规范的前提是:使用的是mapper代理方法;
<mappers> <!-- 单个配置 --> <mapper resource="com/sikiedu/mapper/UserMapper.xml" /> <mapper url="file:\D:JavaWorkSpaceJavaEE_SSM_Testssm_mybatissrccomsikiedumapperUserMapper.xml" /> <mapper class="com.sikiedu.mapper.UserMapper" /> </mappers>
2)批量加载mapper - 推荐使用
批量加载映射配置文件,mybatis自动扫描包下面的mapper接口进行加载;
遵循一定的规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中;
<!--配置映射器的位置 --> <mappers> <package name="com.sikiedu.mapper" /> </mappers>
3)另外,还可以通过自定义注解。当然,系统已经为我们提供了扫码工具【mybatis与spring集成】。
<bean id="mapperSanner" class="org.mybatis.spring.mapper.MapperSannerConfigurer"> <property name="basePackage" value="com.xxx.mapper"></property> </bean>
还有一种情况,当我们不使用spring只使用mybatis时,那么我们就需要自定义注解来扫描mapper文件,通过mybatis的配置来使用了。