【学习笔记】mybatis自定义插件案例代码
生活随笔
收集整理的這篇文章主要介紹了
【学习笔记】mybatis自定义插件案例代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 插件介紹
- 案例
- 實體類:
- 定義插件:
- 測試:
插件介紹
插件是MyBatis提供的一個非常強大的機制,我們可以通過插件來修改MyBatis的一些核心行為。插件通過動態代理機制,可以介入四大對象的任何一個方法的執行
四大對象:
?Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
?ParameterHandler(getParameterObject, setParameters)
?ResultSetHandler(handleResultSets, handleOutputParameters)
?StatementHandler(prepare, parameterize, batch, update, query)
案例
新建mybatis配置文件,在配置中注冊插件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!--plugins:注冊插件 --><plugins><plugin interceptor="com.atguigu.mybatis.dao.MyFirstPlugin"><property name="username" value="root"/><property name="password" value="123456"/></plugin><plugin interceptor="com.atguigu.mybatis.dao.MySecondPlugin"></plugin></plugins><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mybatis" /><property name="username" value="mybatis" /><property name="password" value="123456" /></dataSource></environment></environments><!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要注冊到全局配置文件(mybatis-config.xml)中 --><mappers><mapper resource="EmployeeMapper.xml" /></mappers> </configuration>實體類:
@Data public class Employee {private Integer id;private String lastName;private String email;private String gender;}定義插件:
@Intercepts({@Signature(type=StatementHandler.class,method="parameterize",args=java.sql.Statement.class)//這里的args是發給發參數的意思,防止方法重載}) public class MyFirstPlugin implements Interceptor{/*** intercept:攔截:* 攔截目標對象的目標方法的執行;*/@Overridepublic Object intercept(Invocation invocation) throws Throwable {// TODO Auto-generated method stubSystem.out.println("MyFirstPlugin...intercept:"+invocation.getMethod());//動態的改變一下sql運行的參數:以前1號員工,實際從數據庫查詢3號員工Object target = invocation.getTarget();System.out.println("當前攔截到的對象:"+target);//拿到:StatementHandler==>ParameterHandler===>parameterObject//拿到target的元數據MetaObject metaObject = SystemMetaObject.forObject(target);Object value = metaObject.getValue("parameterHandler.parameterObject");System.out.println("sql語句用的參數是:"+value);//修改完sql語句要用的參數metaObject.setValue("parameterHandler.parameterObject", 11);//執行目標方法Object proceed = invocation.proceed();//返回執行后的返回值return proceed;}/*** plugin:* 包裝目標對象的:包裝:為目標對象創建一個代理對象*/@Overridepublic Object plugin(Object target) {// TODO Auto-generated method stub//我們可以借助Plugin的wrap方法來使用當前Interceptor包裝我們目標對象System.out.println("MyFirstPlugin...plugin:mybatis將要包裝的對象"+target);Object wrap = Plugin.wrap(target, this);//返回為當前target創建的動態代理return wrap;}/*** setProperties:* 將插件注冊時 的property屬性設置進來*/@Overridepublic void setProperties(Properties properties) {// TODO Auto-generated method stubSystem.out.println("插件配置的信息:"+properties);}}其中 StatementHandler 接口類的源碼:
public interface StatementHandler {Statement prepare(Connection var1, Integer var2) throws SQLException;void parameterize(Statement var1) throws SQLException; ....}其中 可以看到parameterize方法的參數是Statement
而實現類 SimpleStatementHandler的parameterize方法是一個空方法:
public void parameterize(Statement statement) throws SQLException {}MyFirstPlugin 與 MySecondPlugin基本一模一樣就不粘貼了。
public interface EmployeeMapper {public Employee getEmpById(Integer id);}測試:
/*** 1、獲取sqlSessionFactory對象:* 解析文件的每一個信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;* 注意:【MappedStatement】:代表一個增刪改查的詳細信息* * 2、獲取sqlSession對象* 返回一個DefaultSQlSession對象,包含Executor和Configuration;* 這一步會創建Executor對象;* * 3、獲取接口的代理對象(MapperProxy)* getMapper,使用MapperProxyFactory創建一個MapperProxy的代理對象* 代理對象里面包含了,DefaultSqlSession(Executor)* 4、執行增刪改查方法* * 1、根據配置文件(全局,sql映射)初始化出Configuration對象* 2、創建一個DefaultSqlSession對象,* 他里面包含Configuration以及* Executor(根據全局配置文件中的defaultExecutorType創建出對應的Executor)* 3、DefaultSqlSession.getMapper():拿到Mapper接口對應的MapperProxy;* 4、MapperProxy里面有(DefaultSqlSession);* 5、執行增刪改查方法:* 1)、調用DefaultSqlSession的增刪改查(Executor);* 2)、會創建一個StatementHandler對象。* (同時也會創建出ParameterHandler和ResultSetHandler)* 3)、調用StatementHandler預編譯參數以及設置參數值;* 使用ParameterHandler來給sql設置參數* 4)、調用StatementHandler的增刪改查方法;* 5)、ResultSetHandler封裝結果* 注意:* 四大對象每個創建的時候都有一個interceptorChain.pluginAll(parameterHandler);* * @throws IOException*/@Testpublic void test01() throws IOException {// 1、獲取sqlSessionFactory對象SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();// 2、獲取sqlSession對象SqlSession openSession = sqlSessionFactory.openSession();try {// 3、獲取接口的實現類對象//會為接口自動的創建一個代理對象,代理對象去執行增刪改查方法EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);Employee employee = mapper.getEmpById(1);System.out.println(mapper);System.out.println(employee);} finally {openSession.close();}}結果:
總結
以上是生活随笔為你收集整理的【学习笔记】mybatis自定义插件案例代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springcloudstream+ra
- 下一篇: 一些题目以及答案