plugins(插件)
1. Plugins概念
- 在某种情况下,需要在执行程序的过程中对某一点进行拦截,并在拦截后做出一系列处理,此时就需要使用一种拦截器。
- 在 MyBatis 中,对某种方法进行拦截调用的机制,被称为 plugin 插件
- 插件通过动态代理机制,可以介入四大对象的任何一个方法的执行
2. 四大对象
- Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
- ParameterHandler(getParameterObject,setParameters)
- ResultSetHandler(handleResultSets,handleOutputParameters)
- StatementHandler(prepare,parameterize,batch,update,query)
3. 定义一个插件
- 实现 Interceptor 接口
- 并且指定需要拦截的方法的签名信息
//此注解声明此类是一个插件类
//其中可以声明多个 @Signature
//type 为拦截的方法所属的接口类型
//method 为拦截的方法名称
//args 是参数信息
@Intercepts({
@Signature(
type=Executor.class,
method="query",
args={
MappedStatement.class,
Object.class,
RowBounds.class,
ResultHandler.class
}
)
})
public class QueryPlugin implements Interceptor {
//intercept 方法是一个对目标方法进行拦截的抽象方法
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
//plugin 方法的作用是将拦截器插入目标对象
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
//setProperties 方法的作用是将全局配置文件中的参数注入插件类中
public void setProperties(Properties arg0) {}
}
4. plugins(插件)
<plugins>
<plugin interceptor="cn.com.mybatis.test.QueryPlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
environments(环境配置)
1. environments
<!--
environments:mybatis可以配置多种环境
default指定使用某种环境。可以达到快速切换环境
尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境
-->
<environments default="dev_mysql">
<!--
environment:配置一个具体的环境信息
id:代表当前环境的唯一标识
transactionManager:事务管理器
dataSource:数据源
transactionManager、dataSource属性必须有
-->
<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>
2. 事务管理器(transactionManager)
- JDBC(JdbcTransactionFactory):使用了jdbc的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围
- MANAGED(ManagedTransactionFactory):不提交或者回滚一个连接,让容器来管理事务的整个生命周期,比如JEE应用服务器的上下文
- 自定义事务管理器:实现TransactionFactory接口,type指定为全类名
<transactionManager type="[JDBC|MANAGED]">
<property name="closeConnection" value="false"/>
</transactionManager>
3. 数据源(dataSource)
- UNPOOLED: 这个数据源的实现会每次请求时打开和关闭连接。
- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。
- JNDI :这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
- 自定义数据源:实现DataSourceFactory接口,type是全类名
<dataSource type="[UNPOOLED|POOLED|JNDI]">
<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql:mydb"/>
<property name="username" value="postgres"/>
<property name="password" value="root"/>
</dataSource>
databaseIdProvider(数据库厂商标识)
- databaseIdProvider
<!—
databaseIdProvider:支持多数据库厂商的;
type="DB_VENDOR":VendorDatabaseIdProvider
作用:就是得到数据库厂商的标识(驱动getDatabaseProductName())
mybatis就能根据数据库厂商标识来执行不同的sql
-->
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
- mapper.xml中
<select id="getEmpById" resultType="com.my.mybatis.bean.Employee"
databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="com.my.mybatis.bean.Employee"
databaseId="oracle">
select EMPLOYEE_ID id,LAST_NAME lastName,EMAIL email
from employees where EMPLOYEE_ID=#{id}
</select>
mappers(映射器)
- mapper映射:注册sql映射的配置文件
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="com/mybatis/dao/AuthorMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="com.mybatis.dao.AuthorMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="com.mybatis.dao"/>
</mappers>