• springboot+mybatis整合(单元测试,异常处理,日志管理,AOP)


    我用的事IDEA,jdk版本是1.7.新建项目的时候这个地方的选择需要注意一下,springboot版本是1.5的,否则不支持1.7的jdk

    pom.xml

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- 数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.20</version>
            </dependency>

    ======================异常处理

    ExceptionHandler.java

    package com.springbootmybatis.demo.exceptiion;
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 异常处理类
     */
    @ControllerAdvice
    public class ExceptionHandle {
        private  final static Logger logger= LoggerFactory.getLogger(ExceptionHandle.class);
        /**
         * 处理返回的Exception类型的异常
         * @param e
         * @return
         */
        @ResponseBody
        @ExceptionHandler(value = Exception.class)
        public Map<String,Object> handler(Exception e){
            Map<String,Object> map=new HashMap<String, Object>();
            if(e instanceof MyException){//自定义异常
                MyException me=(MyException)e;
                map.put("status",me.getStatus());
                map.put("msg",e.getMessage());
            }else{
                //logger.error("系统异常:{}",e);
                map.put("status",2);
                map.put("msg","程序异常");
            }
            return map;
        }
    }

    MyException.java

    package com.springbootmybatis.demo.exceptiion;
    
    public class MyException extends RuntimeException {
        private Integer status;
        public MyException(Integer status,String message) {
            super(message);
            this.status=status;
        }
    
        public Integer getStatus() {
            return status;
        }
    
        public void setStatus(Integer status) {
            this.status = status;
        }
    }

    ================AOP

    HttpAspect.java

    package com.springbootmybatis.demo.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * Aop基本示例
     */
    @Aspect
    @Component
    public class HttpAspect {
        private  final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
    
    
        /**
         * 方法执行之前,拦截单个方法
         */
        @Before("execution(public * com.springbootmybatis.demo.controller.TestBootController.getUser(..))")
        public void  aopOneBeforeMethod(JoinPoint joinpoint){
            ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request=attributes.getRequest();
            //url
            logger.info("url={}",request.getRequestURL());
            //method
            logger.info("method={}",request.getMethod());
            //ip
            logger.info("ip={}", request.getRemoteAddr());
            //类方法
            logger.info("class_method={}",joinpoint.getSignature().getDeclaringTypeName()+"."+joinpoint.getSignature().getName());
            //参数
            logger.info("args={}",joinpoint.getArgs());
            System.out.println("请求了getUser方法-->前");
        }
        /**
         * 方法执行之前,拦截所有的方法
         */
        @Before("execution(public * com.springbootmybatis.demo.controller.TestBootController.*(..))")
        public void  aopAllBeforeMethod(){
            System.out.println("执行了所有的方法拦截-->前");
        }
    
        /**
         * 方法执行之后,拦截单个方法
         */
        @After("execution(public * com.springbootmybatis.demo.controller.TestBootController.getUser(..))")
        public void  aopOneAfterMethod(){
            System.out.println("请求了getUser方法-->后");
        }
        /**
         * 方法执行之前,拦截所有的方法
         */
        @After("execution(public * com.springbootmybatis.demo.controller.TestBootController.*(..))")
        public void  aopAllAfterMethod(){
            System.out.println("执行了所有的方法拦截-->后");
        }
    
    }

    HttpAspectNoRepeat.java

    package com.springbootmybatis.demo.aspect;
    
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    /**
     * Aop基本示例,去除重复的拦截配置
     */
    @Aspect
    @Component
    public class HttpAspectNoRepeat {
    
        private  final static Logger logger= LoggerFactory.getLogger(HttpAspectNoRepeat.class);
    
        @Pointcut("execution(public * com.springbootmybatis.demo.controller.TestBootController.getUser(..))")
        public void aopOne(){
    
        }
        @Pointcut("execution(public * com.springbootmybatis.demo.controller.TestBootController.*(..))")
        public void aopAll(){
    
        }
        /**
         * 方法执行之前,拦截单个方法
         */
        @Before("aopOne()")
        public void  aopOneBeforeMethod(){
            logger.info("去除重复配置后的单个方法拦截-->前-->logger");
        }
        /**
         * 方法执行之前,拦截所有的方法
         */
        @Before("aopAll()")
        public void  aopAllBeforeMethod(){
            System.out.println("去除重复配置后的所有方法拦截-->前");
        }
    
        /**
         * 方法执行之后,拦截单个方法
         */
        @After("aopOne()")
        public void  aopOneAfterMethod(){
            System.out.println("去除重复配置后的单个方法拦截-->后");
        }
        /**
         * 方法执行之前,拦截所有的方法
         */
        @After("aopAll()")
        public void  aopAllAfterMethod(){
            System.out.println("去除重复配置后的所有方法拦截-->后");
        }
    
        @AfterReturning(returning = "object",pointcut = "aopOne()")
        public void getReturnFromMethod(Object object){
            logger.info("返回值:{}",object);
        }
    }

    TestBootController.java

    package com.springbootmybatis.demo.controller;
    
    import com.springbootmybatis.demo.entity.Gys;
    import com.springbootmybatis.demo.exceptiion.MyException;
    import com.springbootmybatis.demo.service.GysServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @RestController
    @RequestMapping("/testboot")
    public class TestBootController {
    
        @RequestMapping("/getgys")
        public Gys getUser() {
            Gys user = new Gys();
            user.setRoleName("test");
            return user;
        }
    
        @Autowired
        private GysServiceImpl gysService;
        @RequestMapping("/getlist")
        public List<Gys> getlist() {
            List<Gys> list=null;
           try {
            list=gysService.getGysList();
           }catch (Exception e){
               e.printStackTrace();
           }
            return list;
        }
    
    
        @ResponseBody
        @RequestMapping("/testException")
        public Map<String,Object> testException() throws Exception {
            boolean a=false;
            if(a){
                return new HashMap<String, Object>();
            }else{
                int c=0;
                int v=5/c;
                return null;
                //throw new  Exception("测试一个异常");
            }
        }
        @ResponseBody
        @RequestMapping("/testMyException")
        public Map<String,Object> testMyException() throws Exception {
            boolean a=false;
            if(a){
                return new HashMap<String, Object>();
            }else{
                throw new MyException(3,"测试一个自定义异常");
            }
        }
    }

    ITestDao.java

    package com.springbootmybatis.demo.dao;
    
    import com.springbootmybatis.demo.entity.Gys;
    
    import java.util.List;
    
    public interface IGysDao {
        List<Gys> getUserList() throws  Exception;
    }

    GysServiceImpl.java

    package com.springbootmybatis.demo.service;
    
    import com.springbootmybatis.demo.dao.IGysDao;
    import com.springbootmybatis.demo.entity.Gys;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Service("gysService")
    public class GysServiceImpl {
        @Autowired
        private IGysDao iGysDao;
    
        public List<Gys> getGysList() throws  Exception{
            return  iGysDao.getUserList();
        }
    }

    DemoApplication.java

    package com.springbootmybatis.demo;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    @MapperScan("com.springbootmybatis.demo.dao")
    public class DemoApplication extends SpringBootServletInitializer{
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }

    Gys.java

    package com.springbootmybatis.demo.entity;
    
    public class Gys {
        private String roleName;
    
        public String getRoleName() {
            return roleName;
        }
    
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    }

    Gys.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.springbootmybatis.demo.dao.IGysDao">
        <select id="getUserList" resultType="com.springbootmybatis.demo.entity.Gys">
            SELECT  * FROM  gys;
        </select>
    </mapper>

    application-dev.yml

    mybatis:
      mapper-locations: classpath:mapper/*.xml
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springmvc-mybatis
        username: root
        password: gys
        type: com.alibaba.druid.pool.DruidDataSource
    server:
      port: 8082
    logging:
      level: debug

    application.yml

    spring:
      profiles:
        active: dev

     ===============单元测试(可以在需要测试的界面右击==>go to==>test...)

    测试service

    package com.springbootmybatis.demo;
    
    import com.springbootmybatis.demo.entity.Gys;
    import com.springbootmybatis.demo.service.GysServiceImpl;
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    
    
    /**
     * 测试service
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TestGysService {
    
        @Autowired
        private GysServiceImpl gysService;
    
        @Test
        public  void getGysList() throws  Exception{
            List<Gys> list=gysService.getGysList();
            Assert.assertEquals(2,list.size());
        }
    }

    测试controller

    package com.springbootmybatis.demo.controller;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    
    import static org.junit.Assert.*;
    
    /**
     * 测试controller
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class TestBootControllerTest {
    
        @Autowired
        private MockMvc mvc;
    
        @Test
        public void getUser() throws Exception {
            mvc.perform(MockMvcRequestBuilders.get("/getgys"))
                    .andExpect(MockMvcResultMatchers.status().isOk());
        }
    
    }
  • 相关阅读:
    udp用户数据报协议
    java调用url
    mybatis中的#和$的区别
    sun.misc.BASE64Encoder图片编码,并在页面显示
    oracle查看列数据类型
    MyBatis传入多个参数的问题
    ajax详解
    Comparable和Comparator的区别
    谈谈hashcode和equals的用法
    从为什么String=String谈到StringBuilder和StringBuffer
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/8809872.html
Copyright © 2020-2023  润新知