mybatis 自定義插件的使用


今天看了別人的mybatis的教學視頻,自己手寫了一個簡單的自定義的插件,有些細節記錄一下。

先看下mybatis的插件的一些說明:

MyBatis 允許你在已映射語句執行過程中的某一點進行攔截調用。默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)          --執行sql

ParameterHandler (getParameterObject, setParameters)                     --獲取、設置參數

ResultSetHandler (handleResultSets, handleOutputParameters)          --處理結果集

StatementHandler (prepare, parameterize, batch, update, query)          --記錄sql

這里需要注意的是,這4個類型是固定的,里面的方法也是固定的,不能再被改變的,具體的信息,可以相關的類(Executor.class、ParameterHandler .class、ResultSetHandler .class、StatementHandler .class)查看。

-----------------------------------------------------------------------------------------------------

先定義一個插件攔截器,代碼如下:

package com.drafire.testall.interceptor;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

/**
 * mybatis 自定義插件
 */
@Intercepts(value = {@Signature(
        type= Executor.class,                              //這里對應4個類
        method = "update",                                 //這里對應4個類里面的參數
        args = {MappedStatement.class,Object.class})})     //這里的參數類型,是對應4個類中的各種方法的參數。如果方法沒有參數,這里直接寫{}就可以了
public class DrafirePlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("mybatis插件打印了樂樂");
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

 

配置mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeHandlers>
        <typeHandler handler="com.drafire.testall.handler.DrafireStringHandler"></typeHandler>
    </typeHandlers>

    <plugins>
        <plugin interceptor="com.drafire.testall.interceptor.DrafirePlugin">
        </plugin>
    </plugins>

    <environments default="development">
        <environment id="sell">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${ds.sell.driverClassName}"/>
                <property name="url" value="${ds.sell.url}"/>
                <property name="username" value="${ds.sell.username}"/>
                <property name="password" value="${ds.sell.password}"/>
            </dataSource>
        </environment>

        <environment id="bank">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${ds.bank.driverClassName}"></property>
                <property name="url" value="${ds.bank.url}"></property>
                <property name="username" value="${ds.bank.username}"></property>
                <property name="password" value="${ds.bank.password}"></property>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
    </mappers>
</configuration>

測試代碼如下,測試

package com.drafire.testall.Sevice;

import com.drafire.testall.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTest {

    @Autowired
    private UserService userService;

    //@Test
    public void addUser() {
        User user=new User();
        user.setId(1);
        user.setAmount(110L);
        user.setName("李四");
        userService.add(user);
    }

    @Test
    public void updateUser(){
        User user=new User();
        user.setId(1);
        user.setAmount(50L);
        user.setName("王五123");
        userService.update(user);
    }
}

 

通過

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM