一、mybatis全局配置文件的文档结构
configuration 配置
• properties 属性
• settings 设置
• typeAliases 类型命名
• typeHandlers 类型处理器
• objectFactory 对象工厂
• plugins 插件
• environments 环境
• environment 环境变量
• transactionManager 事务管理器
• dataSource 数据源
• databaseIdProvider 数据库厂商标识
• mappers 映射器
二、mybatis全局配置文件各层详解
1.properties
该层用来引入外部配置文件,如数据库连接信息可以通过引入外部的properties文件来,示例如下
<!-- 引入配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 配置环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
其中properties有两个属性:
resource用相对路径引用文件;
url通过网络形式绝对路径来引用配置文件;
2.settings
该层用来配置mybatis运行时的行为,可以设置许多属性,有需要可以查询官方文档,以下示例如何设置
<!-- 设置 -->
<settings>
<!-- 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
3.typeAliases
该层用来给各类设置别名,即在使用到某些类时不用写出全类名,使用别名即可,示例如下
<!-- 配置别名 -->
<typeAliases>
<!-- 即给一个类配置一个别名在调用该类时就不用在书写全类名 -->
<typeAlias type="com.lazy.bean.Employee" alias="emp"></typeAlias>
</typeAliases>
所以在mapper映射文件中调用如下:
<select id="selectOneById" resultType="emp">
select id,user_name username,email from employee where id = #{id}
</select>
该层有两类标签:
第一类typeAliase标签:
type属性:用来指定要取别名的类;
alias属性:给该类取的别名;
第二类package标签:
name属性:用来指定某个包,给所有包中的类取别名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写));
如果包中有不同的包,而不同的包中有同名的类时就要使用注解给类取别名,示例如下:
<package name="com.lazy.bean"/>
<select id="selectOneById" resultType="employee">
select id,user_name username,email from employee where id = #{id}
</select>
使用别名示例如下:
@Alias("emp1")
public class Employee {
<select id="selectOneById" resultType="emp1">
select id,user_name username,email from employee where id = #{id}
</select>
注意:在使用自定义的类时我们不推荐使用别名,依旧使用全类名,这样便于我们查找,mybatis对常用的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
4.typeHandler
在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
同时可以自己来实现类型处理器,只需实现org.apache.ibatis.type.TypeHandler接口,或者继承该接口的实现类org.apache.ibatis.type.BaseTypeHandler
但是要注意的是类型处理器将会覆盖已有的处理 Java String 类型的属性以及 VARCHAR 类型的参数和结果的类型处理器。 要注意 MyBatis 不会通过检测数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明字段是 VARCHAR 类型, 以使其能够绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行时才清楚数据类型。
5.objectFactory
该层主要是用来创建目标类的示例,一般使用无参构造器,一般不做修改。
6.plugins
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
7.enviroments
环境集合,该标签用来配置mybatis使用环境,如使用mysql、Oracle等不同的数据库管理系统对应的不同信息,示例如下
<!-- 配置环境 -->
<environments default="dev_mysql">
<environment id="dev_mysql">
<transactionManager type="JDBC"></transactionManager>
<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>
<environment id="dev_oracle">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${orcl.driver}" />
<property name="url" value="${orcl.url}" />
<property name="username" value="${orcl.username}" />
<property name="password" value="${orcl.password}" />
</dataSource>
</environment>
</environments>
mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境;
environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识;
①事务管理器transactionManager
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为
如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置
②数据源datasource
该标签用来配置数据库的连接信息,示例如下:
<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>
其中的type属性有三种取值:
UNPOOLED:不使用数据库连接池,即每次增删改查都创建新的连接;
POOLED:使用mybatis自带的数据库连接连接池;
JNDI:这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
同时我们可以使用自定义,只需实现一个org.apache.ibatis.datasource.DataSourceFactory接口来实现第三方数据库,org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory可被用作父类来构建新的数据源适配器,示例如下
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
public C3P0DataSourceFactory() {
this.dataSource = new ComboPooledDataSource();
}
}
8.databaseIdProvider
该层用来实现对不同数据库厂商执行不同的语句,databaseIdProvider 对应的 DB_VENDOR 实现会将 databaseId 设置为 ,作用就是得到数据库厂商的标识(驱动getDatabaseProductName())
mybatis就能根据数据库厂商标识来执行不同的sql**DatabaseMetaData#getDatabaseProductName() **返回的字符串。 由于通常情况下这些字符串都非常长,而且相同产品的不同版本会返回不同的值,你可能想通过设置属性别名来使其变短:
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
9.mappers
该层用来告诉mybatis框架到何处去寻找SQL语句,他其中有两个标签:
mapper标签:
resource属性:使用相对路径在查询;
url属性:使用网络路径或绝对路径查询;
class属性:使用映射器接口实现类的完全限定类名;
注意事项:
注册接口
class:引用(注册)接口,
1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
且注解和sql映射文件不能同时存在
package标签(实现批量注册):
将指定包内的映射器接口全部注册为映射器(注意事项同上);