首页 > 其他分享 >多租户插件

多租户插件

时间:2022-10-01 21:38:19浏览次数:76  
标签:mapper 插件 name 租户 id user public tenant

@Configuration
@MapperScan("org.example.demo15.mapper")
public class MybatisPlusConfig {

/**
* 新多租户插件配置,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存万一出现问题
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1);
}

// 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
@Override
public boolean ignoreTable(String tableName) {
return !"user".equalsIgnoreCase(tableName);
}
}));
// 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
// 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}

// @Bean
// public ConfigurationCustomizer configurationCustomizer() {
// return configuration -> configuration.setUseDeprecatedExecutor(false);
// }
}
  • 实体类
@Data
@Accessors(chain = true)
public class User {
private Long id;
/**
* 租户 ID
*/
private Long tenantId;
private String name;

@TableField(exist = false)
private String addrName;

}
  • 持久层接口
public interface UserMapper extends BaseMapper<User> {

/**
* 自定义SQL:默认也会增加多租户条件
* 参考打印的SQL
* @return
*/
Integer myCount();

List<User> getUserAndAddr(@Param("username") String username);

List<User> getAddrAndUser(@Param("name") String name);
}
  • xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.example.demo15.mapper.UserMapper">

<select id="myCount" resultType="java.lang.Integer">
select count(1) from user
</select>

<select id="getUserAndAddr" resultType="org.example.demo15.entity.User">
select u.id, u.name, a.name as addr_name
from user u
left join USER_ADDR a on a.user_id=u.id
<where>
<if test="username!=null">
u.name like concat(concat('%',#{username}),'%')
</if>
</where>
</select>

<select id="getAddrAndUser" resultType="org.example.demo15.entity.User">
select a.name as addr_name, u.id, u.name
from USER_ADDR a
left join user u on u.id=a.user_id
<where>
<if test="name!=null">
a.name like concat(concat('%',#{name}),'%')
</if>
</where>
</select>
</mapper>
  • 测试
@SpringBootTest
public class TenantTest {

@Resource
private UserMapper mapper;

/**
* INSERT INTO user (id, name, tenant_id) VALUES (?, ?, 1)
* 1549655815066677250(Long), 一一(String)
*
* SELECT id, tenant_id, name FROM user WHERE id = ? AND tenant_id = 1
* 1549655815066677250(Long)
*/
@Test
public void aInsert() {
User user = new User();
user.setName("一一");
Assertions.assertTrue(mapper.insert(user) > 0);
user = mapper.selectById(user.getId());
Assertions.assertTrue(1 == user.getTenantId());
}

/**
* DELETE FROM user WHERE tenant_id = 1 AND id = ?
* 3(Long)
*/
@Test
public void bDelete() {
Assertions.assertTrue(mapper.deleteById(3L) > 0);
}

/**
* UPDATE user SET name = ? WHERE tenant_id = 1 AND id = ?
* mp(String), 1(Long)
*/
@Test
public void cUpdate() {
Assertions.assertTrue(mapper.updateById(new User().setId(1L).setName("mp")) > 0);
}

/**
* SELECT id, tenant_id, name FROM user WHERE tenant_id = 1
*/
@Test
public void dSelect() {
List<User> userList = mapper.selectList(null);
userList.forEach(u -> Assertions.assertTrue(1 == u.getTenantId()));
}

/**
* 自定义SQL:默认也会增加多租户条件
* 参考打印的SQL
*
* SELECT count(1) FROM user WHERE tenant_id = 1
*/
@Test
public void manualSqlTenantFilterTest() {
System.out.println(mapper.myCount());
}

/**
* SELECT a.name AS addr_name, u.id, u.name FROM USER_ADDR a LEFT JOIN user u ON u.id = a.user_id AND u.tenant_id = 1
*
* SELECT a.name AS addr_name, u.id, u.name FROM USER_ADDR a LEFT JOIN user u ON u.id = a.user_id AND u.tenant_id = 1 WHERE a.name LIKE concat(concat('%', ?), '%')
* add(String)
*
* SELECT u.id, u.name, a.name AS addr_name FROM user u LEFT JOIN user_addr a ON a.user_id = u.id WHERE u.tenant_id = 1
*
* SELECT u.id, u.name, a.name AS addr_name FROM user u LEFT JOIN USER_ADDR a ON a.user_id = u.id WHERE u.name LIKE concat(concat('%', ?), '%') AND u.tenant_id = 1
* J(String)
*/
@Test
public void testTenantFilter(){
mapper.getAddrAndUser(null).forEach(System.out::println);
mapper.getAddrAndUser("add").forEach(System.out::println);
mapper.getUserAndAddr(null).forEach(System.out::println);
mapper.getUserAndAddr("J").forEach(System.out::println);
}
}



标签:mapper,插件,name,租户,id,user,public,tenant
From: https://blog.51cto.com/chniny/5728437

相关文章

  • 动态表名插件
    ​​官方文档​​pom.xml,注意mybatisplus版本需高于3.4.3.2<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spr......
  • VSCode编写博客插件
    @目录前言MarkdownToolsMarkdownPreviewEnhanced博客园Cnblogs客户端插入图片一键发布前言在编写博客的道路上面,几经波折,以前写博客,都是直接使用CSDN或者博客园在线编......
  • graylog 插件模型之PluginModule
    graylog的PluginModule可以简化graylog插件的开发,方便我们进行扩展参考功能类结构从下图可以看出是依赖了guice进行的包装,代码中好多都是支持依赖PluginModule开......
  • nonebot2插件入门-你的第一个机器人插件(发送文字消息)
    机器人需要各种插件来实现各种功能,只有个机器人框架是不够的。......
  • vue element-ui 基本使用和按需加载的2种方式(推荐安装插件的方式)
    element-ui官网:https://element.eleme.cn/#/zh-CN/component/installation 安装npminstallelement-ui-S不太清楚这里为什么是-S的朋友可以看看我的这篇文章......
  • 浏览器必备的上网工具,同样也是收藏党必备工具, 网页图片收藏工具,可以收藏全网的网页图
    浏览器必备的上网工具,同样也是收藏党必备工具,网页图片收藏工具,可以收藏全网的网页图片,无需下载到本地了,太方便了工具名称:BdTab新标签页插件,支持图片收藏......
  • v-viewer图片预览插件使用
    链接:https://www.jianshu.com/p/1fd3b4e6911c今天介绍一款用于图片浏览的Vue组件,支持旋转、缩放、翻转等操作,它是基于viewer.js做的二次开发,我感觉用起来挺方便的,Github......
  • chrome插件下载地址
    收藏猫:https://chrome.pictureknow.com/Chrome官方应用店只支持在线安装不支持将安装包.crx保存到本地,我们可以通过第三方Chrome扩展插件下载网站获取需要的.crx安装......
  • 分享一个Vue实现图片水平瀑布流的插件
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一.需求来源今天碰到了一个需求,需要在页面里,用水平瀑布流的方式,将一些图片进行加载,这让我突然想起我很久......
  • Vue插件
    Vue插件插件作用插件通常用来为Vue添加全局功能例如:1、添加全局资源:指令/过滤器/过渡等。如vue-touch2、通过全局混入来添加一些组件选项。3、添加Vue实例方法,......