我用过两次,

1.一次是数据库以前数据可以为null,现在不想为null,然后不想改代码,所以在插入或修改数据的时候,查一次,把为null的数据变一下,字符串变“”,数字变0或-1

下面的就是设置监听

方法EntityInterceptor.java

package com.banksteel.erp.pfpurchase.util;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.*;

import org.apache.ibatis.executor.Executor;

import org.apache.ibatis.mapping.MappedStatement;

import org.apache.ibatis.mapping.SqlCommandType;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

/**

*

* @description: 防止插入出现null

* @projectName:finance-inventorybook-service

* @author:

* @createTime:2017年11月30日 上午9:37:30

*/

@Intercepts(value =

{ @Signature(type = Executor.class, method = "update", args =

{ MappedStatement.class, Object.class }) })

public class EntityInterceptor implements Interceptor

{

@Override

public Object intercept(Invocation invocation) throws Throwable

{

final Object[] args = invocation.getArgs();

MappedStatement ms = (MappedStatement) args[0];

Object obj = args[1];

// 插入时初始化为null的字段

if (SqlCommandType.INSERT == ms.getSqlCommandType())

{

if (obj instanceof List>)

{

List> list = (List>) obj;

for (Object item : list)

{

null2default(item);

}

} else

{

null2default(obj);

}

}

return invocation.proceed();

}

@Override

public Object plugin(Object target)

{

return Plugin.wrap(target, this);

}

@Override

public void setProperties(Properties properties)

{

}

/**

*

* @description: 将实体类的属性由null设置为默认值,这里没有变数字的,只变了字符串

* @param obj

* @author:

* @createTime:2017年11月2日 下午5:19:56

*/

public static void null2default(T obj)

{

if (null == obj)

{

return;

}

Method[] methods=obj.getClass().getMethods();

Map setMethodMap = new HashMap<>();

for (Method method : methods){

if(method.getName().startsWith("set")){

setMethodMap.put(method.getName(),method);

}

}

for (Method method : methods){

if((method.getName().length() < 3) || (!method.getName().startsWith("get"))){

//只调用get函数

continue;

}

//排除带有参数列表的方法

Class>[] pts =method.getParameterTypes();

if(null != pts && 0 < pts.length){

continue;

}

//排除值不为null的get方法

try {

if(null != method.invoke(obj)){

continue;

}

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

//找出get方法对应的set方法

char[] cs = method.getName().toCharArray();

cs[0] = 's';

Method setMethod = setMethodMap.get(String.valueOf(cs));

if(null == setMethod){

continue;

}

//设置默认值

Class> retClazz = method.getReturnType();

try {

if(Objects.equals(retClazz,String.class)){

setMethod.invoke(obj, "");

}

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

setMethodMap.clear();

}

// public static void main(String args[]){

// ResourceAuditInfo ra = new ResourceAuditInfo();

// null2default(ra);

// System.out.println(JSONObject.toJSONString(ra));

// }

}

2.如果不是用上面的分页,就用另一种监听

class="com.banksteel.openerp.commons.interceptor.RebuildSqlInterceptor" />

Rexxx.java,这里可以查找到要修改的sql或查询的条件,再这里都可以修改

package com.banksteel.openerp.commons.interceptor;

import java.sql.Connection;

import java.util.List;

import java.util.Properties;

import org.apache.ibatis.executor.statement.StatementHandler;

import org.apache.ibatis.mapping.BoundSql;

import org.apache.ibatis.mapping.MappedStatement;

import org.apache.ibatis.mapping.ParameterMapping;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.plugin.Intercepts;

import org.apache.ibatis.plugin.Invocation;

import org.apache.ibatis.plugin.Plugin;

import org.apache.ibatis.plugin.Signature;

import org.apache.ibatis.reflection.MetaObject;

import org.apache.ibatis.reflection.SystemMetaObject;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.banksteel.openerp.commons.filter.SaasParameter;

import com.banksteel.openerp.commons.utils.RebuildSqlUtils;

import cn.mysteel.util.StringUtils;

/**

* 重建SQL语句拦截器

*

* @author KangJian

*

*/

// MyBatis中Statement语句是通过RoutingStatementHandler对象的 prepare方法生成的,注解声明拦截此方法

@Intercepts({ @Signature(method = "prepare", type = StatementHandler.class, args = { Connection.class }) })

public class RebuildSqlInterceptor implements Interceptor {

static Logger logger = LoggerFactory.getLogger(RebuildSqlInterceptor.class);

public Object intercept(Invocation invocation) throws Throwable {

// long start = System.currentTimeMillis();

StatementHandler statementHandler = (StatementHandler) invocation.getTarget();

// 创建反射工具类,用于获取和设置SQL语句

MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);

// 获取拦截的SQL语句

MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");

BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");

// 获取本地线程变量

Long memberId = 0L;

try {

if (StringUtils.isNotEmpty(SaasParameter.getMemberId())) {

memberId = Long.parseLong(SaasParameter.getMemberId());

}

} catch (Exception e) {

logger.error("【noSaas拦截构建】会员ID转换异常,id=" + memberId, e);

}

if (!mappedStatement.getId().endsWith("noSaas")) {

// 当statement的id不以noSaas结尾,且memberId>0,则执行对INSERT与SELECT语句的重构

if ("SELECT".equals(mappedStatement.getSqlCommandType().toString()) && memberId > 0) {

List parameterMappings = boundSql.getParameterMappings();

metaStatementHandler.setValue("delegate.boundSql.sql", RebuildSqlUtils.rebuildQuery(boundSql.getSql(),

SaasParameter.getMemberId(), parameterMappings));

} else if ("INSERT".equals(mappedStatement.getSqlCommandType().toString()) && memberId > 0) {

metaStatementHandler.setValue("delegate.boundSql.sql",

RebuildSqlUtils.rebuildInsert(boundSql.getSql(), SaasParameter.getMemberId()));

}

} else {

// 当statement的id以noSaas结尾,为语句添加memberId额外参数

if ("SELECT".equals(mappedStatement.getSqlCommandType().toString())

|| "INSERT".equals(mappedStatement.getSqlCommandType().toString())) {

boundSql.setAdditionalParameter("memberId", memberId);

metaStatementHandler.setValue("delegate.boundSql", boundSql);

}

}

Object result = invocation.proceed();

// System.out.println("拦截耗时:" + (System.currentTimeMillis() - start));

return result;

}

public Object plugin(Object target) {

// 当目标类是StatementHandler类型时,才包装目标类,否者直接返回目标本身,减少目标被代理的次数

if (target instanceof StatementHandler) {

return Plugin.wrap(target, this);

} else {

return target;

}

}

public void setProperties(Properties properties) {

}

}

spring配置与监听mysql_spring boot (8)mybatis配置监听,相关推荐

  1. 【spring boot】 mybatis配置双数据源/多数据源

    前言 spring boot 2.0.0.RELEASE maven 3.5 eclipse 4.9.0 mybatis 1.3.2 mybatis generator 1.3.2 pagehelpe ...

  2. spring c3p0 mysql_spring boot整合mybatis使用c3p0数据源连接mysql

    刚刚接触springboot,对很多东西都不熟悉,例如,它的注解方式,他的配置方式等:听说它很牛逼,所以就尝试着去学习.在基本熟悉springboot的第一个程序之后.想到当时spring整合myba ...

  3. spring boot+kafka+canal实现监听MySQL数据库

    spring boot+kafka+canal实现监听MySQL数据库 一.zookeeper安装 kafka依赖于zookeeper,安装kafka前先安装zookeeper 下载地址:Apache ...

  4. 具有Spring Boot和Java配置的Spring Batch教程

    我一直在努力将Podcastpedia.org的一些批处理作业迁移到Spring Batch. 以前,这些工作是以我自己的方式开发的,我认为现在是时候使用一种更"标准化"的方法了. ...

  5. spring cloud ,spring boot application.properties 配置属性列表

    #横幅 banner.charset = UTF-8#横幅文件编码. banner.location = classpath:banner.txt#横幅文件位置. banner.image.locat ...

  6. Spring Boot之自动配置

    1.原理 (1).SpringBoot启动的时候会加载主配置类,主配置类中已经开启了自动配置功能**@SpringBootApplication注解中包含了@EnableAutoConfigurati ...

  7. Spring Boot 集成 Apollo 配置中心,真香、真强大!

    作者:超级小豆丁 来源:http://www.mydlq.club/article/42/ 由于 Apollo 概念比较多,刚开始使用比较复杂,最好先过一遍概念再动手实践尝试使用. 1.背景 随着程序 ...

  8. 企业分布式微服务云SpringCloud SpringBoot mybatis (九)Spring Boot多数据源配置与使用(JdbcTemplate支持)...

    之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...

  9. spring boot多数据源配置(mysql,redis,mongodb)实战

    使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...

最新文章

  1. 【C/C++】计时函数比较
  2. numpy数组统计函数amin() amax()
  3. android app功能 配置,配置安装时分发  |  Android 开发者  |  Android Developers
  4. C++ 在线编译器(支持 C++11)
  5. Linux dig
  6. 云炬Qtpy5开发与实战笔记 1开发第一个桌面应用Hello World
  7. Unix系统编程()main函数的命令行参数
  8. 如何使用ping命令检查网络故障
  9. 华北计算机研究所分房,请教公安部第一研究所这样分房合理吗??
  10. 收获,不止SQL优化——抓住SQL的本质--第二章
  11. 深入解析:DBA_OBJECTS中的OBJECT_ID与DATA_OBJECT_ID的区别
  12. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (3) - 流水线概述
  13. delphi 文字 动画 特效 控件_设计师的特效让程序员追砍3条街,220集AE软件教学视频,教他做人...
  14. php 2m限制,取消php上传2M的限制
  15. 机器学习笔记——14 矩阵谱分解与奇异值分解及其背后的线性算子理论 (实战项目:利用SVD进行图像压缩)
  16. 【云原生之Docker实战】使用Docker部署BookStack文档管理系统
  17. Adobe reader update 无法将数值disableexceptionchainvaliddation写入键/sofeware...请验证您对该有足够
  18. 阿里大于短信发送调用
  19. 自由职业的 6 条建议
  20. 贝壳一键还原1.0 使用详解

热门文章

  1. 微信提示:绑定非国内手机号的账户将迁移至 Wechat,或者换绑手机号
  2. 【问题记录】怎么用python读取CIFAR10数据集?
  3. 最有范儿的H5制作工具—应用之星之表单控件详解
  4. Premiere Pro 2022离线语音转文本教程
  5. 简单记录双系统安装Ububtu22.04
  6. Pytorch中的dataset类——创建适应任意模型的数据集接口
  7. javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)
  8. 《大话脑成像》之Linux基础命令
  9. Windows 2000 单词表
  10. 15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影