1.spring 配置:
<bean id="superMapperProxy" class="com.qws.v1.daoImpl.MapperProxy">
<property name="mapperPackagePrifix" value="com.qws.v1.mapper."></property>
</bean>
1 package com.qsw.v1.daoImpl; 2 3 import java.lang.reflect.Method; 4 import java.util.ArrayList; 5 import java.util.Arrays; 6 import java.util.List; 7 import java.util.concurrent.TimeUnit; 8 9 import org.apache.ibatis.annotations.Param; 10 import org.springframework.beans.BeansException; 11 import org.springframework.context.ApplicationContext; 12 import org.springframework.context.ApplicationContextAware; 13 import org.springframework.data.redis.core.RedisTemplate; 14 import org.springframework.data.redis.core.ValueOperations; 15 16 import com.qsw.v1.util.BaseClass; 17 18 /** 19 * mapper proxy,结合pageHelper+MyBatisGenerator简直所向无敌 20 * 后期将加入redis缓存功能,结合nginx转发组成高并发后端 21 * @author Administrator 22 * 23 */ 24 public class MapperProxy extends BaseClass implements ApplicationContextAware { 25 26 /************************************** 代理方法名 start ***************************************/ 27 public static final String COUNT_BY_EXAMPLE_METHOD_NAME = "countByExample"; 28 public static final String DELETE_BY_EXAMPLE_METHOD_NAME = "deleteByExample"; 29 public static final String DELETE_BY_PRIMARY_KEY_METHOD_NAME = "deleteByPrimaryKey"; 30 public static final String INSERT_METHOD_NAME = "insert"; 31 public static final String INSERT_SELECTIVE_METHOD_NAME = "insertSelective"; 32 public static final String SELECT_BY_EXAMPLE_METHOD_NAME = "selectByExample"; 33 public static final String SELECT_BY_PRIMARY_KEY_METHOD_NAME = "selectByPrimaryKey"; 34 public static final String UPDATE_BY_EXAMPLE_SELECTIVE_METHOD_NAME = "updateByExampleSelective"; 35 public static final String UPDATE_BY_EXAMPLE_METHOD_NAME = "updateByExample"; 36 public static final String UPDATE_BY_PRIMARYKEY_SELECTIVE_METHOD_NAME = "updateByPrimaryKeySelective"; 37 public static final String UPDATE_BY_PRIMARYKEY_METHOD_NAME = "updateByPrimaryKey"; 38 /************************************** 代理方法名 end ***************************************/ 39 40 /** 41 * mapper所在包的前缀 42 */ 43 private String mapperPackagePrifix; 44 45 /** 46 * application 实例 47 */ 48 private ApplicationContext ctx; 49 50 public void setMapperPackagePrifix(String name) { 51 this.mapperPackagePrifix = name; 52 } 53 54 /** 55 * 根据一个对象查找Mapper,对象要么是实体类,要么是example 56 * @param obj 57 * @return 58 */ 59 public Object findMapper(Object obj) { 60 try { 61 if (obj == null) { 62 logger.warn("the param obj instance can not be null !"); 63 return null; 64 } 65 Class<?> clazz = obj.getClass(); 66 String name = clazz.getSimpleName(); 67 String mapperClassName = ""; 68 if (name.endsWith("Example")) { 69 int index = name.indexOf("Example"); 70 mapperClassName = mapperPackagePrifix + name.substring(0, index) + "Mapper"; 71 } else { 72 mapperClassName = mapperPackagePrifix + name + "Mapper"; 73 } 74 logger.debug("mapper class name is :" + mapperClassName ); 75 Class<?> mapperClazz = Class.forName(mapperClassName); 76 logger.debug("mapper is found :" + mapperClazz ); 77 return ctx.getBean(mapperClazz); 78 } catch (Exception e) { 79 logger.error("find mapper failed : " + e.getMessage()); 80 } 81 return null; 82 } 83 84 /** 85 * 查找方法 86 * @param obj 87 * @return 88 */ 89 public Method findMethod(Object mapper, String methodName, Object... parameters) { 90 try { 91 if (mapper == null) { 92 logger.warn("the mapper can not be null ! "); 93 } 94 Class<?> clazz = mapper.getClass(); 95 Class<?>[] clazzArray = new Class[parameters.length]; 96 for (int i = 0; i < parameters.length; i++) { 97 if (parameters[i] == null) { 98 continue; 99 } 100 clazzArray[i] = parameters[i].getClass(); 101 } 102 logger.debug("the clazz array is " + Arrays.toString(clazzArray)); 103 return clazz.getDeclaredMethod(methodName, clazzArray); 104 } catch (Exception e) { 105 logger.error(" find method : " + methodName + " is error," + e.getMessage()); 106 } 107 return null; 108 } 109 110 /** 111 * 查询数量 112 * 113 * @param example 114 * @return 115 */ 116 public int countByExample(Object example) { 117 try { 118 if (example == null) { 119 logger.warn("countByExample failed,the example can not be null !"); 120 return -1; 121 } 122 123 Object mapper = findMapper(example); 124 logger.debug("mapper instance found for " + mapper.getClass()); 125 126 Method method = findMethod(mapper, COUNT_BY_EXAMPLE_METHOD_NAME, example); 127 logger.debug("mapper instance found for " + mapper.getClass()); 128 129 return (int) method.invoke(mapper, example); 130 } catch (Exception e) { 131 logger.error("countByExample failed, " + e.getMessage() ); 132 } 133 return -1; 134 } 135 136 /** 137 * 代理方法 138 * @param example 139 * @return 140 */ 141 public int deleteByExample(Object example) { 142 try { 143 if (example == null) { 144 logger.warn("deleteByExample failed,the example can not be null !"); 145 return -1; 146 } 147 148 Object mapper = findMapper(example); 149 logger.debug("mapper instance found for " + mapper.getClass()); 150 151 Method method = findMethod(mapper, DELETE_BY_EXAMPLE_METHOD_NAME, example); 152 logger.debug("mapper instance found for " + mapper.getClass()); 153 154 return (int) method.invoke(mapper, example); 155 } catch (Exception e) { 156 logger.error("deleteByExample failed, " + e.getMessage() ); 157 } 158 return -1; 159 } 160 161 /** 162 * 代理方法 163 * @param id 164 * @param beanClazz 165 * @return 166 */ 167 public int deleteByPrimaryKey(Object id, Class<?> beanClazz) { 168 String mapperClassName = ""; 169 try { 170 if (id == null) { 171 logger.warn("deleteByPrimaryKey failed,the id can not be null !"); 172 return -1; 173 } 174 175 if (beanClazz == null) { 176 logger.warn("deleteByPrimaryKey failed,the beanClazz can not be null !"); 177 return -1; 178 } 179 180 mapperClassName = mapperPackagePrifix + beanClazz.getSimpleName() + "Mapper"; 181 Class<?> clazz = Class.forName(mapperClassName); 182 logger.debug("Mapper class found for " + mapperClassName); 183 184 Object mapper = ctx.getBean(mapperClassName); 185 logger.debug("mapper instance found for " + mapper.getClass()); 186 187 Method method = clazz.getMethod(DELETE_BY_PRIMARY_KEY_METHOD_NAME, id.getClass()); 188 logger.debug("mapper instance found for " + mapper.getClass()); 189 190 return (int) method.invoke(mapper, id); 191 } catch (Exception e) { 192 logger.error("deleteByPrimaryKey failed, " + e.getMessage() ); 193 } 194 return -1; 195 } 196 197 /** 198 * 代理方法 199 * @param record 200 * @return 201 */ 202 public int insert(Object record) { 203 try { 204 if (record == null) { 205 logger.warn("insert faild,the object can not be null !"); 206 return -1; 207 } 208 209 Object mapper = findMapper(record); 210 logger.debug("mapper instance found for " + mapper.getClass()); 211 212 Method insertMethod = findMethod(mapper, INSERT_METHOD_NAME, record); 213 logger.debug("method found in " + mapper.getClass()); 214 215 if (insertMethod == null) { 216 logger.warn("insert faild,the method dose not exits !"); 217 return -1; 218 } 219 220 Object value = insertMethod.invoke(mapper, record); 221 logger.info("insert success,the return value is: " + value ); 222 ValueOperations<String, Object> values = ctx.getBean(RedisTemplate.class).opsForValue(); 223 List<Object> lst=(List<Object>) values.get("INSERT_LIST"); 224 if (lst==null) { 225 lst=new ArrayList<Object>(); 226 } 227 values.set("INSERT_LIST", lst, 3, TimeUnit.DAYS); 228 return (int) value; 229 } catch (Exception e) { 230 logger.error("insert faild," + e.getMessage() ); 231 } 232 return -1; 233 } 234 235 /** 236 * 代理方法 237 * @param record 238 * @return 239 */ 240 public int insertSelective(Object record) { 241 242 try { 243 if (record == null) { 244 logger.warn("insertSelective faild,the object can not be null !"); 245 return -1; 246 } 247 248 Object mapper = findMapper(record); 249 logger.debug("mapper instance found for " + mapper.getClass()); 250 251 Method insertMethod = findMethod(mapper, INSERT_SELECTIVE_METHOD_NAME, record); 252 logger.debug("method found in " + mapper.getClass()); 253 254 if (insertMethod == null) { 255 logger.warn("insertSelective faild,the method dose not exits !"); 256 return -1; 257 } 258 259 Object value = insertMethod.invoke(mapper, record); 260 ValueOperations<String, Object> values = ctx.getBean(RedisTemplate.class).opsForValue(); 261 List<Object> lst=(List<Object>) values.get(record.getClass().getSimpleName()+"_List"); 262 if (lst==null) { 263 lst=new ArrayList<Object>(); 264 } 265 values.set(record.getClass().getSimpleName()+"_List", lst, 3, TimeUnit.DAYS); 266 logger.info("insertSelective success,the return value is: " + value ); 267 return (int) value; 268 } catch (Exception e) { 269 e.printStackTrace(); 270 logger.error("insertSelective faild," + e.getMessage() ); 271 } 272 return -1; 273 } 274 275 /** 276 * 代理方法 277 * @param example 278 * @return 279 */ 280 public List<?> selectByExample(Object example) { 281 try { 282 if (example == null) { 283 logger.warn("selectByExample failed,the example can not be null !"); 284 return null; 285 } 286 287 Object mapper = findMapper(example); 288 logger.debug("mapper instance found for " + mapper.getClass()); 289 290 Method method = findMethod(mapper, SELECT_BY_EXAMPLE_METHOD_NAME, example); 291 logger.debug("mapper instance found for " + mapper.getClass()); 292 293 return (List<?>) method.invoke(mapper, example); 294 } catch (Exception e) { 295 logger.error("deleteByExample failed, " + e.getMessage() ); 296 } 297 return null; 298 } 299 300 /** 301 * 代理方法,代理原selectByPrimaryKey方法,由于原方法只需要主键,此处无法只需要一个主键,故加入一个Type 302 * @param id 303 * @param clazz 304 * @return 305 */ 306 @SuppressWarnings("unchecked") 307 public <T> T selectByPrimaryKey(Object id, Class<T> clazz) { 308 String mapperClassName = ""; 309 try { 310 if (id == null) { 311 logger.warn("selectByPrimaryKey failed,the id can not be null !"); 312 return null; 313 } 314 315 if (clazz == null) { 316 logger.warn("selectByPrimaryKey failed,the param clazz can not be null !"); 317 return null; 318 } 319 mapperClassName = mapperPackagePrifix + clazz.getSimpleName() + "Mapper"; 320 Class<?> clazzMapper = Class.forName(mapperClassName); 321 logger.debug("Mapper class found for " + mapperClassName); 322 323 Object mapper = ctx.getBean(clazzMapper); 324 logger.debug("mapper instance found for " + mapper.getClass()); 325 326 Method method = clazzMapper.getMethod(SELECT_BY_PRIMARY_KEY_METHOD_NAME, id.getClass()); 327 logger.debug("mapper instance found for " + mapper.getClass()); 328 329 return (T) method.invoke(mapper, id); 330 } catch (Exception e) { 331 logger.error("selectByPrimaryKey failed, " + e.getMessage() ); 332 } 333 return null; 334 } 335 336 /** 337 * 代理方法 338 * @param record 339 * @param example 340 * @return 341 */ 342 public int updateByExampleSelective(@Param("record") Object record, @Param("example") Object example) { 343 344 try { 345 if (record == null) { 346 logger.warn("updateByExampleSelective faild,the object can not be null !"); 347 return -1; 348 } 349 350 Object mapper = findMapper(record); 351 logger.debug("mapper instance found for " + mapper.getClass()); 352 353 Method updateByExampleSelectiveMethod = findMethod(mapper, UPDATE_BY_EXAMPLE_SELECTIVE_METHOD_NAME, record, 354 example); 355 logger.debug("method found in " + mapper.getClass()); 356 357 if (updateByExampleSelectiveMethod == null) { 358 logger.warn("updateByExampleSelectiveMethod faild,the method dose not exits !"); 359 return -1; 360 } 361 362 Object value = updateByExampleSelectiveMethod.invoke(mapper, record, example); 363 logger.debug("updateByExampleSelective success,the return value is: " + value ); 364 return (int) value; 365 } catch (Exception e) { 366 logger.error("updateByExampleSelective faild," + e.getMessage() ); 367 } 368 return -1; 369 } 370 371 /** 372 * 代理方法 373 * @param record 374 * @param example 375 * @return 376 */ 377 public int updateByExample(@Param("record") Object record, @Param("example") Object example) { 378 379 try { 380 if (record == null) { 381 logger.warn("updateByExample faild,the record can not be null !"); 382 return -1; 383 } 384 if (example == null) { 385 logger.warn("updateByExample faild,the example can not be null !"); 386 return -1; 387 } 388 389 Object mapper = findMapper(record); 390 logger.debug("mapper instance found for " + mapper.getClass()); 391 392 Method updateByExampleSelectiveMethod = findMethod(mapper, UPDATE_BY_EXAMPLE_METHOD_NAME, record, example); 393 logger.debug("method found in " + mapper.getClass()); 394 395 if (updateByExampleSelectiveMethod == null) { 396 logger.warn("updateByExample faild,the method dose not exits !"); 397 return -1; 398 } 399 400 Object value = updateByExampleSelectiveMethod.invoke(mapper, record, example); 401 logger.debug("updateByExample success,the return value is: " + value ); 402 return (int) value; 403 } catch (Exception e) { 404 logger.error("updateByExample faild," + e.getMessage() ); 405 } 406 return -1; 407 } 408 409 /** 410 * 代理方法 411 * @param record 412 * @return 413 */ 414 public int updateByPrimaryKeySelective(Object record) { 415 416 try { 417 if (record == null) { 418 logger.warn("updateByPrimaryKeySelective faild,the object can not be null !"); 419 return -1; 420 } 421 422 423 Object mapper =findMapper(record); 424 logger.debug("mapper instance found for " + mapper.getClass()); 425 426 Method updateByExampleSelectiveMethod = findMethod(mapper,UPDATE_BY_PRIMARYKEY_SELECTIVE_METHOD_NAME, record); 427 logger.debug("method found in " + mapper.getClass()); 428 429 if (updateByExampleSelectiveMethod == null) { 430 logger.warn("updateByExampleSelectiveMethod faild,the method dose not exits !"); 431 return -1; 432 } 433 434 Object value = updateByExampleSelectiveMethod.invoke(mapper, record); 435 logger.info("updateByExampleSelectiveMethod success,the return value is: " + value ); 436 return (int) value; 437 } catch (Exception e) { 438 logger.error("updateByExampleSelectiveMethod faild," + e.getMessage() ); 439 } 440 return -1; 441 } 442 443 /** 444 * 代理方法 445 * @param record 446 * @return 447 */ 448 public int updateByPrimaryKey(Object record) { 449 450 try { 451 if (record == null) { 452 logger.warn("updateByPrimaryKey faild,the object can not be null !"); 453 return -1; 454 } 455 456 Object mapper = findMapper(record); 457 logger.debug("mapper instance found for " + mapper.getClass()); 458 459 Method updateByExampleSelectiveMethod =findMethod(mapper,UPDATE_BY_PRIMARYKEY_METHOD_NAME, record); 460 logger.debug("method found in " + mapper.getClass()); 461 462 if (updateByExampleSelectiveMethod == null) { 463 logger.warn("updateByPrimaryKey faild,the method dose not exits !"); 464 return -1; 465 } 466 467 Object value = updateByExampleSelectiveMethod.invoke(mapper, record); 468 logger.info("updateByPrimaryKey success,the return value is: " + value ); 469 return (int) value; 470 } catch (Exception e) { 471 logger.error("updateByPrimaryKey faild," + e.getMessage() ); 472 } 473 return -1; 474 } 475 476 @Override 477 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 478 ctx = applicationContext; 479 } 480 481 }
2.使用,如图: