mybatis攔截器分表
mybatis提供了攔截器外掛用來處理被攔截的方法的某些邏輯.下面會通過建立8張表,當用戶註冊時,根據對手機號取餘數資料入不同的庫.
建表
引入外掛
<property name="plugins">
<array>
<bean id="sharingInterceptor" class="com.lios.base.sharetable.SharingInterceptor"/>
</array>
</property>
攔截器
具體程式碼:
/**
* @author LiosWong
* @description
* @date 2018/7/31 下午7:05
*/
@Intercepts(@Signature(type = StatementHandler.class,method = "prepare",args = {Connection.class,Integer.class}))
public class SharingInterceptor implements Interceptor{
Logger logger = LoggerFactory.getLogger(SharingInterceptor.class);
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
MetaObject metaObject = MetaObject.forObject(statementHandler,SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,reflectorFactory);
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement" );
String id = mappedStatement.getId();
id = id.substring(0,id.lastIndexOf("."));
Class cls = Class.forName(id);
SegmentTable segmentTable = (SegmentTable) cls.getAnnotation(SegmentTable.class);
if(segmentTable!=null){
String sql = (String) metaObject.getValue("delegate.boundSql.sql");
BoundSql boundSql = statementHandler.getBoundSql();
String tableKey = StrategyFactory.createShareStrategy(segmentTable.shareType()).setSegmentTable(segmentTable).setBoundSql(boundSql).getRouteValue();
metaObject.setValue("delegate.boundSql.sql",sql.replaceFirst(segmentTable.tableName(),segmentTable.tableName()+tableKey));
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
if(target instanceof StatementHandler){
return Plugin.wrap(target,this);
}
return target;
}
@Override
public void setProperties(Properties properties) {
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SegmentTable {
/**
* 表名稱
* @return
*/
String tableName() default "";
/**
* 分表策略
* @return
*/
ShareType shareType() default ShareType.MOD;
/**
* 分表數量
* @return
*/
int tableNum() default 0;
/**
* 分表數量
* @return
*/
String shareBy() default "";
}
@Repository
@DataSource(value = DynamicDataSourceGlobal.LOCAL)
@SegmentTable(tableName = "user",shareType = ShareType.MOD,tableNum = 8,shareBy = "mobile")
public class UserInfoDaoImpl extends AbstractBaseMapper<UserInfoEntity> implements UserInfoDao{
@Override
public UserInfoEntity selectById(Long id) {
return this.getSqlSession().selectOne(this.getStatement(".selectById"),id);
}
@Override
public UserInfoEntity selectByMobile(String mobile) {
return this.getSqlSession().selectOne(this.getStatement(".selectByMobile"),mobile);
}
@Override
public UserInfoEntity insert(UserInfoEntity userInfoEntity){
this.getSqlSession().insert(this.getStatement(".insert"),userInfoEntity);
return null;
}
}
StrategyFactory根據不同分表策略處理相應的邏輯,攔截器裡主要思路就是攔截需要處理的方法,然後對引數、結果集攔截處理,然後重新構建sql語句並執行.
資料錄入
更多文章請關注微信公眾號:
相關推薦
mybatis攔截器分表
mybatis提供了攔截器外掛用來處理被攔截的方法的某些邏輯.下面會通過建立8張表,當用戶註冊時,根據對手機號取餘數資料入不同的庫. 建表 引入外掛 <property name="plugins"> <array
Mybatis攔截器分頁
使用攔截器 Web開發中我們經常會碰到分頁操作,一個專案中或許有多處使用到分頁,這時如果Java後臺使用MyBatis作為持久層,我們就可以使用MyBatis的攔截器功能來完成整個專案中多處的分頁操作,減少程式碼的冗餘。 攔截器程式碼: //攔截StatementHandler中引數型別
MyBatis攔截器分頁原理及PageHelper分頁外掛教學
閒來無事,特地整理了一下MyBatis攔截器實現分頁的原理。 地球人應該都知道要利用JDBC對資料庫進行操作,就需要一個statement物件,MyBatis也是如此。MyBatis在執行sql語句前會產生一個包含sql語句的Statement物件,而且對應的
MyBatis學習——第四篇(攔截器和攔截器分頁實現)
MyBatis架構體圖 1:mybatis核心物件 從MyBatis程式碼實現的角度來看,MyBatis的主要的核心部件有以下幾個: SqlSession &n
Mybatis攔截器之資料許可權過濾與分頁整合
解決方案之改SQL 原sql SELECT a.id AS "id", a.NAME AS "name", a.sex_cd AS "sexCd", a.org_id AS "orgId", a.STATUS AS "status", a.create_org_id AS "createOrgId"
利用Mybatis攔截器實現分頁查詢
手寫Mybatis攔截器 版本 Spring Boot 2.0.3.RELEASE Mybatis自定義攔截器 如果有閱讀過我之前一篇部落格 Hibernate 重新整理上下文 的朋友應該還記得 Hibernate 的上下文中可以新增自定義的事件監聽器。當初是為
關於我個人mybatis攔截器對於分頁的看法
一、對於mybaits的認知 二、關於mybatis的分頁 三、mybatis攔截器分頁對專案各方面效率的影響 總結 一、對於mybaits的認知 由於我還是一個學生,mybatis是我自學的,所以下面的話我說的可能會比較通俗點。 我在
mybatis攔截器實現資料庫表水平切分
攔截器主要的作用是讀取配置,根據配置的切分策略和欄位,來切分表,然後替換原執行的SQL,從而實現自動切分,上程式碼: @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {
MyBatis攔截器自定義分頁外掛實現
MyBaits是一個開源的優秀的持久層框架,SQL語句與程式碼分離,面向配置的程式設計,良好支援複雜資料對映,動態SQL;MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原
MyBatis攔截器:給參數對象屬性賦值
是否 tle dsta ref 截器 throws dev ndt pri 1 package com.development; 2 3 import java.lang.reflect.InvocationTargetException; 4 impo
通過spring抽象路由數據源+MyBatis攔截器實現數據庫自動讀寫分離
註入 兩個 -- 事情 rem 使用註解 connect key值 -m 前言 之前使用的讀寫分離的方案是在mybatis中配置兩個數據源,然後生成兩個不同的SqlSessionTemplate然後手動去識別執行sql語句是操作主庫還是從庫。如下圖所示: 好處是,你
mybatis攔截器實現查看sql執行效率
nth 內部 設置 work check sel nts mage view package cc.zeelan.common.utils; import java.lang.reflect.Field; import java.sql.Statement; impor
MyBatis攔截器打印不帶問號的完整sql語句方法
pac con his cee != Coding word sqli statement ?1/* Preparing: SELECT * FROM tb_user WHERE id = ? AND user_name = ? <br> 目標是打印:SE
Mybatis攔截器(插件實現原理)
通過 source hand page fault PE ace sign targe 在mybatis的mybatis.cfg.xml中插入: <plugins> <plugin inter
MyBatis攔截器原理探究
ash tsa nta turn 你在 asp caching tde 其中 前言: MyBatis攔截器介紹 MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實這是攔截器功能。那麽攔截器攔截MyBatis中的哪些內容呢? 我們進入官網看一看: MyB
代理模式的實際運用-以mybatis攔截器實現原理為例
之前在寫mybatis攔截器的時候,因為不懂原理,琢磨了很久,不知道怎麼寫,在網上找了很多資料,才知道mybatis的攔截器主要還是通過代理實現的,而且我在之前的博文中剛好學習了代理模式。更精細的是,在mybatis對代理的應用上,不管是封裝易用性,減少程式碼耦合度上,都可以讓我之前寫的
Mybatis攔截器設計原理1
攔截器的實現都是基於代理的設計模式實現的,簡單的說就是要創造一個目標類的代理類,在代理類中執行目標類的方法並在方法之前執行攔截器程式碼。 首先,先不管mybatis的原始碼是怎麼設計的,先假設一下自己要做一個攔截器應該怎麼做。下面我們就利用JDK的動態代理自己設計一個簡單的攔截器。 將被攔截的目
mybatis免sql外掛之JpaMapper-以Jpa hibernate的風格寫mybatis(mybatis實現簡單分表-sharding功能)
mybatis免sql外掛之JpaMapper-以Jpa hibernate的風格寫mybatis(mybatis實現簡單分表-sharding功能) 簡介 JpaMapper以Jpa hibernate的風格寫mybatis的程式碼,可以減少手動寫sql的煩惱。 優勢:
基於mybatis攔截器實現資料許可權
資料許可權是很多系統常見的功能,實現的方式也是很多的,最近在做專案的時候,自己基於mybatis攔截器做了一個數據許可權的功能。 **功能設計 a) 需要做資料許可權功能的表加上一個許可權id欄位。 許可權id可以不僅僅是組織,還可以是其他自定義的欄位,用來做資料許可權,
Mybatis攔截器原始碼深度解析
目錄: 一. 建立攔截器鏈 1. 建立物件 2. 建立配置檔案 3. 載入攔截器鏈 二. 方法呼叫解析 1. 對請求物件進行攔截器包裝 2. 執行呼叫 三. 小結 Mybatis攔截器 可以幫助我們在執行sql語句過程中增加外掛以實現一些通用的邏輯,比