Mybatis自定义插件配置和PageHelper插件实例

Mybatis自定义插件配置

思路

  1. 设计一个自定义插件类
  2. 添加相关配置或添加bean

实现
1.自定义插件MySqlPulgin类

@Intercepts({
        @Signature(
                type = StatementHandler.class,
                method = "query",
                args = {Statement.class, ResultHandler.class}
        )
})
public class MySqlPlugin implements Interceptor{


    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //每次调用原方法之前,就会执行这里
        System.out.println("方法进行了增强");
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        //把这个拦截器封装成代理对象,并加入拦截器队列
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        //获取插件的配置信息
        System.out.println(properties);
    }
}
  1. 如果是spring项目,修改mybatis的config文件
<plugins>
	<plugin interceptor="com.study.mybatis_test.plugins.MySqlPlugin">
		<!--配置参数-->
		<property name="name" value="Bob"/>
	</plugin>
</plugins>

如果是springboot项目,往配置类中添加bean

	@Bean
	public MySqlPlugin mySqlPlugin(){
		MySqlPlugin mySqlPlugin = new MySqlPlugin();
		Properties properties = new Properties();
		properties.setProperty("name","tom");
		mySqlPlugin.setProperties(properties);
		return mySqlPlugin;
	}

至此Mybatis的自定插件配置完毕

PageHelper插件实例

  1. 添加maven依赖:

springboot项目:

		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.5</version>
			<exclusions>
				<exclusion>
					<artifactId>mybatis</artifactId>
					<groupId>org.mybatis</groupId>
				</exclusion>
			</exclusions>
			<optional>true</optional>
		</dependency>

spring项目:

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>3.7.5</version>
</dependency>
<dependency>
	<groupId>com.github.jsqlparser</groupId>
	<artifactId>jsqlparser</artifactId>
	<version>0.9.1</version>
</dependency>
  1. 修改mybatis的config文件或添加bean

springboot项目:

	@Bean
	public PageHelper pageHelper(){
		PageHelper pageHelper = new PageHelper();
		Properties properties = new Properties();
		//方言:mysql
		properties.setProperty("dialect","mysql");
		pageHelper.setProperties(properties);
		return pageHelper;
	}

spring项目:

<!--注意:分页助手的插件 配置在通用馆mapper之前*-->*
<plugin interceptor="com.github.pagehelper.PageHelper">
<!—指定方言 —>
<property name="dialect" value="mysql"/>
</plugin>

测试代码:

	@Resource
	private UserMapper userMapper;
	
	@Test
	void test1(){
		PageHelper.startPage(1,1);
		List<User> all = userMapper.findAll();
		all.forEach(System.out::println);
		PageInfo<User> pageInfo = new PageInfo<>(all);
		System.out.println("总页数:"+pageInfo.getTotal());
		System.out.println("当前页:"+pageInfo.getPageNum());
		System.out.println("每页条数:"+pageInfo.getPageSize());
	}

运行结果:

2021-06-03 22:45:13.430 [main] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [HikariProxyConnection@1572582034 wrapping com.mysql.cj.jdbc.ConnectionImpl@267f9765] will not be managed by Spring
2021-06-03 22:45:13.437 [main] DEBUG c.s.mybatis_test.mapper.UserMapper.findAll_COUNT - ==>  Preparing: SELECT count(0) FROM user
2021-06-03 22:45:13.626 [main] DEBUG c.s.mybatis_test.mapper.UserMapper.findAll_COUNT - ==> Parameters: 
2021-06-03 22:45:13.777 [main] DEBUG c.s.mybatis_test.mapper.UserMapper.findAll_COUNT - <==      Total: 1
2021-06-03 22:45:13.783 [main] DEBUG com.study.mybatis_test.mapper.UserMapper.findAll - ==>  Preparing: select * from user LIMIT ?
2021-06-03 22:45:13.784 [main] DEBUG com.study.mybatis_test.mapper.UserMapper.findAll - ==> Parameters: 1(Integer)
2021-06-03 22:45:13.790 [main] DEBUG com.study.mybatis_test.mapper.UserMapper.findAll - <==      Total: 1
2021-06-03 22:45:13.791 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ddee60f]
User(id=1, name=zhangsan)
总页数:3
当前页:1
每页条数:1

自定义一个SQL打印器

package com.migu.tsg.channel.service;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.util.Properties;

/**
 * @description:
 * @author: gongjunjie
 * @date: 2022年12月05日
 */
@Intercepts({//注意看这个大花括号,也就这说这里可以定义多个@Signature对多个地方拦截,都用这个拦截器
        @Signature(
                type = Executor.class, //这是指拦截哪个接口
                method = "query",//这个接口内的哪个方法名,不要拼错了
                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}// 这是拦截的方法的入参,按顺序写到这,不要多也不要少,如果方法重载,可是要通过方法名和入参来确定唯一的
        ),
        @Signature(
                type = Executor.class,
                method = "query",
                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}
        )
})
@Component
public class SqlPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取得到封装的映射语句对象
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        // 获取得到参数
        Object parameterObject = invocation.getArgs()[1];
//        if (SqlCommandType.SELECT != mappedStatement.getSqlCommandType()) {
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
        String sql = boundSql.getSql();
        System.out.println("自定义sql拦截器拦截的sqlCommandType=" + sqlCommandType + ",sql:" + sql);
//        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Interceptor.super.plugin(target);
    }

    @Override
    public void setProperties(Properties properties) {
        Interceptor.super.setProperties(properties);
    }
}

运行结果如图:
Mybatis自定义插件配置和PageHelper插件实例_第1张图片

你可能感兴趣的:(学习笔记,mybatis,mybatis)