MybatisPlus分页查询与MyBatisPlus多租户saas系统

17 阅读1分钟

MyBatisPlus分页查询(分页条件查询另算)

  • 业务方法
Page<PageLimit> page = new Page<PageLimit>(1,10);

 userNameMapper.findStringUname(page);

//总页数
System.out.println(page.getTotal()); 
// 当前页
System.out.println(page.getCurrent());
// 一页多少条数据
System.out.println(page.getSize());
// 数据
System.out.println(page.getRecords());
  • SQL
<select id="findStringUname" resultType="com.trade.Entity.BO.PageLimit">
    SELECT classroom.id, classroom.class_name,classroom.chass_room
    FROM `classroom`
</select>
  • mapper层
IPage<PageLimit> findStringUname(IPage<PageLimit> limitIPage);
  • 配置类
@Configuration
@MapperScan("com.schoole.Mapper")
public class MapperConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}
  • 实体类
@Component
@TableName("classroom")
public class PageLimit {

    @TableId(value = "id")
   private Integer id;

    @TableField("class_name")
   private String className;

    @TableField("chass_room")
   private String chassRoom;

    public PageLimit(Integer id, String className, String classRoom) {
        this.id = id;
        this.className = className;
        this.chassRoom = classRoom;
    }

    public PageLimit() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getClassRoom() {
        return chassRoom;
    }

    public void setClassRoom(String classRoom) {
        this.chassRoom = classRoom;
    }

    @Override
    public String toString() {
        return "PageLimit{" +
                "id=" + id +
                ", className='" + className + ''' +
                ", classRoom='" + chassRoom + ''' +
                '}';
    }
}

MyBatisPlus多租户saas系统

我们把时间拉回到JDBC时代,当时我们遇到一个关于解析SQL的语法,当时的大体流程是这样的

DriverManager.getconnection连接数据库-->creatStatement/prepareStatement实例化连接-->excuteQuery执行SQL语句-->ResultSet结果集

我们为什么不要上述流程了,反而转向了JSQLParser这个SQL解析库,或者其他的解析库。我个人认为,一方面是ORM的诞生,另一方面就是流关闭与强绑定的原因。

  • JsqlParserSupport(没有找到MultiDataPermissionHandler)
public class Tenineter implements DataPermissionHandler {



    @Override
    public Expression getSqlSegment(Expression where, String mappedStatementId) {

//        执行JSQLParser相关语法
        return null;
    }
}
  • 配置类
@Configuration
@MapperScan("com.trade.Mapper")
public class MapperConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        interceptor.addInnerInterceptor(new DataPermissionInterceptor(new Tenineter()));
        return interceptor;
    }

}

此时基本上完成了,但是有的时候对某个租户要进行单独处理

public class UserName implements TenantLineHandler {


    @Override
    public Expression getTenantId() {
        return null;
    }

    @Override
    public String getTenantIdColumn() {
        return null;
    }

    @Override
    public boolean ignoreTable(String tableName) {
        return false;
    }
}
  • 同理进行注册
@Configuration
@MapperScan("com.trade.Mapper")
public class MapperConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor();
        tenantLineInnerInterceptor.setTenantLineHandler(new UserName());
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
        interceptor.addInnerInterceptor(new DataPermissionInterceptor(new Tenineter()));
        return interceptor;
    }

}

下一期,dockerfile部署,frp内网穿透,nginx部署