springboot系列七:springboot 集成 MyBatis、事物配置及使用、druid 数据源、druid 监控使用

一、MyBatis和druid简介

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。国内最近流行的还有MyBatis-Plus,对Mybatis进行了增强,单表的增删改查可以省略xml文件,本文不作MyBatis-Plus使用介绍。

  Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQLParser。Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQLServer、H2等等。 

  Druid针对Oracle和MySql做了特别优化,比如Oracle的PSCache内存占用优化,MySql的ping检测优化。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。

二、准备数据库

DROP DATBASE IF EXISTS test ;
CREATE DATBASE test CHARACTER SET UTF8 ;
CREATE TABLE user (
    uid        BIGINT      AUTO_INCREMENT ,
    `name`     VARCHAR(50) not NULL,
    age        TINYINT not NULL,
    PRIMARY KEY(uid)
) ;
INSERT INTO user(`name`,age) VALUES ('小明',23) ;
INSERT INTO user(`name`,age) VALUES ('小李',25) ;
INSERT INTO user(`name`,age) VALUES ('小伟',26) ;

三、配置druid

1、添加依赖,修改pom.xml

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.0.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.5</version>
</dependency>

2、配置yml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource    # 配置当前要使用的数据源的操作类型
    driver-class-name: org.gjt.mm.mysql.Driver     # 配置MySQL的驱动程序类
    url: jdbc:mysql://47.52.199.52:3306/test?useUnicode=true&amp;characterEncoding=utf8# 数据库连接地址  
username: test # 数据库用户名
password: Zhuxing520@ # 数据库连接密码
    filer: wall,stat
    dbcp2:                                          # 进行数据库连接池的配置
      min-idle: 5                                   # 数据库连接池的最小维持连接数
      initial-size: 5                               # 初始化提供的连接数
      max-total: 5                                  # 最大的连接数
      max-wait-millis: 200                          # 等待连接获取的最大超时时间

3、测试类

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class DemoApplicationTests {
@Resource
private DataSource dataSource;

@Test
public void testConnection() throws Exception {
System.out.println(this.dataSource);
}
}

四、配置Mybatis

1、添加mybatis依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

 2、配置yml

mybatis:
  config-location: classpath:mapper/mybatis.cfg.xml    # mybatis配置文件所在路径
  type-aliases-package: com.example.demo.po            # 定义所有实体类的别名所在包
  mapper-locations:  classpath:mapper/*Mapper.xml      # 所有的mapper映射文件

3、Mybatis配置文件

mybatis.cfg.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 进行Mybatis的相应的环境的属性定义 -->
    <settings>    <!-- 在本项目之中开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

4、UserMapper.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.example.demo.dao.UserDao">
    <select id="findAll" resultType="UserPO">
        SELECT * FROM user;
    </select>
</mapper>

5、实体类UserPO.java

package com.example.demo.po;

public class UserPO {
    private Long uid;
    private String name;
    private Integer age;

    public Long getUid() {
        return uid;
    }

    public void setUid(Long uid) {
        this.uid = uid;
    }

    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 "UserPO{" +
                "uid=" + uid +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code

6、mapp对应的接口Dao文件

package com.example.demo.dao;

import com.example.demo.po.UserPO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
@Mapper
public interface UserDao {
    public List<UserPO> findAll() ;
}
View Code

7、测试类

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class DemoApplicationTests {
    @Resource
    private UserDao userDao;

    @Test
    public void getAllUser(){
        System.out.println(userDao.findAll());
    }
}

五、mybatis配置sql日志

1、引入依赖

在项目之中去引入 logback 的依赖程序文件:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
</dependency>

2、添加配置文件

将 logback.xml 配置文件拷贝到 src/main/resources 目录之中

<?xml version="1.0" encoding="UTF-8" ?>

<configuration scan="true">
    <property name="APP" value="${project.artifactId}" />
    <property name="LOG_HOME" value="/data/www/log/${APP}" />
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
        </encoder>
    </appender>
    <appender name="DETAIL"
              class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
        <File>${LOG_HOME}/${APP}_detail.log</File>
        <encoder>
            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${APP}_detail.log.%d{yyyyMMdd}</fileNamePattern>
        </rollingPolicy>
    </appender>
    <appender name="ACCESS"
              class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
        <File>${LOG_HOME}/${APP}_access.log</File>
        <encoder>
            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS};%X{ServiceId};%m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${APP}_access.log.%d{yyyyMMdd}</fileNamePattern>
        </rollingPolicy>
    </appender>

    <logger name="ACCESS">
        <appender-ref ref="ACCESS" />
    </logger>

    <logger name="druid.sql.Statement" level="DEBUG" />
    <logger name="com.example.demo.dao" level="TRACE" />

    <root level="INFO">
        <appender-ref ref="DETAIL" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

添加sql打印:

<logger name="druid.sql.Statement" level="DEBUG" />
<logger name="com.example.demo.dao" level="TRACE" />

六、事务配置及用法

在需要的配置事务的方法上配置@Transactional

@Transactional
public void addUser(){
    UserPO userPO1 = new UserPO();
    userPO1.setName("王小飞");
    userPO1.setAge(24);
    userDao.save(userPO1);
    
    UserPO userPO2 = new UserPO();
    userPO1.setName("王小飞1");
    userPO1.setAge(24);
    userDao.save(userPO1);
    addUser1();
}

七、druid 监控

druid 数据库连接池之所以使用非常广泛,其最主要的原因在于它可以直接提供性能监控。那么本次来针对于当前已经实现好 的 druid 配置来进行性能监控的处理配置。

如果要想进行 Druid 的性能的监控操作,则需要做一些基础配置,例如:你访问的 IP 地址是否是白名单。

1、基础配置类DruidConfig.java

package com.example.demo.config;
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 DruidConfig {
    @Bean
    public ServletRegistrationBean druidServlet() { // 主要实现WEB监控的配置处理
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*"); // 现在要进行druid监控的配置处理操作
        servletRegistrationBean.addInitParameter("allow",
                "127.0.0.1,192.168.1.159"); // 白名单
        servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名单
        servletRegistrationBean.addInitParameter("loginUsername", "admin"); // 用户名
        servletRegistrationBean.addInitParameter("loginPassword", "123456"); // 密码
        servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否可以重置数据源
        return servletRegistrationBean ;
    }
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*"); // 所有请求进行监控处理
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
        return filterRegistrationBean ;
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}

2、运行测试

访问http://localhost:8080/druid,使用admin,123456账号密码登陆

 

posted on 2018-12-24 17:26  小人物的奋斗  阅读(1227)  评论(0编辑  收藏  举报

导航