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());
} }
springboot+mybatis整合(单元测试,异常处理,日志管理,AOP)的更多相关文章
- SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...
- SpringBoot | 第二十三章:日志管理之整合篇
前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...
- SpringBoot+Mybatis整合入门(一)
SpringBoot+Mybatis 四步整合 第一步 添加依赖 springBoot+Mybatis相关依赖 <!--springBoot相关--> <parent> < ...
- Mybatis整合Spring实现事务管理的源码分析
一:前言 没有完整看完,但是看到了一些关键的地方,这里做个记录,过程会有点乱,以后逐渐补充最终归档为完整流程:相信看过框架源码的都知道过程中无法完全确定是怎样的流程,毕竟不可能全部都去测试一遍 ,但是 ...
- springboot(整合多数据源demo,aop,定时任务,异步方法调用,以及获取properties中自定义的变量值)
有这么一个需求 每个部门,需要操作的数据库不同,A部门要将数据放test数据库,B 部门数据 要放在test1数据库 同一个项目 需要整合 多个数据源 上传个demo 方便自己以后回看!!!!!!!! ...
- SpringBoot+Mybatis整合实例
前言 大家都知道springboot有几大特点:能创建独立的Spring应用程序:能嵌入Tomcat,无需部署WAR文件:简化Maven配置:自动配置Spring等等.这里整合mybatis,创建一个 ...
- 2、SpringBoot+Mybatis整合------一对一
开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis01/tree/93398da60c647573645917b2 ...
- springboot mybatis 整合
新建项目在上一篇. 第二步:创建表和相应的实体类 实体类:user.java package com.qtt.im.entity; import java.io.Serializable; publi ...
- springboot/Mybatis整合
正题 本项目使用的环境: 开发工具:Intellij IDEA 2017.1.3 springboot: 1.5.6 jdk:1.8.0_161 maven:3.3.9 额外功能 PageHelper ...
随机推荐
- MySQL InnoDB Engine--缓冲器数据交换
通常情况下,缓冲池无法将整个数据库所有数据都进行缓冲,而且不同数据的访问频率不一样,有些数据会被频繁访问,而有些数据可能数月不会被访问一次,因此数据库使用最近最少使用LRU latest Recent ...
- Writing and playing with custom Terraform Providers
转自:https://petersouter.xyz/writing-and-playing-with-custom-terraform-providers/ I’ve been digging de ...
- camunda 开源的bpm系统
看到camunda 是在zeebe 的介绍中,实际上camunda 是一个很完整的bpm 平台,包含了很多在bpm 系统中需要的组件,以下为一张参考图 从上图可以看出,组件还是比较多的,对于完整的bp ...
- 新鲜出炉一份Java面试清单,共200+道题
一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行jav ...
- 详解Linux查看实时网卡流量的几种方式(转)
转自https://www.jb51.net/article/112965.htm 假如Keepalived有10个VIP,怎么查看每个VIP的流量呢? 这里就可以使用sar命令查看网卡流量了.前提是 ...
- openstack--8--控制节点部署Dashboard
Horizon介绍 Dashboard服务,这里具体的产品就是Horizon1.它提供一个Web界面操作Openstack的系统2.使用Django框架基于Openstack API开发3.支持将Se ...
- egg 官方文档之:框架扩展(Application、Context、Request、Response、Helper的访问方式及扩展)
地址:https://eggjs.org/zh-cn/basics/extend.html Application app 对象指的是 Koa 的全局应用对象,全局只有一个,在应用启动时被创建. 访问 ...
- toString() 和 toLocaleString() 的区别
toString() 和 toLocaleString() 的区别 table th:nth-of-type(4) { width: 400px; } 区别项 toString() toLocaleS ...
- 逻辑回归(logic regression)的分类梯度下降
首先明白一个概念,什么是逻辑回归:所谓回归就是拟合,说明x是连续的:逻辑呢?就是True和False,也就是二分类:逻辑回归即使就是指对于二分类数据的拟合(划分). 那么什么是模型呢?模型其实就是函数 ...
- 打开RAD Studio XE5提示"displayNotification:内存不够"解决办法
操作方法: 在RAD Studio XE5快捷方式上鼠标右击选择属性,在弹出的快捷方式标签页中将目标(T):"C:\Program Files (x86)\Embarcadero\RAD S ...