Spring Boot 集成Mybatis和Druid快速入门

        MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架,它摒除了大部分的JDBC代码、手工设置参数和结果集重获,只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。

       Druid 是阿里巴巴开源的数据库连接池解决方案,因为有阿里巴巴背书,所以 Druid 是当今国内 Java 开发中非常流行的数据库连接池。本文介绍 Spring Boot 集成 Druid 和Mybatis框架的基础配置和应用,数据库采用MySQL。  

软件环境

  • MySql 8.0.11
  • java version 13.0.1
  • IntelliJ IDEA 2019.3.2 (Ultimate Edition)

Druid数据库连接池

      Druid是什么?它首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。

       整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员可以通过定制来实现自己需要的功能。

Druid在监控,可扩展,稳定性和高可用方面具有明显得优势,通过提供的监控功能可以观察数据库连接池和sql查询工作情况,使用druid连接池可以提高数据库的访问性能。

       Druid支持哪些数据库? Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池,若要支持Druid,需要自己配置。 

新建Spring Boot项目

       为了简单,项目名姑且命名为wiener。我们在此以Maven作为项目构建工具,来构建Spring Boot应用程序,创建步骤如下,比较简单:

  

 

  

 

        这里只勾选了Lombok插件。

 

        Content root根据需要选择即可。然后,点击Finish,接下来请等待项目初始化完成。这里先给出创建完成后的项目结构图,方便大家了解需要新增哪些文件。

 

              项目结构图

集成Mybatis和Druid

      在dependencies中引入相关依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.eg</groupId>
    <artifactId>wiener</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>wiener</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>13</java.version>
    </properties>

<dependencies>
<!--web核心依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.1.RELEASE</version>
            </plugin>
        </plugins>
    </build>
</project>

      spring-boot-maven-plugin是Spring Boot 的编译插件。 

配置application.properties信息

server.port=8087
# 配置应用的上下文路径
server.servlet.context-path=/wiener

# 配置当前要使用的数据源的操作类型那个
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#驱动类
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/my2020?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

#连接池的配置信息
# 初始化大小
spring.datasource.druid.initial-size=5
# 最小
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-idle=200
# 最大
spring.datasource.druid.max-active=100
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=10000
spring.datasource.druid.validationQuery=select 'x'

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.eg.wiener.dto

      以上属性配置在resources目录下的application.properties文件中。由于是快速入门篇,配置这些Mybatis和Druid属性即可。

Mybatis扩展属性配置

mybatis.config-location指定mybatis-config.xml的位置;

mybatis.check-config-location检查mybatis-config.xml是否存在;

mybatis.mapper-locations指定mapper的xml的位置;

mybatis.type-aliases-package指定别名的包,可以多个,逗号分隔;

它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。(value的值一定要是包的全名)

 

mybatis.type-handlers-package指定handler的扫描码路径;

mybatis.executor-type执行器类型: SIMPLE, REUSE, BATCH;

mybatis.configuration-propertiesMyBatis配置的外部化属性。指定的属性可以用作MyBatis配置文件和映射文件的占位符;

mybatis.configuration嵌套配置,具体子配置如下;

defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数;

defaultFetchSize为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖;

mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射;

autoMappingUnknownColumnBehavior指定发现自动映射目标未知列(或者未知属性类型)的行为;NONE:不做任何反应;WARNING:输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN);FAILING:映射失败 (抛出 SqlSessionException);

具体参考:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

  

定义DruidConfig和相关实现

package com.eg.wiener.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;

/**
 * https://www.cnblogs.com/feiyangbahu/p/9842363.html
 * <p>
 * SpringBoot配置MySql数据库和Druid连接池
 */
@Configuration
public class DruidConfig {
    @Bean
    public ServletRegistrationBean druidServlet() {// 主要实现web监控的配置处理
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*");//表示进行druid监控的配置处理操作
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1,129.168.1.11");//白名单
        servletRegistrationBean.addInitParameter("deny", "129.168.1.12");//黑名单
        servletRegistrationBean.addInitParameter("loginUsername", "root");//用户名
        servletRegistrationBean.addInitParameter("loginPassword", "root");//密码
        servletRegistrationBean.addInitParameter("resetEnable", "false");//是否可以重置数据源
        return servletRegistrationBean;
    }

    /**
     * 监控面板访问路径:
     * http://localhost:8087/wiener/druid/login.html
     *
     * @throws
     * @Title: druidServlet
     * @Description: 注册一个StatViewServlet 相当于在web.xml中声明了一个servlet
     * @param: void
     * @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();
    }
}

       应用的上下文路径(也称为项目路径),是构成url地址的一部分。Spring Boot默认只有一个Servlet,默认会映射到根路径/,配置上下文路径和端口号的方法是在application.properties文件中添加如下配置:

server.port=8087
# 配置应用的上下文路径,也可以称为项目路径,是构成url地址的一部分
server.servlet.context-path=/wiener

      访问Druid监控系统时,默认访问路径如下:

http://IP:PORT/projectName/druid/login.html

在未配置项目上下文路径时,其访问路径如下:

http://localhost:8087/druid/login.html

在配置应用上下文路径后,其访问路径如下:

http://localhost:8087/wiener/druid/login.html

package com.eg.wiener.dto;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author Wiener
 */
@Setter
@Getter
@ToString
public class User implements Serializable {

    private Long id;
    private String userName;
    private Integer age;
    private String address;
    private String mobilePhone;
}

      Dao层只提供一个接口,通过用户id查找用户信息;温馨提示,需要使用@ Repository注解,否则,Spring Boot无法扫描。

package com.eg.wiener.dao;

import com.eg.wiener.dto.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserDao {

    User getUserById(Long userId);

}

      Mapper文件:

<?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.eg.wiener.dao.UserDao">

    <resultMap id="BaseResultMap" type="com.eg.wiener.dto.User">
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="user_name" jdbcType="VARCHAR" property="userName"/>
        <result column="address" jdbcType="VARCHAR" property="address" />
        <result column="age" jdbcType="TIMESTAMP" property="age" />
        <result column="mobile_phone" jdbcType="TIMESTAMP" property="mobilePhone" />
    </resultMap>
    <sql id="Base_Column_List">
        id, mobile_phone,user_name,address,age
    </sql>

    <!--  通过ID获取用户信息-->
    <select id="getUserById" parameterType="Long" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from user
        <where>
            id = #{userId}
        </where>
    </select>
</mapper>

      新增接口类:

package com.eg.wiener.service;

import com.eg.wiener.dto.User;

public interface UserService {
    User getUserById(Long userId);
}

        编写接口实现类UserServiceImpl,并对其添加@Service注解,使得它能被Spring Boot扫描,在Controller中使用@Autowired注入。

package com.eg.wiener.service.impl;

import com.eg.wiener.dao.UserDao;
import com.eg.wiener.dto.User;
import com.eg.wiener.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private UserDao userDao;
    @Override
    public User getUserById(Long userId) {
        logger.info("--------*****-----------");
        return userDao.getUserById(userId);
    }
}
package com.eg.wiener.controller;

import com.eg.wiener.dto.User;
import com.eg.wiener.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Wiener
 */
@RestController
@RequestMapping("/user")
public class UserController {
    private static Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 示例地址 http://localhost:8087/wiener/user/getUserById?userId=1
     *
     * @author Wiener
     * @date 2020/6/25 11:27
     */
    @RequestMapping("/getUserById")
    public User getUserById(Long userId) {
        User user = userService.getUserById(userId);
        return user;
    }
}

 

启动类配置@MapperScan注解

package com.eg.wiener;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.eg.wiener.dao")
public class WienerApplication {

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

}

      在启动类中使用注解@MapperScan批量扫描所有的Mapper接口。

      启动项目并且登录监控系统后,在数据源页面可以看到数据库配置信息。当请求函数getUserById三次时,在Session监控页面可以看到请求次数对应的值为3。

  

总结

      以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作能带来一定的帮助,如有好的改进方式或者文中有任何错误,请留言交流。祝各位生活愉快! 

Reference

https://www.jianshu.com/p/e6c9e9945e45

https://zhidao.baidu.com/question/116778634.html

https://www.jianshu.com/p/9dc6f4418a06

https://www.jianshu.com/p/541874714907

 

posted @ 2020-06-27 21:15  楼兰胡杨  阅读(1097)  评论(0编辑  收藏  举报