SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)

Posted Lotus_dong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)相关的知识,希望对你有一定的参考价值。

SpringBoot的使用

SpringBoot是用来简化Spring框架的,因此,不同于Spring的使用方式,SpringBoot有自己的一套使用方式。

SpringBoot注解

@SpringBootApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}

}

这个注解是SpringBoot的启动类拥有的,也是SpringBoot最核心的注解,标识这是一个SpringBoot应用,用来开启SpringBoot的各项功能。事实上这个注解是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解的组合。由于三个注解一般都是一起使用,所以SpringBoot提供了这样一个统一注解。

package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

上面的代码是进入@SpringBootApplication注解看到的底层源码。

@SpringBootConfiguration

这是SpringBoot中一个类级别的注释,指示此类提供了应用程序级别的配置,通常,具有main()方法的类最适合此注释。@SpringBootApplication会自动继承这个注解

@EnableAutoConfiguration

允许SpringBoot自动配置注解,开启这个注解之后,SpringBoot就能根据当前类路径下的包或者类来配置SpringBean。比如,当前类路径下有MyBatis这个jar包,MybatisAutoConfiguration注解就能根据相关参数来参数来配置MyBatis的各个SpringBean。

@ComponentScan

组件扫描注解,让SpringBoot扫描到@Configuration类并把它加入到程序上下文。@ComponentScan注解默认会装配标识了@Controller、@Service、@Respository、@Component注解的类到Spring容器中。

@Configuration

用于定义配置类,指出该类是Bean配置的信息源,相当于传统的xml配置文件,一般加在主类上。如果有些第三方库需要用xml文件,一般仍然通过@Configuration类作为项目的主类。

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 com.alibaba.druid.pool.DruidDataSource;

//配置德鲁伊数据源
@Configuration
public class DruidDataSourceConfig {

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource druid() {
		return new DruidDataSource();
	}
}

@Bean

相当于Xml中的< bean>< /bean>,放在方法上面,意思是方法会返回一个bean,并交给Spring管理。

@ConfigurationProperties

可以将配置文件中的Person属性赋的值映射到该组件中。

需要先导入相关jar

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

我们在application配置文件中加入一个新的属性

user1:
  name: jim
  age: 18

新建一个实体类,并使用标签进行注入

package com.cwd.SpringBootDemo.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "user1")
public class User {

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\\'' +
                ", age=" + age +
                '}';
    }
}

测试结果

在这里插入图片描述

SpringBoot集成JDBC

在我们访问数据库的时候,总是需要先配置一个数据源,数据源是对数据库以及对数据库交互操作的抽象,它封装了目标源的位置信息,验证信息和建立与关闭连接的操作。数据源可以看做程序中一个组件,它把传统中需要在代码里编写配置信息和获取连接等操作抽象出一个规范或者接口。我们以mysql数据库为例:

1.引入MySQL的相关驱动包,在pom.xml文件中。

<!-- mysql-connector-java mysql驱动包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

2.在pom.xml文件中引入JDBC支持连接数据库

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

3.在application中配置数据源datasource,没有配置其它的数据库源管理,会自动使用JDBC自带的数据库源进行管理,即使用JdbcTemplate操作数据库,这里已经将其交给了Spring进行统一管理,直接使用@Autowired进行注入就可以在类中使用。

#spring配置
#配置数据库,配置数据库源默认使用JDBC自带的数据库源管理
spring:
  datasource:
    #数据库地址
    url: jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    #数据库用户名
    username: root
    #数据库密码
    password: root
    #数据库加载类
    driver-class-name: com.mysql.cj.jdbc.Driver

4.使用案例

@Service
@Transactional
public class HelloService {
    @Autowired
    JdbcTemplate jdbcTemplate;

    public User findUserById(Integer id) {
        User user = new User();
        jdbcTemplate.query("select name,age from t_user where  id = ?",
                new Object[]{id}, new RowCallbackHandler() {
                    public void processRow(ResultSet rs) throws SQLException {
                        user.setName(rs.getString("name"));
                        user.setAge(rs.getInt("age"));
                    }
                });
        return user;
    }
}

集成druid(德鲁伊)数据源

当我们使用其它更好的数据源管理时,就不会再使用JDBC自带的数据源管理了。

1.导入druid数据源的jar

#spring配置
#配置数据库,配置数据库源默认使用JDBC自带的数据库源管理
spring:
  datasource:
    #数据库地址
    url: jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    #数据库用户名
    username: root
    #数据库密码
    password: root
    #数据库加载类
    driver-class-name: com.mysql.cj.jdbc.Driver
    #注册druid数据库链接池
    type: com.alibaba.druid.pool.DruidDataSource
    #初始化时建立物理连接的个数
    initialSize: 5
    #最小连接池个数
    minIdle: 1
    #最大连接池数量
    maxActive: 20
    #开启Sql监控
    filters: stat

2.将Druid数据源托管给DataSource,我们需要使用java代码来完成这个过程,相当于我们之前在xml文件中的这个操作

<!--配置DruidDataSource交给spring容器管理,spring管理数据库链接(数据源)-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"></property>
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
    <property name="username" value="root"></property>
    <property name="password" value="root"></property>
</bean>
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 com.alibaba.druid.pool.DruidDataSource;

//配置德鲁伊数据源
@Configuration
public class DruidDataSourceConfig {

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource druid() {
		return new DruidDataSource();
	}
}

Sql监控

使用Sql监控需要在DruidDataSourceConfig类中,即配置druid数据源的类中写入如下代码:

import com.alibaba.druid.pool.DruidDataSource;
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 javax.sql.DataSource;


@Configuration
public class DruidDataSourceConfig {

	@Bean
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource druid() {
		return new DruidDataSource();
	}

	@Bean
	public ServletRegistrationBean druidStatViewServlet() {
		//ServletRegistrationBean提供类的进行注册
		ServletRegistrationBean servletRegistrationBean =
				new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
		//添加初始化参数:initParams
		//白名单:
		servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
		//IP黑名单(同时存在时,deny优先于allow)
		//如果满足deny,就提示:sorry,you are not permitted to view this page
		servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
		//登录查看信息的账号和密码
		servletRegistrationBean.addInitParameter("loginUsername", "admin");
		servletRegistrationBean.addInitParameter("loginPassword", "123456");
		servletRegistrationBean.addInitParameter("resetEnable", "false");
		return servletRegistrationBean;
	}


	@Bean
	public FilterRegistrationBean druidStatFilter() {
		FilterRegistrationBean filterRegistrationBean =
				new FilterRegistrationBean(new WebStatFilter());
		//添加过滤规则
		filterRegistrationBean.addUrlPatterns("/*");
		//添加需要忽略的格式信息
		filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif," +
				"*.jpg,*.png, *.css,*.ico,/druid/*");
		return filterRegistrationBean;

	}
	 
}

如果我们在创建工程时没有选择集成web,我们还需要在pom.xml文件中进行引入

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

当我们完成这些操作操作之后我们就可以进入

http://localhost:端口号/druid/login.html

输入我们在类中的配置的账号(admin)和密码(123456)登录,查看网页中操作数据库的sql记录。

在这里插入图片描述

以上是关于SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)的主要内容,如果未能解决你的问题,请参考以下文章

助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoo

手把手教你用VUE开发后台管理系统:搭建SpringBoo 2.xt环境

Swagger2 常用使用 及 SpringBoo 整合 Swagger2

springBoot学习笔记初识springBoot

SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)

SpringBoot使用·上篇(SpringBoot注解+集成JDBC+集成druid(德鲁伊)+sql监控)