MyBatis可编写哪几类插件---如何编写插件呢?

乔欣 Java面经 发布时间:2022-11-07 22:14:37 阅读数:16535 1 MyBatis面试题(2023优化版)
下文笔者讲述Mybatis插件的简介说明,如下所示

Mybatis插件简介

Mybatis插件是用于增强Mybatis功能
    增强本质是使用底层动态代理的方式,使Mybatis的功能变强

Mybatis用于插件扩展的四大组件:
    Executor、StatementHandler、ParameterHandler、ResultSetHandler

    执行器 Executor(update、query、commit、rollback 等方法)
    SQL语法构建器 StatementHandler(prepare、parameterize、batch、update、query 等方法)
    参数处理器 ParameterHandler(getParameterObject、setParameters 方法)
    结果集处理器 ResultSetHandler(handleResultSets、handleOutputParameters 等方法)

Mybatis插件的实现思路:
    1.实现Mybatis的Interceptor接口并重写intercept()方法
    2.给插件编写注解
    3.指定要拦截哪一个接口的哪些方法即可
    4.在配置文件中配置你编写的插件   
例:
自定义一个插件
@Intercepts(@Signature(     
        type = StatementHandler.class,    // 这是指拦截哪个接口
        method = "prepare",    // 这个接口内的哪个方法名,不要拼错了
        args = {Connection.class,Integer.class}    
        // 这是拦截的方法的入参,按顺序写到这,不要多也不要少,如果方法重载,可是要通过方法名和入参来确定唯一的
))
public class MyPlugin implements Interceptor {
    
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    // 这里是每次执行操作的时候,都会进行这个拦截器的方法内
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 增强逻辑
        System.out.println("增强了参数功能。。");
        // 执行原方法
        return invocation.proceed();
    }

    /**
     * 主要是为了把这个拦截器生成一个代理放到拦截器链中。
     * @Description 包装目标对象,为目标对象创建代理对象。
     * @Param target 为要拦截的对象
     * @Return 代理对象
     */
    @Override
    public Object plugin(Object target) {
        System.out.println("将要包装的目标对象:"+target);
        return Plugin.wrap(target,this);
    }

    /** 获取配置文件的属性 **/ 
    // 插件初始化的时候调用,也只调用一次,插件配置的属性从这里设置进来
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的初始化参数:"+properties);
    }
} 

2.相关配置 sqlMapConfig.xml
<plugins>
    <plugin interceptor="com.java265.plugin.MySqlPagingPlugin">
        <!--配置参数-->
        <property name="name" value="test-Java265"/>
    </plugin>
</plugins>

3.mapper 接口
public interface UserMapper {
    list<User> selectUser();
}

4。mapper.xml 配置
<mapper namespace="com.lagou.mapper.UserMapper">
    <select id="selectUser" resultType="com.lagou.pojo.User">
        select id,username from user
    </select>
</mapper>

5.测试类代码
public class PluginTest {   
    @Test
    public void test() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> pagesTest = userMapper.selectUser();
        for (User user : pagesTest) {
            System.out.println(user);
        }
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202211/16678317244842.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者