日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【学习笔记】mybatis自定义插件案例代码

發布時間:2024/9/30 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】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自定义插件案例代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。