MyBatis可编写哪几类插件---如何编写插件呢?
下文笔者讲述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);
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


