mybatis插件扩展机制
我们可以基于mybatis插件机制实现分页、分表、监控等功能,mybatis四大组件包括Executor、StatementHandler、ParameterHandler、ResultSetHandler,他们提供了简单易用的插件扩展机制。
插件扩展需两步:
- 1、实现Interceptor
/**
* 通过Intercepts和Signature两个注解,定义插件拦截哪个核心对象里的哪个方法
*/
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("---------增强逻辑-------------");
return invocation.proceed();
}
/**
* 把当前拦截器生成代理加入到拦截器链
*
* @param target
* @return
*/
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
System.out.println("-------------获取配置文件-------------");
}
}
- 2、修改核心配置文件
<plugins>
<plugin interceptor="com.plugin.MySqlPagingPlugin">
<!--配置参数-->
<property name="name" value="Bob"/>
</plugin>
</plugins>
自定义分页插件
MyBatis可以使用第三方的插件来对功能进行扩展,只需导入相关包,修改配置文件即可
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>3.2</version>
</dependency>
<!--注意:分页助手的插件配置在通用馆mapper之前*-->*
<plugin interceptor="com.github.pagehelper.PageHelper">
<!—指定方言 —>
<property name="dialect" value="mysql"/>
</plugin>
调用查询语句前,执行
PageHelper.startPage(1,10);
List<User> userList = userMapper.selectList();
PageInfo pageInfo = new PageInfo<>(userList);
通用Mapper如何实现
单表增删改查,基于mybatis的插件机制,不需要在dao中增加方法,只需要写好实体类,就能支持相应的增删改查方法。通用Mapper使用需5步:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
2.mybatis核心配置文件中增加配置项
<plugins>
<plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"></property>
</plugin>
</plugins>
3.在实体类中编写映射
@Table(name="user")
public class User{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
}
4.定义接口UserMapper,继承Mapper<User>
,就拥有了Mapper中封装的一些常用方法