首页 > 编程知识 正文

mybatis拦截器原理,批量修改sql语句

时间:2023-05-03 15:24:25 阅读:16355 作者:1225

package org.je ECG.config.my batis; import java.lang.reflect.Field; import java.util.Date; import java.util.Properties; importorg.Apache.ibatis.binding.mapper method.param map; importorg.Apache.ibatis.executor.executor; importorg.Apache.ibatis.mapping.boundsql; importorg.Apache.ibatis.mapping.mapped statement; importorg.Apache.ibatis.mapping.sqlcommand type; importorg.Apache.ibatis.mapping.SQL source; importorg.Apache.ibatis.plugin.interceptor; importorg.Apache.ibatis.plugin.intercepts; importorg.Apache.ibatis.plugin.invocation; importorg.Apache.ibatis.plugin.plugin; importorg.Apache.ibatis.plugin.signature; importorg.Apache.ibatis.reflection.defaultreflectorfactory; importorg.Apache.ibatis.reflection.meta object; importorg.Apache.ibatis.reflection.factory.default object factory; importorg.Apache.ibatis.reflection.wrapper.defaultobjectwrapperfactory; importorg.Apache.Shiro.security utils; importorg.je ECG.com mon.system.VO.loginuser; importorg.je ECG.com mon.util.oconvertutils; importorg.je ECG.modules.system.entity.sysuser; importorg.spring framework.stereotype.com ponent; import lombok.extern.slf4j.slf4j; /** * mybatis是作者、创建日期、修改者、修改日期* @ author Scott * @ date 2019-01-19 * */@ slf4j @ component @ intercepts (@ @ @ @ @ date args={ MappedStatement.class, object.class}} (publicclassmybatisinterceptorimplementsinterceptor (@ overridepublicobjectintercept (invocationinvocator ) ) overrrrided le { mappedstatementmappedstatement=(mapped statement ) invocation.getargs((0) ); string SQL id=mapped statement.getid (; log.debug--------sqlid----'sqlid; sqlcommandtypesqlcommandtype=mapped statement.getsql commandtype (; object parameter=invocation.getargs () [1]; log.debug-------sqlcommand type-------sqlcommand type; //获取查询条件的sqlboundsqlboundsql=mapped statement.getboundsql (parameter ); String sql=boundSql.getSql (; if (参数==null ) {return invocation.proceed ); } if (sqlcommand type.insert==sqlcommand type ) loginuser sysuser=this.get loginuser (; field [ ] fields=oconvertutils.getallfields (parameter ); for(fieldfield3360fields ) log.debug (-------- field.name---- ' field.getname ) ); try{if(createby ).equals(field.getname ) ) field.setaccessible ) ) true; object local _ create by=field.get (参数); IELD.setaccessible(false ); if (本地_createBy == null || local_createBy.equals("")) {if (sysUser != null) {// 登录人账号field.setAccessible(true);field.set(parameter, sysUser.getUsername());field.setAccessible(false);}}}// 注入创建时间if ("createTime".equals(field.getName())) {field.setAccessible(true);Object local_createDate = field.get(parameter);field.setAccessible(false);if (local_createDate == null || local_createDate.equals("")) {field.setAccessible(true);field.set(parameter, new Date());field.setAccessible(false);}}//注入部门编码if ("sysOrgCode".equals(field.getName())) {field.setAccessible(true);Object local_sysOrgCode = field.get(parameter);field.setAccessible(false);if (local_sysOrgCode == null || local_sysOrgCode.equals("")) {// 获取登录用户信息if (sysUser != null) {field.setAccessible(true);field.set(parameter, sysUser.getOrgCode());field.setAccessible(false);}}}} catch (Exception e) {}}}if (SqlCommandType.UPDATE == sqlCommandType) {LoginUser sysUser = this.getLoginUser();Field[] fields = null;if (parameter instanceof ParamMap) {ParamMap<?> p = (ParamMap<?>) parameter;//update-begin-author:scott date:20190729 for:批量更新报错issues/IZA3Q--if (p.containsKey("et")) {parameter = p.get("et");} else {parameter = p.get("param1");}//update-end-author:scott date:20190729 for:批量更新报错issues/IZA3Q-//update-begin-author:scott date:20190729 for:更新指定字段时报错 issues/#516-if (parameter == null) {return invocation.proceed();}//update-end-author:scott date:20190729 for:更新指定字段时报错 issues/#516-fields = oConvertUtils.getAllFields(parameter);} else {fields = oConvertUtils.getAllFields(parameter);}for (Field field : fields) {log.debug("------field.name------" + field.getName());try {if ("updateBy".equals(field.getName())) {//获取登录用户信息if (sysUser != null) {// 登录账号field.setAccessible(true);field.set(parameter, sysUser.getUsername());field.setAccessible(false);}}if ("updateTime".equals(field.getName())) {field.setAccessible(true);field.set(parameter, new Date());field.setAccessible(false);}} catch (Exception e) {e.printStackTrace();}}} //添加过滤条件if(sqlCommandType.SELECT == sqlCommandType){final Object[] args = invocation.getArgs();MappedStatement newStatement = newMappedStatement(mappedStatement, new BoundSqlSqlSource(boundSql));MetaObject msObject = MetaObject.forObject(newStatement, new DefaultObjectFactory(), new DefaultObjectWrapperFactory(),new DefaultReflectorFactory());msObject.setValue("sqlSource.boundSql.sql", sql+"所要添加的查询条件");args[0] = newStatement;}return invocation.proceed();}private MappedStatement newMappedStatement(MappedStatement ms, SqlSource newSqlSource) {MappedStatement.Builder builder =new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());builder.resource(ms.getResource());builder.fetchSize(ms.getFetchSize());builder.statementType(ms.getStatementType());builder.keyGenerator(ms.getKeyGenerator());if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) {StringBuilder keyProperties = new StringBuilder();for (String keyProperty : ms.getKeyProperties()) {keyProperties.append(keyProperty).append(",");}keyProperties.delete(keyProperties.length() - 1, keyProperties.length());builder.keyProperty(keyProperties.toString());}builder.timeout(ms.getTimeout());builder.parameterMap(ms.getParameterMap());builder.resultMaps(ms.getResultMaps());builder.resultSetType(ms.getResultSetType());builder.cache(ms.getCache());builder.flushCacheRequired(ms.isFlushCacheRequired());builder.useCache(ms.isUseCache());return builder.build();}// 定义一个内部辅助类,作用是包装sqclass BoundSqlSqlSource implements SqlSource {private BoundSql boundSql;public BoundSqlSqlSource(BoundSql boundSql) {this.boundSql = boundSql;}@Overridepublic BoundSql getBoundSql(Object parameterObject) {return boundSql;}}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {// TODO Auto-generated method stub}//update-begin--Author:scott Date:20191213 for:关于使用Quzrtz 开启线程任务, #465private LoginUser getLoginUser() {LoginUser sysUser = null;try {sysUser = SecurityUtils.getSubject().getPrincipal() != null ? (LoginUser) SecurityUtils.getSubject().getPrincipal() : null;} catch (Exception e) {//e.printStackTrace();sysUser = null;}return sysUser;}//update-end--Author:scott Date:20191213 for:关于使用Quzrtz 开启线程任务, #465}

其中修改sql的部分需要参考mybatis收藏夹里限制limit那个博文里sql的拼装方法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。