静态方法中mapper的调用

1.场景还原

   在开发的过程中,有很多想在静态方法中调用mapper的同学,但是实例化的mapper又不能在静态方法中引用,至此可能会放弃这个想法,今天笔者带着大家如何在静态方法中调用mapper;

2.实现方案

①全局上下文工具类配置

@Slf4j
public class ApplicationContextUtil {

    private static ApplicationContext applicationContext;

    public static void setApplicationContext(ApplicationContext ac)
            throws BeansException {
        applicationContext = ac;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 根据Class类型在IOC容器中获取对象
     * @param clazz Class类型
     * @return 对象
     */
    public static <T> List<T> getBeanByType(Class<T> clazz) {
        List<T> list = new ArrayList<T>();

        /* 获取接口的所有实例名 */
        String[] beanNames = applicationContext.getBeanNamesForType(clazz);

        log.debug("getBeanByType beanNames : " + beanNames == null ? "" : Arrays.toString(beanNames));

        if (beanNames == null || beanNames.length == 0) {
            return list;
        }

        T t = null;
        for (String beanName : beanNames) {
            t = (T)applicationContext.getBean(beanName);
            list.add(t);
        }

        return list;
    }

}

②在工程启动类中加入全局上下文

@SpringBootApplication
@ComponentScan("com.yivi")
@MapperScan("com.yivi.yivisender.dispatchfsm.dao")
@EnableTransactionManagement
@EnableCaching
public class DispatchfsmApplication {

   public static void main(String[] args) {


      ApplicationContext app = SpringApplication.run(DispatchfsmApplication.class, args);

      ApplicationContextUtil.setApplicationContext(app);
   }
}

③笔者以系统日志工具类为例

/**
 * 插入系统日志
 */
public static void insertStatusLog(String dispatchId ,Integer from, Integer to, Integer event){
    YiViDispatchOrderStatusLog log = new YiViDispatchOrderStatusLog();
    log.setDispatchId(dispatchId);
    log.setDispatchFormerOrderStatus((long) from);
    log.setDispatchLastOrderStatus((long) to);
    log.setDispatchLogEvent((long) event);
    getApplicationContext().getBean(DispatchFsmService.class).insertStatusLog(log);
}

④日志插入的实现类

@Service
@Slf4j
public class DispatchFsmService {


    @Autowired
    private YiViDispatchOrderStatusLogMapper yiViDispatchOrderStatusLogMapper;

    //插入日志
    public int insertStatusLog(YiViDispatchOrderStatusLog context){
        return yiViDispatchOrderStatusLogMapper.insert(context);
    }

}

3.测试用例

测试日志controller

@RestController
@Slf4j
@RequestMapping("/v1.0/dispatch/fsm")
public class DispatchFsmController {

    @GetMapping(value = "/log")
    public String testLog(){

         insertStatusLog("23546466",1,2,3);

        return "插入日志";
    }

}

校对数据库日志记录


好了,我是张星,欢迎加入博主技术交流群,群号:526601468

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/81028325
今日推荐