太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

时间:2022-09-25 22:50:29

Spring boot 整合 Mybatis Druid并配置监控

添加依赖

<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
如果使用log4j需要添加log4j的依赖并且排除本身slf4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除本身日志-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

​ 附上log4j.properties的配置

# LOG4J rootCategory config
# 控制台输出
log4j.rootLogger=INFO, file, console
LocationInfo =true
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM HH:mm:ss} %5p %c{1}:%L - %m%n
# 日志文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=logs/springboot.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM HH:mm:ss} %5p %c{1}:%L - %m%n

2.提前创建一个controller,dao,service,用于查询数据库,测试

dao

import com.ljy.sys.entity.User;

import java.util.List;

public interface SysUserMapper {
List<User> findAll();
}

Mapper

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

service及其实现类

import com.ljy.sys.entity.User;

import java.util.List;

public interface SysUserService {
List<User> findAll();
}
import com.ljy.sys.dao.SysUserMapper;
import com.ljy.sys.entity.User;
import com.ljy.sys.model.SysUserService;
import org.springframework.stereotype.Service; import javax.annotation.Resource;
import java.util.List;
/**
* SysUserService实现类
* @author ljy&jcq
*/
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper sysUserMapper; @Override
public List<User> findAll() {
return sysUserMapper.findAll();
}
}

controller

import com.ljy.sys.model.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("user")
public class SysUserController {
@Autowired
private SysUserService sysUserService; @GetMapping("/findAll")
public Object findAll(){
return sysUserService.findAll();
}
}

编写Mybatis的配置类

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; /**
* mybatis 配置类
* @author ljy&jcq
* MapperScan 扫描dao
*
*/
@Configuration
@MapperScan("com.ljy.sys.**.dao")
public class MybatisConfig {
@Autowired
private DataSource dataSource; @Bean
public SqlSessionFactory sqlSessionFactory() throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//扫描service层
sqlSessionFactoryBean.setTypeAliasesPackage("com.ljy.sys.**.model");
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//扫描映射文件 Mapper文件所在的地址
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/templates/*.xml"));
return sqlSessionFactoryBean.getObject();
}
}

修改启动类

//表示在应用启动时自动扫描com.ljy.sys包下的内容,当然Spring Boot也会自动扫描启动类包及其子包,这里不设置也是可以自动扫描的
@SpringBootApplication(scanBasePackages = {"com.ljy.sys"})
public class SysApplication {
public static void main(String[] args) {
SpringApplication.run(SysApplication.class, args);
}
}

编写application.yml 配置druid的属性

spring:
datasource:
#数据库连接配置
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/salery?serverTimezone=GMT%2B8&characterEncoding=UTF-8
username: root
password: root
#连接池配置
initial-size: 5 # 初始化大小
min-idle: 5 # 最小
max-active: 100 # 最大
max-wait: 60000 # 连接超时时间
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis: 300000 # 指定一个空闲连接最少空闲多久后可被清除,单位是毫秒
validationQuery: selectversion()
test-while-idle: true # 当连接空闲时,是否执行连接测试
test-on-borrow: false # 当从连接池借用连接时,是否测试该连接
test-on-return: false # 在连接归还到连接池时是否测试该连接
filters: wall,stat,log4j # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,log4j使用哪种日志系统就添加哪种
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
maxOpenPreparedStatements: 20
connectionProperties: druid.stat.slowSqlMillis=200;druid.stat.logSlowSql=true

编写配置类

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /**
* druid的配置类
* @author jcq&ljy
*/
@Configuration
public class DruidConfig {
@Bean(name = "dataSource")
//这里使用的是自动注入spring.datasource下的各种属性,如需要自定义配置,可新建配置类使用
//自定义配置类类名上添加@ConfigurationProperties(prefix = "spring.datasource.druid")导入yml中设置的数据
//在本配置类上加入@EnableConfigurationProperties({自定义.class}) 导入自定义配置 在本方法中手动set注入 参考注释的方法
@ConfigurationProperties("spring.datasource")
@Primary
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
/**
* 手动set注入
* @Bean
* public DataSource druidDataSource() {
* DruidDataSource datasource = new DruidDataSource();;
* datasource.setUrl(properties.getUrl());
* datasource.setUsername(properties.getUsername());
* datasource.setPassword(properties.getPassword());
* datasource.setDriverClassName(properties.getDriverClassName());
* datasource.setInitialSize(properties.getInitialSize());
* datasource.setMinIdle(properties.getMinIdle());
* datasource.setMaxActive(properties.getMaxActive());
* datasource.setMaxWait(properties.getMaxWait());
* datasource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
* datasource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
* datasource.setValidationQuery(properties.getValidationQuery());
* datasource.setTestWhileIdle(properties.isTestWhileIdle());
* datasource.setTestOnBorrow(properties.isTestOnBorrow());
* datasource.setTestOnReturn(properties.isTestOnReturn());
* properties.setPoolPreparedStatements(properties.isPoolPreparedStatements());
* properties.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
* properties.setFilters(properties.getFilters());
* return datasource;
* }
*/ /**
* 配置Druid的监控,一个管理后台的Servlet
* @return
*/
@Bean
public ServletRegistrationBean druidServlet() {
//指定拦截器只拦截druid管理页面的请求
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// IP白名单,如果没有设置或为空,则表示允许所有访问.(不能写成*,不然会报错)
servletRegistrationBean.addInitParameter("allow", "");
// IP黑名单(共同存在时,deny优先于allow)
servletRegistrationBean.addInitParameter("deny", "192.168.1.19");
//控制台管理的用户名和密码
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
//是否能够重置数据 禁用HTML页面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
} /**
* 配置一个web监控的filter
* @return
*/
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
} }

登录http://localhost:8080/druid/login.html

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

输入配置类中设置的账号密码,就可以看到如下界面:

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

但是打开数据源显示如下:

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

不要担心,只需要向刚才的我们写好的controller发送一次请求即可,发送了请求后结果如下:

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

​ 尤其需要注意:

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

​ 如果这一行显示为空,需要检查监听器配置或日志系统是否和yml中的配置匹配。

​ 如果spring监控为空,是因为我们没有设置切面,我们需要设置切面

编写spring监控切面

import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.springframework.aop.Advisor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* spring监控配置切面
* @author jcq&ljy
*/
@Configuration
public class SpringDaoMethodAspect {
@Bean
public DruidStatInterceptor druidStatInterceptor(){
return new DruidStatInterceptor();
}
@Bean
public JdkRegexpMethodPointcut druidStatPointcut(){
JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();
String patterns = "com.ljy.*.*.service.*";
String patterns2 = "com.ljy.*.*.dao.*";
druidStatPointcut.setPatterns(patterns,patterns2);
return druidStatPointcut;
}
@Bean
public Advisor druidStatAdvisor() {
return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());
}
}

注:如果仍为空,先检查是否导入了aop的依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

最后附上成功截图

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

最后

大家看完有什么不懂的可以在评论区留言,觉得对你有帮助的话可以给我点个赞!

太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?的更多相关文章

  1. Spring Boot系列(三):Spring Boot整合Mybatis源码解析

    一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...

  2. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  3. spring boot 整合 mybatis 以及原理

    同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...

  4. Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题

    现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...

  5. Spring Boot整合Mybatis报错InstantiationException&colon; tk&period;mybatis&period;mapper&period;provider&period;base&period;BaseSelectProvider

    Spring Boot整合Mybatis时一直报错 后来发现原来主配置类上的MapperScan导错了包 由于我使用了通用Mapper,所以应该导入通用mapper这个包

  6. Spring Boot整合MyBatis&lpar;非注解版&rpar;

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  7. Spring Boot整合Mybatis完成级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  8. Spring Boot 整合 Mybatis 实现 Druid 多数据源详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...

  9. Spring Boot 整合MyBatis&lpar;1&rpar;

    这篇文章介绍如何在Spring boot中整合Mybatis,其中sql语句采用注解的方式插入.后续文章将会介绍,如何使用xml方式. SSM SSH框架已经满足轻量级这个需求了,但是对于开发人员而言 ...

随机推荐

  1. C&num; Lamada表达式

    Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托 ...

  2. 【迁移】—Entity Framework实例详解

    好久没有在博客园更新博客了,如今都换了新公司.前段时间写了关于EF迁移的文档,今天拿出来作为这个系列的一篇吧. 一.Entity Framework 迁移命令(get-help EntityFrame ...

  3. &lbrack;转&rsqb;Golang Gob编码

    Golang Gob编码 2012-08-24 09:47 by 轩脉刃, 5119 阅读, 1 评论, 收藏, 编辑 gob是Golang包自带的一个数据结构序列化的编码/解码工具.编码使用Enco ...

  4. windows phone版的一个儿教app

    昨天下午看见一个园友写的一篇关于儿教的api,看了也就两三个接口,所以数据处理应该不会太复杂,主要是界面的效果,要求可能比较高.于是我就重新自己写了一个app,实现很简单,花的时间比较多的地方应该是在 ...

  5. &lbrack;转&rsqb;Gridview中实现RadioButton单选效果

    HTML <asp:TemplateField ItemStyle-Width="22px"> <ItemTemplate> <asp:RadioBu ...

  6. android stuido 在线安装svn插件,添加版本库无响应

    问题:android stuido 中在线安装svn插件,添加版本库无响应. 原因: 由于android stuido 版本较高,在线安装1.6x 版本的svn,添加版本库一直没有响应,最后卡死.. ...

  7. h&period;264全搜索以及快速全搜索算法

    Full Search 全搜索算法是最简单暴力的一种搜索算法,对搜索范围内的所有像素点都进行匹配对比,选出最合适的运动向量,以下就是一个搜索范围为4的全搜索范围(单个像素点) /*! ******** ...

  8. HDU 1325,POJ 1308 Is It A Tree

    HDU认为1>2,3>2不是树,POJ认为是,而Virtual Judge上引用的是POJ数据这就是唯一的区别....(因为这个瞎折腾了半天) 此题因为是为了熟悉并查集而刷,其实想了下其实 ...

  9. unison&plus;inotify实现数据双向同步

    unison是一款跨windows/linux/MAC OS平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSH.RSH和Socket等网络协议进行同步.更棒的是,unison支持双向同步操作 ...

  10. 爬虫 -----爬取百度时事热点和url

    使用scrapy top.py    爬虫主要工作 pipelines.py    数据保存 main.py   执行脚本 items.py   初始化item