spring配置与监听mysql_spring boot (8)mybatis配置监听,
我用过两次,
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配置监听,相关推荐
- 【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 ...
- spring c3p0 mysql_spring boot整合mybatis使用c3p0数据源连接mysql
刚刚接触springboot,对很多东西都不熟悉,例如,它的注解方式,他的配置方式等:听说它很牛逼,所以就尝试着去学习.在基本熟悉springboot的第一个程序之后.想到当时spring整合myba ...
- spring boot+kafka+canal实现监听MySQL数据库
spring boot+kafka+canal实现监听MySQL数据库 一.zookeeper安装 kafka依赖于zookeeper,安装kafka前先安装zookeeper 下载地址:Apache ...
- 具有Spring Boot和Java配置的Spring Batch教程
我一直在努力将Podcastpedia.org的一些批处理作业迁移到Spring Batch. 以前,这些工作是以我自己的方式开发的,我认为现在是时候使用一种更"标准化"的方法了. ...
- spring cloud ,spring boot application.properties 配置属性列表
#横幅 banner.charset = UTF-8#横幅文件编码. banner.location = classpath:banner.txt#横幅文件位置. banner.image.locat ...
- Spring Boot之自动配置
1.原理 (1).SpringBoot启动的时候会加载主配置类,主配置类中已经开启了自动配置功能**@SpringBootApplication注解中包含了@EnableAutoConfigurati ...
- Spring Boot 集成 Apollo 配置中心,真香、真强大!
作者:超级小豆丁 来源:http://www.mydlq.club/article/42/ 由于 Apollo 概念比较多,刚开始使用比较复杂,最好先过一遍概念再动手实践尝试使用. 1.背景 随着程序 ...
- 企业分布式微服务云SpringCloud SpringBoot mybatis (九)Spring Boot多数据源配置与使用(JdbcTemplate支持)...
之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...
- spring boot多数据源配置(mysql,redis,mongodb)实战
使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...
最新文章
- 【C/C++】计时函数比较
- numpy数组统计函数amin() amax()
- android app功能 配置,配置安装时分发 | Android 开发者 | Android Developers
- C++ 在线编译器(支持 C++11)
- Linux dig
- 云炬Qtpy5开发与实战笔记 1开发第一个桌面应用Hello World
- Unix系统编程()main函数的命令行参数
- 如何使用ping命令检查网络故障
- 华北计算机研究所分房,请教公安部第一研究所这样分房合理吗??
- 收获,不止SQL优化——抓住SQL的本质--第二章
- 深入解析:DBA_OBJECTS中的OBJECT_ID与DATA_OBJECT_ID的区别
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (3) - 流水线概述
- delphi 文字 动画 特效 控件_设计师的特效让程序员追砍3条街,220集AE软件教学视频,教他做人...
- php 2m限制,取消php上传2M的限制
- 机器学习笔记——14 矩阵谱分解与奇异值分解及其背后的线性算子理论 (实战项目:利用SVD进行图像压缩)
- 【云原生之Docker实战】使用Docker部署BookStack文档管理系统
- Adobe reader update 无法将数值disableexceptionchainvaliddation写入键/sofeware...请验证您对该有足够
- 阿里大于短信发送调用
- 自由职业的 6 条建议
- 贝壳一键还原1.0 使用详解
热门文章
- 微信提示:绑定非国内手机号的账户将迁移至 Wechat,或者换绑手机号
- 【问题记录】怎么用python读取CIFAR10数据集?
- 最有范儿的H5制作工具—应用之星之表单控件详解
- Premiere Pro 2022离线语音转文本教程
- 简单记录双系统安装Ububtu22.04
- Pytorch中的dataset类——创建适应任意模型的数据集接口
- javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)
- 《大话脑成像》之Linux基础命令
- Windows 2000 单词表
- 15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影