| | |
| | | package com.dy.common.mybatis; |
| | | |
| | | |
| | | import com.dy.common.po.BaseEntity; |
| | | import com.dy.common.util.IDLongGenerator; |
| | | 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; |
| | | import org.apache.ibatis.plugin.*; |
| | | |
| | | import java.lang.reflect.Method; |
| | | |
| | |
| | | |
| | | static int MAPPED_STATEMENT_INDEX = 0; |
| | | static int PARAMETER_INDEX = 1; |
| | | static int ROWBOUNDS_INDEX = 2; |
| | | static int RESULT_HANDLER_INDEX = 3; |
| | | static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME = "setId"; |
| | | static String BASE_FIELD_SET_CREATE_TIME_FUNTION_NAME = "setCreateDt"; |
| | | static String BASE_FIELD_SET_UPDATE_TIME_FUNTION_NAME = "setUpdateDt"; |
| | | static String BASE_FIELD_SET_DELETE_FUNTION_NAME = "setDelete"; |
| | | static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETID = "setId"; |
| | | static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETUSERID = "setUserId"; |
| | | static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETROLEID = "setRoleId"; |
| | | |
| | | public AutoGenerateIdInterceptor() { |
| | | //System.out.println("auto generate primaryKey mybatis plugin start!!!"); |
| | | } |
| | | |
| | | @SuppressWarnings("static-access") |
| | | /** |
| | | * 拦截逻辑实现 |
| | | * @param invocation 代理 |
| | | * @return Object |
| | | * @throws Throwable 异常 |
| | | */ |
| | | public Object intercept(Invocation invocation) throws Throwable { |
| | | MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[MAPPED_STATEMENT_INDEX]; |
| | | SqlCommandType commandType = mappedStatement.getSqlCommandType(); |
| | | if (commandType.INSERT.equals(SqlCommandType.INSERT)) { |
| | | if (commandType.equals(SqlCommandType.INSERT)) { |
| | | Object entity = invocation.getArgs()[PARAMETER_INDEX]; |
| | | if (entity instanceof BaseEntity) { |
| | | Class<? extends Object> entityClass = entity.getClass(); |
| | | Method setMt = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME, Long.class) ; |
| | | if(setMt != null){ |
| | | setMt.invoke(entity, new IDLongGenerator().generate()); |
| | | //Class<? extends Object> entityClass = entity.getClass(); |
| | | Class<?> entityClass = entity.getClass(); |
| | | Method setId = null ; |
| | | Method setUserId = null ; |
| | | Method setRoleId = null ; |
| | | try{ |
| | | /* |
| | | // 添加用户时userId为自动生成主键。roleId存在时是为用户绑角色 |
| | | String jsonString = JSONObject.toJSONString(entity, JSONWriter.Feature.WriteMapNullValue); |
| | | JSONObject jsonObject = JSONObject.parseObject(jsonString); |
| | | if(jsonObject.containsKey("userId") && !jsonObject.containsKey("roleId")) { |
| | | setUserId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETUSERID, Long.class) ; |
| | | setRoleId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETROLEID, Long.class) ; |
| | | }else { |
| | | //有一些实体没有id,例如中间表 |
| | | setId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETID, Long.class) ; |
| | | } |
| | | */ |
| | | //有一些实体没有id,例如中间表 |
| | | setId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETID, Long.class) ; |
| | | // BaUser实体中是setUserId, BaUserRole实体中包含setUserId,和setRoleId |
| | | setUserId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETUSERID, Long.class) ; |
| | | setRoleId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETROLEID, Long.class) ; |
| | | }catch (Exception e){ |
| | | //当entityClass没有setId方法时,会抛出异常 |
| | | } |
| | | if(setUserId != null && setRoleId == null){ |
| | | setUserId.invoke(entity, new IDLongGenerator().generate()); |
| | | }else if(setId != null){ |
| | | setId.invoke(entity, new IDLongGenerator().generate()); |
| | | } |
| | | invocation.getArgs()[PARAMETER_INDEX] = entity; |
| | | } |