1. 程式人生 > >mybatis攔截器分表

mybatis攔截器分表

mybatis提供了攔截器外掛用來處理被攔截的方法的某些邏輯.下面會通過建立8張表,當用戶註冊時,根據對手機號取餘數資料入不同的庫.

建表

https://note.youdao.com/yws/api/personal/file/WEBfa5f294403e547b8de8f75ed5754a294?method=download&shareKey=fdf0fdffda7b82a83c763977e2420bad

引入外掛

<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語句並執行.

資料錄入

https://note.youdao.com/yws/api/personal/file/WEB4410d0e711f9f67487e43c97e7ac3d15?method=download&shareKey=e8ad78d0c2b9049391037b13738a955e

更多文章請關注微信公眾號:
https://note.youdao.com/yws/api/personal/file/WEB6c0f1a891fdea03ecc708833e0df9b3b?method=download&shareKey=45f2c5279d958cfcdc96b6c92be0ad96

相關推薦

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的風格寫mybatismybatis實現簡單-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語句過程中增加外掛以實現一些通用的邏輯,比