mybatis拦截器 修改mybatis返回结果集中的字段的值
项目中使用了shardingJDBC,业务库做了分库,公共库没在一起,所以导致做码值转换的时候,需要在实现类里面做转码,重复的代码量大,故考虑用mybatis拦截器,将码值转换后再做返回给实现类。
import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.executor.resultset.DefaultResultSetHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.session.Configuration; import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Properties; @Intercepts({ @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = { Statement.class }) })
public class MyPlugin implements Interceptor {
// //这里是每次执行操作的时候,都会进行这个拦截器的方法内
public Object intercept(Invocation invocation) throws Throwable {
List resList = new ArrayList();
DefaultResultSetHandler defaultResultSetHandler = (DefaultResultSetHandler) invocation.getTarget();
MetaObject metaStatementHandler = SystemMetaObject.forObject(defaultResultSetHandler);
MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("mappedStatement");
//获取节点属性的集合
List<ResultMap> resultMaps = mappedStatement.getResultMaps();
Configuration configuration = (Configuration)metaStatementHandler.getValue("configuration");
Class<?> resultType = resultMaps.get(0).getType();
//获取mybatis返回的实体类类型名
int resultMapCount = resultMaps.size();
if (resultMapCount > 0) {
Statement statement = (Statement) invocation.getArgs()[0];
ResultSet resultSet = statement.getResultSet();
if (resultSet != null) {
//获得对应列名
ResultSetMetaData rsmd = resultSet.getMetaData();
List<String> columnList = new ArrayList<String>();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
columnList.add(rsmd.getColumnName(i));
}
while (resultSet.next()) {
LinkedHashMap<String, Object> resultMap = new LinkedHashMap<String, Object>();
for (String colName : columnList) {
resultMap.put(colName, resultSet.getString(colName));
//具体些要转换的码值这里就做个演示
if(colName.equals("username")){
resultMap.put(colName, "iui");
}
}
Object o = resultType.newInstance();
//将转换后的map转换为实体类中
BeanUtils.populate(o,resultMap);
resList.add(o); }
return resList;
}
}
return invocation.proceed();
} /**
* //主要是为了把这个拦截器生成一个代理放到拦截器链中
* ^Description包装目标对象 为目标对象创建代理对象
* @Param target为要拦截的对象
* @Return代理对象
*/
public Object plugin(Object target) {
System.out.println("将要包装的目标对象:"+target);
return Plugin.wrap(target,this);
} public void setProperties(Properties properties) { }
}
<plugins>
<plugin interceptor="com.lagou.plugin.MyPlugin"></plugin>
</plugins>
<== Columns: id, username, password, birthday
<== Row: 1, lys, 123, 2019-12-12
<== Row: 2, tom, 1223, 2019-12-12
<== Row: 3, zt, 3211645, 1988-02-01
<== Row: 5, jack, 37652, 1958-05-05
<== Row: 6, jacket, 37652, 2008-05-05
<== Row: 7, jack, 37652, 1958-05-05
<== Total: 6
User{id=1, username='iui', password='123', birthday='2019-12-12'}
User{id=2, username='iui', password='1223', birthday='2019-12-12'}
User{id=3, username='iui', password='3211645', birthday='1988-02-01'}
User{id=5, username='iui', password='37652', birthday='1958-05-05'}
User{id=6, username='iui', password='37652', birthday='2008-05-05'}
User{id=7, username='iui', password='37652', birthday='1958-05-05'}
mybatis拦截器 修改mybatis返回结果集中的字段的值的更多相关文章
- MyBatis拦截器原理探究
MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...
- 【公众号转载】MyBatis拦截器原理探究
MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...
- mybatis拦截器使用
目录 mybatis 拦截器接口Interceptor spring boot + mybatis整合 创建自己的拦截器MyInterceptor @Intercepts注解 mybatis拦截器入门 ...
- mybatis - 基于拦截器修改执行语句中的ResultMap映射关系
拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...
- mybatis - 基于拦截器修改执行中的SQL语句
拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...
- Mybatis拦截器实现分页
本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model&g ...
- 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...
- spring boot 实现mybatis拦截器
spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...
- Mybatis拦截器实现原理深度分析
1.拦截器简介 拦截器可以说使我们平时开发经常用到的技术了,Spring AOP.Mybatis自定义插件原理都是基于拦截器实现的,而拦截器又是以动态代理为基础实现的,每个框架对拦截器的实现不完全相同 ...
随机推荐
- Linux系统安装JDK1.8
2020最新Linux系统发行版ContOS7演示安装JDK. 为防止操作权限不足,建议切换root用户,当然如果你对Linux命令熟悉,能够自主完成权限更新操作,可以不考虑此推荐. 更多命令学习推荐 ...
- 数据结构&算法的引言&时间复杂度
什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已.所谓的计算机科学实际上是对问题.解决问 ...
- centos7虚拟机时间和本地时间相差8小时
安装ntp和ntpdate 在安装centos7虚拟机的时候,已经将时区设置为了Asia/shanghai,但还是出现时间不准,相差了8小时 可以安装ntp和ntpdate,使用 NTP 公共时间服务 ...
- 使用 volatile 关键字保证变量可见性和禁止指令重排序
volatile 概述 volatile 是 Java 提供的一种轻量级的同步机制.相比于传统的 synchronize,虽然 volatile 能实现的同步性要差一些,但开销更低,因为它不会引起频繁 ...
- 高度集成智能家居物联网网关WiFi通信应用的无线路由模块:模小块成长记
大家好,我叫模小块,代号L107模块,出生在BOJINGnet大家庭里,我在物联网网关里不可或缺,或许业内专业人士和物联网工程师知道我的存在.别看我体积小(40mm25mm3mm),贴片式邮票孔接口( ...
- golang xpath解析网页
https://github.com/antchfx/htmlquery package main import ( "fmt" "github.com/antchfx/ ...
- C#一行代码实现(06)跨线程获取控件值,结合BeginInvoke和EndInvoke使用,以DataGridView为例
主要功能 跨线程获取控件值,以DataGridView为例,结合BeginInvoke和EndInvoke使用 一行代码 object cellValue = dataGridView.ExInvok ...
- java面试之手写单例模式
为什么要有单例模式 实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象.缓存.系统全局配置对象等.这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源. 实现单例模式的几个 ...
- VirtualBox 安装Ubuntu(16.04/18.04)时显示不全的解决方法
是是系统分辨率不同导致的问题 Alt+鼠标左键 (16.04版本亲测有效,18.04版本亲测无效)或者Win+鼠标左键 (18.04版本亲测有效)拖动安装界面,即可显示内容.
- Camera2使用textureView支持
SurfaceView 绘制会有独立窗口, TextureView 没有独立的窗口,可以像普通的 View 一样,更高效更方便 public class MainActivity extends Ap ...