①创建SpringBoot工程
项目目录:
②导入jar包
<!--SpringBoot与mybatis的整合-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!--连接数据库的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--SpringBoot依赖的测试jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
③配置mybatis,数据库连接信息
application.properties配置如下:
mybatis的全局配置如下,主要是声明拦截器
④测试dao层代码
1.编写dao接口
2.编写mapper文件
3.编写拦截器
package com.njupt.mybatisintercept.interceptor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.util.Locale;
import java.util.Properties;
/**
* @author wall
* @date 2019/6/20 21:26
* @description
*/
@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class}),
@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class})})
public class MybatisInterceptor implements Interceptor {
/**正则匹配 insert、delete、update操作*/
private static final String REGEX = ".*insert\\\\u0020.*|.*delete\\\\u0020.*|.*update\\\\u0020.*";
@Override
public Object intercept(Invocation invocation) throws Throwable {
//获取执行参数
Object[] objects = invocation.getArgs();
MappedStatement ms = (MappedStatement) objects[0];
BoundSql boundSql = ms.getSqlSource().getBoundSql(objects[1]);
String sql = boundSql.getSql().toLowerCase(Locale.CHINA).replace("[\\t\\n\\r]", " ");
System.out.println("打印SQL语句"+sql);
//如果是insert、delete、update操作 使用主库
if (sql.matches(REGEX)) {
System.out.println("拦截执行数据库的请求:写请求");
} else {
//使用从库
System.out.println("拦截执行数据库的请求:读请求");
}
//继续执行逻辑
return invocation.proceed();
}
@Override
public Object plugin(Object o) {
//获取代理权
if (o instanceof Executor){
//如果是Executor(执行增删改查操作),则拦截下来
return Plugin.wrap(o,this);
}else {
return o;
}
}
@Override
public void setProperties(Properties properties) {
//读取mybatis配置文件中属性
}
}
⑤测试效果
⑥应用场景:数据库的读写分离