MyBatis加強(4)~mybatis 外掛開發

一樂樂發表於2022-02-15


## 一、外掛介紹【動態代理】

1、外掛【動態代理】:mybatis 允許在已經對映的語句的執行過程的某個時機進行攔截增強的機制。


2、mybatis中的元件動態代理的運用:

MyBatis 在四大元件物件的建立過程中,都會有外掛進行呼叫執行。

我們可以利用動態機制對目標物件實施攔截增強操作,也就是在目標物件執行目標方法之前進行攔截增強的效果。

  • Excutor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • Parameter(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • RestultSetHandler(handleResultSets, handleOutputParameters)
  • StatementHandler(prepare, parameterize, batch, update, query)

3、外掛開發步驟:

(1)編寫外掛實現Intercetor介面,並使用@Intercepts 註解完成外掛簽名

(2)在全域性配置檔案中使用 元素註冊外掛

//標註對哪個元件的哪個方法做攔截增強
//對元件ResultSetHandler中的handleResultSets(Statement st)方法進行攔截增強
@Intercepts({@Signature(
		  type= ResultSetHandler.class ,//
		  method = "handleResultSets",//
		  args = {Statement.class})})//
public class DemoIntercetor implements Interceptor{
	
	//如何增強
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		System.out.println("攔截增強啦");
		return invocation.proceed();//放行
	}
}
<!--全域性配置檔案-->
<!-- 註冊攔截器 -->
<plugins>
 	<plugin interceptor="com.shan.mybatis.plugin.DemoIntercetor"></plugin>
</plugins>

二、MyBatis 分頁外掛-PageHelper


1、依賴:

  • jsqlparser.jar
  • pagehelper.jar

2、配置,在全域性對映檔案配置分頁外掛:

<!-- 全域性對映檔案 -->
<!-- 配置外掛 -->
<plugins>
	<!-- com.github.pagehelper為PageHelper類所在包名 -->
	<plugin interceptor="com.github.pagehelper.PageInterceptor">
	<!-- 使用下面的方式配置引數,後面會有所有的引數介紹 -->
		<property name="helperDialect" value="mysql" />
	</plugin>
</plugins>

■ 配置完成,只需要在對映檔案書寫查詢結果集的元素,然後測試的時候新增上:PageHelper.startPage(3, 3); 就實現了分頁效果

//mapper介面
public interface EmployeeMapper {
	List<Employee> queryList();
}

<!-- 對映檔案 -->
<select id="queryList" resultType="Employee">
	select  id, name, sn, salary from employee	
</select>

//測試
@Test
public void testPagePlugin() throws Exception {
	EmployeeMapper employeeMapper = MyBatisUtil.getMapper(EmployeeMapper.class);
	PageHelper.startPage(3, 3);
	List<Employee> emps = employeeMapper.queryList();
	for (Employee employee : emps) {
		System.out.println(employee);
	}
    System.out.println("============================================================");
    //測試分頁外掛的介面PageInfo,好比是我們的PageResult
	PageInfo pageInfo = new PageInfo(emps);
	System.out.println(pageInfo.getTotal());
	System.out.println(pageInfo.getList());
}

相關文章