03、SqlMapConfig.xml配置文件
MyBatis的全局配置文件SqlMapConfig.xml,在此文件中配置加载属性文件、数据源、事务、全局参数、别名以及mapper等,其内容如下:
1、<properties>
<properties>用来加载properties属性文件,jdbc.properties文件内容如下所示:
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=true 3 jdbc.username=root 4 jdbc.password=root123
SqlMapConfig.xml文件加载jdbc.properties文件的方式如下所示:
1 <properties resource="jdbc.properties"></properties>
之后就可以通过${key}方式来获取值来使用。
2、<settings>配置
MyBatis框架在运行时可以调整一些运行参数,比如:开启二级缓存、开启延迟加载,全局参数将会影响MyBatis的运行行为,具体配置信息可以查看参考手册,完整的<settings>配置如下所示:
1 <settings> 2 <setting name="cacheEnabled" value="true"/> 3 <setting name="lazyLoadingEnabled" value="true"/> 4 <setting name="multipleResultSetsEnabled" value="true"/> 5 <setting name="useColumnLabel" value="true"/> 6 <setting name="useGeneratedKeys" value="false"/> 7 <setting name="autoMappingBehavior" value="PARTIAL"/> 8 <setting name="defaultExecutorType" value="SIMPLE"/> 9 <setting name="defaultStatementTimeout" value="25"/> 10 <setting name="safeRowBoundsEnabled" value="false"/> 11 <setting name="mapUnderscoreToCamelCase" value="false"/> 12 <setting name="localCacheScope" value="SESSION"/> 13 <setting name="jdbcTypeForNull" value="OTHER"/> 14 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> 15 </settings>
3、<typeAliases>类型命名
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
3.1 MyBatis默认支持别名
MyBatis默认支持的别名如下图所示:
3.2 自定义别名
MyBatis不仅有默认支持的别名,还可以自定义别名。
3.2.1 单个别名定义
- 定义别名:
1 <typeAliases> 2 <typeAlias type="com.sunny.domain.User" alias="user"/> 3 </typeAliases>
- 引用别名:可以在下面的resultType中直接引用自定义的别名
1 <select id="findUserById" parameterType="int" resultType="user"> 2 SELECT * FROM user WHERE id=#{id} 3 </select>
3.2.2 批量定义别名
- 定义别名时需要指定包名,MyBatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以),引用方式和上面一样:
1 <typeAliases> 2 <package name="com.sunny.domain"/> 3 </typeAliases>
4、<environments>配置环境
4.1 <environments>总体介绍
MyBatis通过<environments>来配置环境,下面是配置环境的代码:
1 <environments default="development"> 2 <environment id="development"> 3 <!-- 使用jdbc事务管理,事务控制由mybatis--> 4 <transactionManager type="JDBC"/> 5 <!-- 数据库连接池,由mybatis管理--> 6 <dataSource type="POOLED"> 7 <property name="driver" value="${jdbc.driver}"/> 8 <property name="url" value="${jdbc.url}"/> 9 <property name="username" value="${jdbc.username}"/> 10 <property name="password" value="${jdbc.password}"/> 11 </dataSource> 12 </environment> 13 </environments>
注意:在<property>中使用类似${jdbc.driver}方式来取值的话,需要在SqlMapConfig.xml中加载属性文件:
1 <properties resource="jdbc.properties"></properties>
<environments>主要包括下面几个子节点:
- 默认的环境ID,比如:default="development"
- 每个environment元素定义的环境ID,比如:id="development"
- 事务管理器的配置,比如:type="JDBC"
- 数据源的配置,比如:type="POOLED"
<environments>也可以配置多种环境,可以将SQL映射应用于多种数据库之中:
1 <environments default="development"> 2 <environment id="development"> 3 <transactionManager type="JDBC"/> 4 <dataSource type="POOLED"> 5 <property name="driver" value="${jdbc.driver}"/> 6 <property name="url" value="${jdbc.url}"/> 7 <property name="username" value="${jdbc.username}"/> 8 <property name="password" value="${jdbc.password}"/> 9 </dataSource> 10 </environment> 11 <environment id="test"> 12 <transactionManager type="JDBC"/> 13 <dataSource type="POOLED"> 14 <property name="driver" value="${jdbc.driver}"/> 15 <property name="url" value="${jdbc.url}"/> 16 <property name="username" value="${jdbc.username}"/> 17 <property name="password" value="${jdbc.password}"/> 18 </dataSource> 19 </environment> 20 </environments>
注意:尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择一个environment,所以如果你想连接两个数据库,就必须创建两个SqlSessionFactory实例,每个数据库对应其中之一。为了指定创建哪种环境,只要将environment的ID值传递给SqlSessionFactoryBuilder的build方法即可:
1 InputStream config = Resources.getResourceAsStream("mybatis/SqlMapConfig.xml"); 2 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config, "test");
如果没有指定environment的ID,则会加载默认环境,如下所示:
1 InputStream config = Resources.getResourceAsStream("mybatis/SqlMapConfig.xml"); 2 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
4.2 事务管理器transactionManager
MyBatis有两种类型的事务管理器JDBC和MANAGED:
- JDBC:这种类型的事务管理器直接使用了JDBC的事务管理,即使用java.sql.Connection对象实现对事务的提交、回滚、关闭等,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED:这种类型的事务管理器MyBatis什么都不做,而是让像Weblogic容器来管理事务的整个生命周期。
4.3 数据源dataSource
MyBatis有三种类型的数据源:UNPOOLED、POOLED和JNDI
- UNPOOLED:UNPOOLED表示不使用连接池的数据源,UNPOOLED类型的数据源需要配置以下属性:
- driver: JDBC驱动的Java类的完全限定名。
- url:JDBC连接数据库的URL地址。
- username:数据库的用户名
- password:数据库的密码
- defaultTransactionIsoLationLevel:数据库的默认事务隔离级别
- POOLED:POOLED表示使用连接池的数据源,POOLED类型的数据源需要配置以下属性:
- poolMaximumActiveConnections:最大的连接数量,默认值:10
- poolMaximumIdleConnections:最大的空闲连接数
- poolMaximumCheckoutTime:在被强制返回之前,池中连接被检出时间,默认值:20000毫秒
- poolTimeToWait:如果获取连接花费时间过场,则会给连接池打印状态日志并重新尝试获取一个连接,默认值:20000毫秒
- poolMaximumLocalBadConnectionTolerance:可以设置坏连接容忍度,用于每一个尝试从缓存池获取连接的线程,如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过poolMaximumIdleConnections与poolMaximumLocalBadConnectionTolerance之和,默认值:3
- poolPingQuery:发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求,默认值:NO PING QUERY SET,这会导致多数数据库驱动失败时带有一个恰当的错误消息
- poolPingEnabled:是否启用侦测查询,若开启则必须使用一个可执行的SQL语句设置poolPingQuery属性,默认值:false
- poolPingConnectionsNotUsedFor:配置poolPingQuery的使用频度,这可以被设置成匹配具体的数据库连接超时时间来避免不必要的侦测,默认值:0,即所有连接每一时刻都被侦测 (poolPingEnabled为true时才适用)
- JNDI:JNDI数据源是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用,JNDI数据源配置只需要两个属性:
- initial_context:用来在InitialContext中寻找上下文,即InitialContext类的lookup(initial_context),此属性可选,如果忽略,那么data_source属性将会直接从 InitialContext中寻找。
- data_source:引用数据源实例位置的上下文的路径,提供了initial_context配置时会在其返回的上下文中进行查找,没有提供时则直接在InitialContext中查找
- initial_context:用来在InitialContext中寻找上下文,即InitialContext类的lookup(initial_context),此属性可选,如果忽略,那么data_source属性将会直接从 InitialContext中寻找。
5、<mappers>映射器
5.1 通过resource加载单个映射文件
通过resource加载映射文件的方式如下所示(mappers下可以包含多个mapper):
1 <mappers> 2 <mapper resource="com/sunny/domain/UserMapper.xml"/> 3 </mappers>
4.2 通过class加载mapper接口
通过class加载mapper接口的方式如下所示(mappers下可以包含多个mapper):
1 <mappers> 2 <mapper class="com.sunny.mapper.UserMapper"/> 3 </mappers>
通过class加载mapper接口的方式遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中。
5.3 批量加载mapper
可以通过package来批量加载mapper:
1 <mappers> 2 <package name="com.sunny.mapper"/> 3 </mappers>
批量加载mapper需要指定mapper接口的包名,MyBatis自动扫描包下边所有mapper接口进行加载,而且需要遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中。